Config组件使用
什么是Config
config(配置)又称为 统一配置中心顾名思义,就是将配置统一管理,配置统一管理的好处是在日后大规模集群部署服务应用时相同的服务配置一致,日后再修改配置只需要统一修改全部同步,不需要一个一个服务手动维护。
1.统一配置中心组件流程图
Config Server 开发
1.引入依赖
<!--引入统一配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
2.开启统一配置中心服务
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class Configserver7878Application {
public static void main(String[] args) {
SpringApplication.run(Configserver7878Application.class, args);
}
}
3.远程git仓库
4.复制仓库地址
5.yaml配置
# 注释版本
server:
port: 18085 # 端口号
spring:
application:
name: config-server # 应用名
cloud:
config:
server:
git:
# 配置gitee的仓库地址
uri: https://gitee.com/zzhwk/springcloudconfig.git
eureka:
client:
service-url:
# 注册Eureka Server集群
defaultZone: http://127.0.0.1:8761/eureka
logging:
level:
com: debug
注意:上述spring.cloud.config.server.git.uri是在码云创建的仓库地址
6.测试
启动config-server
,访问<http://localhost:18085/user-provider-dev.yml>
,效果如下:
可以查看到码云上的文件数据,并且可以在gitee上修改user-dev.yml,然后刷新上述测试地址也能及时更新数据
服务去获取配置中心配置
假设以user-provider服务为例,让它去git上获取配置信息1、添加依赖
<!--spring cloud 配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2、修改配置
- 删除user-provider工程的application.yml文件
- 创建user-provider工程bootstrap.yml配置文件,配置内容如下
# 注释版本
spring:
cloud:
config:
name: user-provider # 与远程仓库中的配置文件的application保持一致,{application}-{profile}.yml
profile: dev # 远程仓库中的配置文件的profile保持一致
label: master # 远程仓库中的版本保持一致
discovery:
enabled: true # 使用配置中心
service-id: config-server # 配置中心服务id
#向Eureka服务中心集群注册服务
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7001/eureka
关于application.yml和bootstrap.yml文件的说明:
- bootstrap.yml文件是SpringBoot的默认配置文件,而且其加载时间相比于application.yml更早。
- bootstrap.yml和application.yml都是默认配置文件,但定位不同
- bootstrap.yml可以理解成系统级别的一些参数配置,一般不会变动
- application.yml用来定义应用级别的参数
- 搭配spring-cloud-config使用application.yml的配置可以动态替换。
- bootstrap.yml相当于项目启动的引导文件,内容相对固定
- application.yml文件是微服务的常规配置参数,变化比较频繁
启动测试:
启动服务中心、配置中心、用户中心user_service
如果启动没报错,其实已经使用上配置中心内容了
可以在服务中心查看也可以检验user_service的服务
配置中心存在的问题
1、修改码云配置文件
修改在码云上的user-provider-dev.yml文件,添加一个属性test.message,如下操作:2、读取配置文件数据
在user-provider
工程中创建一个com.itheima.controller.LoadConfigController
读取配置文件信息,代码如下:
@RestController
@RequestMapping(value = "/config")
public class LoadConfigController {
@Value("${test.message}")
private String msg;
/***
* 响应配置文件中的数据
* @return
*/
@RequestMapping(value = "/load")
public String load(){
return msg;
}
}
启动运行user-provider
,访问<http://localhost:18081/config/load>
修改码云上的配置后,发现项目中的数据仍然没有变化,只有项目重启后才会变化。
小结
- 配置中心的作用:将各个微服务的配置文件集中到一起进行统一管理。
- 能搭建配置中心
需要在application.yml配置文件中指定需要远程更新的仓库地址。
- 修改微服务,从配置中心获取修改的配置
创建bootstrap.yml,并在bootstrap.yml中配置
# 注释版本
spring:
cloud:
config:
name: user-provider # 与远程仓库中的配置文件的application保持一致,{application}-{profile}.yml
profile: dev # 远程仓库中的配置文件的profile保持一致
label: master # 远程仓库中的版本保持一致
discovery:
enabled: true # 使用配置中心
service-id: config-server # 配置中心服务id
#向Eureka服务中心集群注册服务
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7001/eureka
消息总线 Spring Cloud Bus
SpringCloud Bus,解决上述问题,实现配置自动更新。
注意:SpringCloudBus基于RabbitMQ实现,默认使用本地的消息队列服务,所以需要提前安装并启动RabbitMQ。
Bus简介
Bus是用轻量的消息代理将分布式的节点连接起来,可以用于广播配置文件的更改或者服务的监控管理。
Bus可以为微服务做监控,也可以实现应用程序之间互相通信。Bus可选的消息代理RabbitMQ和Kafka。
广播出去的配置文件服务会进行本地缓存。
整合案例
目标:消息总线整合入微服务系统,实现配置中心的配置自动更新。不需要重启微服务。
改造配置中心
- 在config-server项目中加入Bus相关依赖
<!--消息总线依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<!--RabbitMQ依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
- 修改application.yml,加入RabbitMQ的配置信息,和暴露触发消息总线地址
修改config-server
的application.yml,如下配置的rabbit都是默认值,其实可以完全不配置,代码如下:
上图配置如下:
# 注释版本
server:
port: 18085 # 端口号
spring:
application:
name: config-server # 应用名
cloud:
config:
server:
git:
# 配置gitee的仓库地址
uri: https://gitee.com/zzhwk/springcloudconfig.git
# rabbitmq的配置信息;如下配置的rabbit都是默认值,其实可以完全不配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
# 暴露触发消息总线的地址
management:
endpoints:
web:
exposure:
# 暴露触发消息总线的地址
include: bus-refresh
# Eureka服务中心配置
eureka:
client:
service-url:
# 注册Eureka Server集群
defaultZone: http://127.0.0.1:7001/eureka
# com.itheima 包下的日志级别都为Debug
logging:
level:
com: debug
改造用户服务
1. 在用户微服务user_service项目中加入Bus相关依赖
<!--消息总线依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<!--RabbitMQ依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<!--健康监控依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2. 修改user_service项目的bootstrap.yml,加入RabbitMQ的配置信息
# 注释版本
spring:
cloud:
config:
name: user-provider # 与远程仓库中的配置文件的application保持一致,{application}-{profile}.yml
profile: dev # 远程仓库中的配置文件的profile保持一致
label: master # 远程仓库中的版本保持一致
discovery:
enabled: true # 使用配置中心
service-id: config-server # 配置中心服务id
# rabbitmq的配置信息;如下配置的rabbit都是默认值,其实可以完全不配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#向Eureka服务中心集群注册服务
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7001/eureka
3. UserController类上加入@RefreshScope刷新配置注解
修改user-provider
的com.itheima.controller.LoadConfigController
,添加一个@RefreshScope
注解刷新配置信息,代码如下:
@RefreshScope:用于启用刷新配置文件的信息。
4. 测试
目标:当我们修改Git仓库的配置文件,用户微服务是否能够在不重启的情况下自动更新配置文件信息。
测试步骤:
(1)启动eureka-server
(2)启动config-server
(3)启动user-provider
(4)访问测试
访问<http://localhost:18081/config/load>
,效果如下:
(5)修改码云配置
修改码云的配置,修改后并提交,修改如下:
6)刷新配置
使用Postman以POST方式请求http://localhost:18085/actuator/bus-refresh
请求地址中actuator是固定的,bus-refresh对应的是配置中心的config-server中的application.yml文件的配置项include的内容
(7)刷新测试
访问<http://localhost:18081/config/load>
消息总线实现消息分发过程:
- 请求地址访问配置中心的消息总线
- 消息总线接收到请求
- 消息总线向消息队列发送消息
- user-service微服务会监听消息队列
- user-service微服务接到消息队列中消息后
- user-service微服务会重新从配置中心获取最新配置信息
小结
1、配置中心config作用?
帮助我们统一管理微服务配置,可以一处修改处处生效2、消息总线Bus作用?
配置中心无法实现配置自动更新,当我们的git上配置发生更改,我们的微服务需要重启,才能拉取到最新配置。消息总线BUS帮助我们实现配置的自动刷新,不需要重启微服务,需要在对应的controller上加一个@RefreshScope注解即可