七. SpringCloud服务配置 (2)

所以现在,服务配置中心从远端Git仓库读取配置文件这一部分已经搭建完成:

image-20210304111342933

3. Config 客户端配置与测试 3.1 建Moudle

新建Module:cloud-config-client-3355作为访问配置中心的客户端

在其POM文件中引入Config配置中心客户端的启动类:

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> 3.2 编写配置文件bootstrap.yml

application.yml是用户级的资源配置项,而bootstrap.yml是系统级的资源配置项,bootstrap.yml的优先级更高,SpringCloud会创建一个"Bootstrap Context",作为Spring应用的“Application Context"的 父上下文。初始化的时候,“Bootstrap Context"负责从外部源加载配置属性并解析配置,这两个上下文共享一个从外部获取的"Environment”。”Bootstrap“属性有高优先级,默认情况系,它们不会被本地配置覆盖。"Bootstrap Context"和"Application Context"这两个上下文有不同的约定,所以新增一个bootstrap.yml文件,保证这两个上下文的配置分离。

所以,要将Client模块下的application.yml文件改为bootstrap.yml,这是很关键的,因为bootstrap.yml是比application.yml先加载的。编写bootstrap配置文件如下:

server: port: 3355 spring: application: name: config-client cloud: # Config客户端配置 config: label: master # 分支名称 name: config # 配置文件名称 profile: dev # 读取后缀名称 # 上述3个综合:master分支上config-dev.yml的配置文件被读取 uri: :3344 # 配置中心地址 # :3344/master/config-dev.yml # 服务注册到eureka地址 eureka: client: service-url: defaultZone: :7001/eureka

编写3355服务的主启动类,之后编写其业务类:

@RestController public class ConfigClientController { @Value("${server.info}") //配置中心config-dev.yml配置的内容 private String configInfo; @GetMapping("/configInfo") public String getConfigInfo() { return configInfo; } } 3.3 测试

下面测试客户端是否能够通过访问配置中心获取配置信息

按顺序启动Eureka服务注册中心,Config服务配置中心后,启动我们的服务配置中心客户端3355进行测试:

image-20210304115758589

3.4 存在的问题

我们在GitHub上修改配置文件内容,刷新3344配置中心服务端,发现Config Server配置中心立刻响应并刷新了配置信息,但是!我们刷新3355客户端Config Client,发现没有任何响应,配置信息仍然是原来的配置信息。

难道每次远端修改了配置文件后,客户端都需要重启来进行对配置信息的重新加载吗?

4. Config 客户端之动态刷新

为了避免每次远端更新配置信息都需要重启客户端微服务3355来加载更新的配置信息,我们需要使用动态刷新。

4.1 修改3355模块

在POM中引入actuator监控:

其实actuator依赖几乎处了是网关的微服务外都得加。

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 4.2 修改配置文件

在bootstrap.yml中加入如下配置 暴露监控端点

# 暴露监控端点 management: endpoints: web: exposure: include: "*" 4.3 @RefreshScope注解

在业务类Controller上添加@RefreshScope注解使客户端服务具有刷新功能:

@RestController @RefreshScope public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/configInfo") public String getConfigInfo() { return configInfo; } } 4.4 发送Post请求刷新客户端3355

该刷新请求必须发送后,客户端才能获得刷新后的信息,刷新客户端的请求必须是POST请求:

curl -X POST "http://127.0.0.1:3355/actuator/refresh"

当出现以上信息时激活刷新客户端3355成功,再次访问客户端,发现已经可以得到刷新后的配置信息。

但是假设如果我们有多个微服务客户端呢?难道每个微服务都需要执行一次POST请求进行手动刷新吗?事实上我们可以通过广播的方式进行一次通知,处处生效,这里就要知道消息总线 => SpringCloud Bus。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgjwp.html