![f3c3605b335186f4e63d40bcacfa5b5e.png](https://i-blog.csdnimg.cn/blog_migrate/508b6c7e92c295dbf6e9eb84e58b8f9f.jpeg)
本篇文章为系列文章,未读第一集的同学请猛戳这里:
哈喽沃德先生:Spring Cloud 系列之 Config 配置中心(一)zhuanlan.zhihu.com![192d941e90f6b39c7e4e9e951e273657.png](https://i-blog.csdnimg.cn/blog_migrate/366191bee2f3e7b798d9e4ed387c008b.jpeg)
本篇文章讲解 Config 如何实现配置中心自动刷新。
配置中心自动刷新
![e27f3133a7b24fc91d47a5311dca7364.png](https://i-blog.csdnimg.cn/blog_migrate/d6e0aaf886c06cfa92a0500d1763497b.png)
Spring Cloud Config 在项目启动时才会加载配置内容这一机制,导致了它存在一个缺陷,修改配置文件内容后,不会自动刷新。例如我们之前的项目,当服务已经启动的时候,修改 Github 上的配置文件内容,这时候,再次刷新页面,对不起,还是旧的配置内容,新内容不会主动刷新过来。
![254f9e9fef00dbffb1e5e09614add0be.png](https://i-blog.csdnimg.cn/blog_migrate/22dfd512765ecc05063f104c8c6ae152.jpeg)
访问:http://localhost:9090/name 结果如下:
![82e76b1ffe2f331e848260686b900b0b.png](https://i-blog.csdnimg.cn/blog_migrate/89d69a9ddae51243a2294e1c904a7959.png)
重启 Config Client 以后,访问:http://localhost:9090/name 结果如下:
![9ce8d271acea43f525919f65e905addd.png](https://i-blog.csdnimg.cn/blog_migrate/4301add516462a9475d90d1315c1257c.png)
但是,总不能每次修改了配置后重启服务吧。如果是那样的话,还是不要用它为好,直接用本地配置文件岂不更快。
它提供了一个刷新机制,但是需要我们主动触发。那就是 @RefreshScope
注解并结合 Actuator
,注意要引入 spring-boot-starter-actuator
。
添加依赖
Config Client 添加 spring-boot-starter-actuator
依赖。
<!-- spring boot actuator 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置文件
其实这里主要用到的是 refresh 这个端点。以下为 Config Client 的 bootstrap.yml
spring:
cloud:
config:
name: order-service # 配置文件名称,对应 git 仓库中配置文件前半部分
uri: http://localhost:8888 # config-server 服务端地址
label: master # git 分支
profile: dev # 指定环境
discovery:
enabled: true # 开启
service-id: config-server # 指定配置中心服务端的 service-id
# 度量指标监控与健康检查
management:
endpoints:
web:
base-path: /actuator # 访问端点根路径,默认为 /actuator
exposure:
include: '*' # 需要开启的端点,这里主要用到的是 refresh 这个端点
#exclude: # 不需要开启的端点
控制层
在需要读取配置的类上增加 @RefreshScope
注解。
package com.example.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RefreshScope
@RestController
public class ConfigController {
@Value("${name}")
private String name;
@GetMapping("/name")
public String getName() {
return name;
}
}
测试
重启 Config Client,访问:http://localhost:9090/actuator 可以看到 refresh
端点已开启。
![d93bf083cdccd62560b6cba4e5033fd5.png](https://i-blog.csdnimg.cn/blog_migrate/91cb1076bd09747c0309894bc15724b5.png)
修改 Github 上的配置文件内容并提交,访问:http://localhost:9090/name,没有反应,不慌。
![6093a8b0ec616d24b0ebe6e2dd15b157.png](https://i-blog.csdnimg.cn/blog_migrate/7078283ce3e1186b61abe4fdccc83d36.jpeg)
接下来,我们发送 POST 请求到 http://localhost:9090/actuator/refresh 这个接口,用 Postman 之类的工具即可。
![6e285bf67bfea1292a7ab4c34538e316.png](https://i-blog.csdnimg.cn/blog_migrate/659eeb96305220b28ef88f646f9b2c2f.jpeg)
再次访问:http://localhost:9090/name 结果如下:
![82e348aa976df8ed66337f2a5c647951.png](https://i-blog.csdnimg.cn/blog_migrate/d89762541ff9b51cf2f6096c812376a3.png)
在 Github 中配置 Webhook
这就结束了吗,并没有,总不能每次改了配置后,就用 Postman 访问一下 refresh 接口吧,还是不够方便呀。
Github 提供了一种 Webhook 的方式,当有代码变更的时候,会调用我们设置的地址,来实现我们想达到的目的。
进入 Github 仓库配置页面,选择 Webhooks ,并点击 Add webhook。
![66cdb1cb9940d4364640b6a9e72a4144.png](https://i-blog.csdnimg.cn/blog_migrate/4b456dc52e0e3eb8f748844b468e6f5e.jpeg)
填写回调的地址,也就是上面提到的 actuator/refresh 这个地址,但是必须保证这个地址是可以被 Github 访问的。如果是内网就没办法了。一般公司内的项目都会有自己的代码管理工具,例如自建的 gitlab,gitlab 也有 webhook 的功能,这样就可以调用到内网的地址了。
![f0a9b32f55455a90f7e74fcaa3f99037.png](https://i-blog.csdnimg.cn/blog_migrate/d29e0ab013788cebdf88185126d0efe2.jpeg)
还有一种办法就是使用 spring-cloud-config-monitor
,然后调用 /monitor
接口完成动态刷新。
![73403d0747f6b6e556e9dba8caf473bf.png](https://i-blog.csdnimg.cn/blog_migrate/eaed20613e50d3cf24bc9508dcac3b3b.jpeg)
Spring Cloud Bus 自动刷新
![436c7284e62952b315f4277af4155566.png](https://i-blog.csdnimg.cn/blog_migrate/8aecc93daba08f95708e34f217bdccf3.jpeg)
如果只有一个 Config Client 的话,那我们用 Webhook,设置手动刷新都不算太费事,但是如果客户端比较多的情况下,一个一个去手动刷新未免有点复杂。我们可以借助 Spring Cloud Bus 的广播功能,让 Config Client 都订阅配置更新事件,当配置更新时,触发其中一个端的更新事件,Spring Cloud Bus 就把此事件广播到其他订阅客户端,以此来达到批量更新。
为了方便大家学习和整理,这部分的知识我会在微服务系列之 Spring Cloud Bus 中单独给大家讲解。记得关注噢 ~
下一篇我们讲解 Config 如何实现配置中心加解密,配置中心用户安全认证,记得关注噢~
![f79eed3d7ee48588a1473f785ca5b7ee.gif](https://i-blog.csdnimg.cn/blog_migrate/29755bf31dee47d0f5b7908e6b288ceb.gif)
大家可以通过 分类
查看更多关于 Spring Cloud
的文章。
本文采用 知识共享「署名-非商业性使用-禁止演绎 4.0 国际」许可协议
。
您的点赞
和转发
是对我最大的支持。
扫码关注 哈喽沃德先生
「文档 + 视频」每篇文章都配有专门视频讲解,学习更轻松噢 ~
![88d41153d3b4c46d57276097160b4e55.gif](https://i-blog.csdnimg.cn/blog_migrate/48c97b98c3ce76c3ef7ad13ef81218e6.gif)
![29a7eedbcf90bc2bfec78218f897f4cd.png](https://i-blog.csdnimg.cn/blog_migrate/e1a0bf63c438509bb580e06f4d9ab837.png)