前言
当我们的分布式配置中心值修改了,那么我们的客户端在获取的时候也需要修改,如果是一些db等配置信息在内存中使用,配置中心修改之后不能实时同步到内存中,而又不能重启配置中心服务。
此时一是可以使用手动刷新客户端使⽤post去触发refresh,获取最新数据。
利用SpringBoot监控机制请求接口 进行手动刷新http://localhost:port/actuator/refresh
如果服务数量多到几十甚至几百,那岂不是每个接口都需要手动刷新一遍?第二种解决办法就是使用Bus消息总线自动刷新。
Spring Cloud Bus
所谓消息总线Bus,即我们经常会使⽤MQ消息代理构建⼀个共⽤的Topic,通过这个Topic连接各个微服务实例,MQ⼴播的消息会被所有在注册中⼼的微服务实例监听和消费。是通过⼀个主题连接各个微服务,进行自动刷新。
Spring Cloud Bus(基于MQ的,⽀持RabbitMq/Kafka) 是Spring Cloud中的消息总线⽅案,Spring Cloud Config + Spring Cloud Bus 结合可以实现配置信息的⾃动更新。
这儿mq安装和配置就不累赘了,可以百度。
通过mq在配置服务中心修改之后,在bus和客户端进行推送。 所以需要分别在Bus服务和客户端服务添加bus依赖以及配置。
Bus 服务配置文件
#eureka server服务端口
server:
port: 7001
spring:
application:
name: server-pruduce-config-server-7000 # 应用名称,应用名称会在Eureka中作为服务名称
cloud:
inetutils:
# 指定此客户端的ip
default-ip-address: springcloud
config:
server:
git:
uri: https://gitee.com/pomeStyle/tizzy-config-repo.git
#配置git服务地址
username: 17694863783 #配置git⽤户名
password: qwer..00 #配置git密码
search-paths:
- /
# 读取分⽀
label: master
# bus 总线使用 rabbitmq
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
eureka:
instance:
hostname: springcloud # 当前eureka实例的主机名
ip-address: springcloud
client:
service-url:
prefer-ip-address: true
lease-renewal-interval-in-seconds: 30
# 租约到期,服务时效时间,默认值90秒,服务超过90秒没有发⽣⼼跳,服务注册中心会将服务从列表移除
lease-expiration-duration-in-seconds: 90
# 配置客户端所交互的Eureka Server的地址(Eureka Server集群中每一个Server其实相对于其它Server来说都是Client)
# 集群模式下,defaultZone应该指向其它Eureka Server,如果有更多其它Server实例,逗号拼接即可
defaultZone: http://127.0.0.1:8761/eureka,http://127.0.0.1:8762/eureka # 注册到集群汇总,多个用,拼接
register-with-eureka: true # 集群模式下可以改成true
fetch-registry: true # 集群模式下可以改成true
#建议暴露所有的端⼝
management:
# 暴露健康接口细节
endpoint:
health:
show-details: always
endpoints:
web:
exposure:
include: "*"
依赖
<!--eureka client 客户端依赖引⼊-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--config配置中⼼服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- bus 总线-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
客户端调用也需要添加mq配置和bus依赖
#eureka server服务端口
server:
port: 8083
spring:
application:
name: cloud-eureka-client-8083 # 应用名称,应用名称会在Eureka中作为服务名称
cloud:
inetutils:
# 指定此客户端的ip
default-ip-address: springcloud
########################### 分布式配置 客户端配置使用 #########################
#信息在哪个⽂件中
config:
name: mysql #配置⽂件名称
profile: dev #后缀名称
label: master #分⽀名称
uri: http://localhost:7000/ #ConfigServer配置中⼼地址
# bus 总线使用 rabbitmq 客户端配置 同事引入依赖
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
# Spring Boot 健康检查
management:
endpoints:
web:
exposure:
include: "*" # 暴露所有接口
#include: refresh
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--Config 客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<!-- bus自动刷新 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
健康监控的配置我在父pm中加了,这儿额外贴一下
<!-- Actuator可以帮助你监控和管理Spring Boot应用-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
最后分别启动配置中心服务 和 配置客户端服务 以及 Bus服务
然后就是修改和验证了,修改配置文件后然后使用刷新可以全局更新配置。
向配置中⼼服务端发送post请求http://localhost:7001/actuator/bus-refresh,各个客户端配置即可⾃动刷新在⼴播模式下实现了⼀次请求,处处更新。
如果需要单独定向更新刷新某个服务可以为最后⾯跟上要定向刷新的实例的 服务名端⼝号`即可。
即:http://localhost:7001/actuator/bus-refresh/xxxx-service-server:port
可以看到请求之后,在mq页面可以看到一个springCloudBus的topic