客户端取到了配置中⼼的值之后,我们修改GitHub上⾯的值时,服务端(Config Server)能实时获取最新的值,但客户端(Config Client)读的是缓存,⽆法实时获取最新值。
Spring Cloud已 经为我们解决了这个问题,那就是客户端使
⽤post去触发refresh,获取最新数据。
一、手动刷新
⼿动刷新⽅式避免了服务重启,需要访问一个地址进行刷新,之后再访问即可。
如果,我们修改Git上的值的时候,服务端(Config Server:http://localhost:9006/master/lagou-service-resume-dev.yml)能实时获取最新的
值,但客户端(Config Client,简历微服务)读的是缓存,⽆法实时获取最新值。
如,git上的信息,我们由100修改成200
访问服务端,是最新的数据。
但是访问客户端,还是旧的数据
Spring Cloud已 经为我们解决了这个问题,那就是客户端使⽤post去触发refresh,获取最新数据。
(一)Client客户端添加依赖springboot-starter-actuator(已添加)
(二)Client客户端bootstrap.yml中添加配置(暴露通信端点)
# 暴露通信端点
management:
endpoints:
web:
exposure:
include: refresh
也可以暴露所有的端⼝
# 暴露通信端点
management:
endpoints:
web:
exposure:
include: "*"
(三)Client客户端使⽤到配置信息的类上添加@RefreshScope
(四)测试
1、修改git上的配置
①访问服务端:
②访问客户端:
此时还是旧的数据。还差一步刷新
③⼿动向Client客户端发起POST请求刷新配置
注意:必须是post请求
http://localhost:8080/actuator/refresh
④再次查询客户端配置信息
已经是最新的数据了
二、自动刷新
手动刷新只能每次刷新一个服务,但是现实中大部分都是集群,需要一下子更新很多个服务。除了一个个执行手动刷新之外,还可以使用Bus,进行批量刷新。
使用Spring Cloud Config + Spring Cloud Bus,实现分布式配置的⾃动更新
Spring Cloud Bus(Bus消息总线,基于MQ的,⽀持RabbitMq/Kafka) 是Spring Cloud中的消息总线⽅案。
(一)解决方案
所谓消息总线Bus,即我们经常会使⽤MQ消息代理构建⼀个共⽤的Topic,通过这个Topic连接各个微服务实例,MQ⼴播的消息会被所有在注册中⼼的微服务实例监听和消费。
换言之就是通过一个主题连接各个微服务,打通脉络。
相比之前的,多了一个Spring Cloud Bus消息总线。
- 刷新的时候,不再一个个的刷新微服务,而是直接刷新 Config Server
- Config Server刷新的时候,会发送消息给消息总线Bus(mq)
- 由于各微服务对总线是有订阅的,所以,各微服务会接收到总线发送的刷新的消息
- 各微服务收到消息总线Bus的消息之后,也会触发各自的刷新。从而实现一处刷新,处处生效。
(二)使用步骤
为了模拟有多个使用config的微服务,先将端口号8081的resume服务,按照上面8080端口号的resume服务一样,改造成使用config。
MQ消息代理,选择使⽤RabbitMQ。
ConfigServer、ConfigClient都添加都消息总线的⽀持以及与RabbitMq的连接信息。(即,8080 8081两个resume服务,configserver-9006的config服务,都要执行以下几个步骤)
1)ConfigServer和ConfigClient都添加以下依赖
<!-- 引入 Config Server服务端添加消息总线⽀持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
2)ConfigServer和ConfigClient添加配置
注意:级别是:spring.rabbitmq
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
3)微服务暴露端⼝
management:
endpoints:
web:
exposure:
include: bus-refresh
建议暴露所有的端⼝
management:
endpoints:
web:
exposure:
include: "*"
4)修改git云上的配置文件之后,发送请求进行刷新
①服务端依旧可以直接获取最新数据
②执行bus-refresh
http://localhost:9006/actuator/bus-refresh
③各客户端已经可以获取到最新数据了
5)定向刷新
http://localhost:9006/actuator/bus-refresh/lagou-service-resume:8088
即为最后⾯跟上要定向刷新的实例的 服务名:端⼝号即可