Spring Cloud Bus结合RabbitMQ消息队列动态刷新配置架构图:
(1)为配置中心Config Server端添加Spring Cloud Bus依赖
org.springframework.cloud
spring-cloud-starter-bus-amqp
(2)为配置中心Config Server端配置RabbitMQ消息中间件
spring:
application:
name: MALL-CONFIG
cloud:
config:
server: # Config 服务端配置,增加一个git仓库存放配置文件
git:
uri: https://github.com/lihailin9073/config-repo.git
username: lihailin9073
password: LHLlhl870104
basedir: D:\javasource\config # 指定加载的配置文件存放目录
rabbitmq: # 配置RabbitMQ
host: 39.98.172.148
port: 5672
username: admin
password: 123456
eureka:
client:
service-url:
defaultZone: http://system:sys123@peer1:8761/eureka/ # 单点Eureka Server时使用,将微服务注册到单个Eureka节点上,适合用于本地开发和测试
#defaultZone: http://system:sys123@peer1:8761/eureka/,http://system:sys123@peer2:8762/eureka/,http://system:sys123@peer3:8763/eureka/ # 集群Eureka Server时使用,将微服务注册到集群中的多个Eureka节点上,适合用于线上生产环境
# 暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
注意必须暴露监控端点,以便后续调用配置中心的/bus-refresh 接口
(3)为配置中心Config Client端添加Spring Cloud Bus依赖
org.springframework.cloud
spring-cloud-starter-bus-amqp
(4)在配置中心Config Client端配置RabbitMQ消息中间件
spring:
application:
name: ORDER-SERVICE
cloud:
config:
discovery:
enabled: true
service-id: MALL-CONFIG # 配置中心的微服务名称
profile: dev # 加载的配置文件后缀名称,与前面的应用名称共同构成完整的配置文件名称:{application}-{profile}.yml=order-service-dev.yml
rabbitmq: # 配置RabbitMQ
host: 39.98.172.148
port: 5672
username: admin
password: 123456
eureka:
client:
service-url:
defaultZone: http://system:sys123@peer1:8761/eureka/ # 单点Eureka Server时使用,将微服务注册到单个Eureka节点上,适合用于本地开发和测试
#defaultZone: http://system:sys123@peer1:8761/eureka/,http://system:sys123@peer2:8762/eureka/,http://system:sys123@peer3:8763/eureka/ # 集群Eureka Server时使用,将微服务注册到集群中的多个Eureka节点上,适合用于线上生产环境
(5)显示拉取的配置文件的属性
编写一个控制器类,并使用@RefreshScope注解将该类标注为一个动态刷新类,提供一个接口来显示获取到的配置文件中的属性值:
package cn.org.xcore.mall.order.controller;
import cn.org.xcore.mall.order.config.CompanyConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 配置中心客户端测试控制器
*
* @author 李海林 手机:13802780104|微信:lihailin9073|Email:[email protected]
* @copyright 个人开发者李海林版权所有,产品详情及技术服务请登录官网查询[http://www.x-core.org.cn]
* @create 2019-09-09 11:05
*/
@RefreshScope
@RestController
@RequestMapping("/test")
public class TestConfigController {
// 通过Config配置中心从Git仓库拉取的配置文件中读取属性的值
@Value("${developer}")
private String developer;
@Value("${email}")
private String email;
@Value("${description}")
private String description;
@Autowired
private CompanyConfig companyConfig;
// 通过Config配置中心从Git仓库拉取的配置文件中读取属性的值
@GetMapping("/get_git_config")
public Object getGitConfig() {
String config = "developer="+this.developer + ", email="+ this.email + ", description="+this.description + ", companyConfig="+ companyConfig.toString();
return config;
}
}
注意,必须要将注解@RefreshScope 加在所有使用了Git配置文件中的属性的类头部,否则将无法实现动态刷新。
启动order-service微服务,在浏览器访问该接口: http://localhost:9101/test/get_git_config
显示结果如下图所示:
其中的developer属性的值为lihailin9073,此时不要重启该微服务,通过下面的第(6)步就可以实现无重启刷新配置信息。
(6)无重启手动刷新配置
前往GitHub上的仓库找到该配置文件然后修改developer的值,修改后的Git仓库配置文件如下图所示:
修改完成后,在命令行发送一个post请求到Config Server配置中心的 /bus-refresh 接口,触发配置中心重新拉取Git仓库中的配置文件:
#curl -v -X POST http://localhost:9101/actuator/bus-refresh
注意,在这整一个操作过程中都没有重启过该微服务,此时再次通过浏览器访问接口查看developer的值:
http://localhost:9101/test/get_git_config,
会发现修改后的值已经被加载下来了,显示结果如下图所示:
到此,实现了微服务的无重启刷新配置的功能;实际项目中微服务个数成千上百个,是不可能一个个去重启它们的,因此在开发工作中如果使用了Spring Cloud,那么必然就需要无重启刷新的功能。但是,手动刷新毕竟也不够方便,可以结合Git平台提供的Webhooks功能,实现自动刷新。
(7)无重启自动刷新配置
当Config Server配置中心部署在外网时,可以通过GitHub或其它Git平台的Webhooks推送功能实现自动刷新;如果是本地开发和测试,可以使用natapp内网穿透工具(https://natapp.cn)将外网域名映射到本地机器,为Webhooks提供推送接口;以GitHub为例,配置如下所示:
其中的Payload URL指的是配置中心Spring Cloud Config Server部署的服务器域名地址,格式为:http://www.domain.com/monitor。
配置好GitHub上的Webhooks推送以后,还需要为Spring Cloud Config Server端增加spring-cloud-config-monitor依赖,如下所示:
org.springframework.cloud
spring-cloud-config-monitor
添加完依赖后,将配置中心Config Server部署到外网可访问的服务器上,然后解析一个域名过去(如果不解析域名,就将服务器的IP地址填写到GitHub的Webhooks中),测试可正常访问后,在GitHub仓库中修改配置文件,GitHub的Webhooks就会推送通知到 /monitor 接口通知配置中心拉取新的配置文件。
以解析的【http://mall-config.wzliulan.com/monitor】域名为例,打开浏览器访问接口:
http://mall-config.wzliulan.com/test/get_git_config
这个接口会显示配置文件中的几个属性值,通过它的显示结果可以检查配置是否可以自动刷新。