本篇文章为系列文章,未读第一集的同窗请猛戳这里:Spring Cloud 系列之 Config 配置中心(一)java
本篇文章讲解 Config 如何实现配置中心自动刷新。git
配置中心自动刷新
点击连接观看:配置中心自动刷新视频(获取更多请关注公众号「哈喽沃德先生」)web
Spring Cloud Config 在项目启动时才会加载配置内容这一机制,致使了它存在一个缺陷,修改配置文件内容后,不会自动刷新。例如咱们以前的项目,当服务已经启动的时候,修改 Github 上的配置文件内容,这时候,再次刷新页面,对不起,仍是旧的配置内容,新内容不会主动刷新过来。spring
访问:http://localhost:9090/name 结果以下:bootstrap
重启 Config Client 之后,访问:http://localhost:9090/name 结果以下:安全
可是,总不能每次修改了配置后重启服务吧。若是是那样的话,仍是不要用它为好,直接用本地配置文件岂不更快。app
它提供了一个刷新机制,可是须要咱们主动触发。那就是 @RefreshScope
注解并结合 Actuator
,注意要引入 spring-boot-starter-actuator
。ide
添加依赖
Config Client 添加 spring-boot-starter-actuator
依赖。spring-boot
<!-- 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
端点已开启。
修改 Github 上的配置文件内容并提交,访问:http://localhost:9090/name,没有反应,不慌。
接下来,咱们发送 POST 请求到 http://localhost:9090/actuator/refresh 这个接口,用 Postman 之类的工具便可。
再次访问:http://localhost:9090/name 结果以下:
在 Github 中配置 Webhook
这就结束了吗,并无,总不能每次改了配置后,就用 Postman 访问一下 refresh 接口吧,仍是不够方便呀。
Github 提供了一种 Webhook 的方式,当有代码变动的时候,会调用咱们设置的地址,来实现咱们想达到的目的。
进入 Github 仓库配置页面,选择 Webhooks ,并点击 Add webhook。
填写回调的地址,也就是上面提到的 actuator/refresh 这个地址,可是必须保证这个地址是能够被 Github 访问的。若是是内网就没办法了。通常公司内的项目都会有本身的代码管理工具,例如自建的 gitlab,gitlab 也有 webhook 的功能,这样就能够调用到内网的地址了。
还有一种办法就是使用 spring-cloud-config-monitor
,而后调用 /monitor
接口完成动态刷新。
Spring Cloud Bus 自动刷新
若是只有一个 Config Client 的话,那咱们用 Webhook,设置手动刷新都不算太费事,可是若是客户端比较多的状况下,一个一个去手动刷新未免有点复杂。咱们能够借助 Spring Cloud Bus 的广播功能,让 Config Client 都订阅配置更新事件,当配置更新时,触发其中一个端的更新事件,Spring Cloud Bus 就把此事件广播到其余订阅客户端,以此来达到批量更新。
为了方便你们学习和整理,这部分的知识我会在微服务系列之 Spring Cloud Bus 中单独给你们讲解。记得关注噢 ~
下一篇咱们讲解 Config 如何实现配置中心加解密,配置中心用户安全认证,记得关注噢~
本文采用 知识共享「署名-非商业性使用-禁止演绎 4.0 国际」许可协议
。
你们能够经过 分类
查看更多关于 Spring Cloud
的文章。
🤗 您的点赞
和转发
是对我最大的支持。
📢 扫码关注 哈喽沃德先生
「文档 + 视频」每篇文章都配有专门视频讲解,学习更轻松噢 ~