目录
- 问题
- 解决方案
- 1.使用Spring Boot Actuator监控接口【不推荐】
- 流程图
- 使用Spring Boot Actuator的步骤
- 2.Spring Cloud Bus
- 第一种方案问题
- Spring Cloud Bus
- 流程图
- Spring Cloud Bus实现客户端刷新的步骤
- 开发准备
- 实现
- 1. 在config-server中添加依赖
- 2.在config-server中添加配置
- application.yml
- bootstrap.yml
- 3.在config-client中添加依赖
- 4.在config-client中添加配置
- application.yml
- bootstrap.yml
上一篇博客讲了一下SpringCloud的分布式配置: 【Spring Cloud】分布式配置,但是存在一些问题,如:如何动态刷新?
问题
- 目前已经掌握了Spring Cloud Config配置中心的的用法,但是当重新修改配置文件提交后,客户端获取的仍然是修改前的信息,需要客户端重启才可以获取最新的信息。
- 因此我们需要客户端能够动态进行更新,幸好Spring Cloud官方已经给出方案,所以我们只需要使用就行了。
解决方案
1.使用Spring Boot Actuator监控接口【不推荐】
- Spring Boot Actuator可以帮助你监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等。
- 所有的这些特性可以通过JMX或者HTTP endpoints来获得。
- 根据应用依赖和配置自动创建出来的监控和管理端点。通过这些端点,我们可以实时获取系统应用的各项监控指标。
总结成一句话:Spring Boot Actuator是监控系统健康情况的工具。
流程图
使用Spring Boot Actuator的步骤
-
第一步:在config-client中添加POM依赖。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
第二步:添加配置信息
management:endpoints:web:exposure:inclued: refresh
-
第三步:添加@RefreshScope注解,启动demo-gateway项目。
-
第四步:修改Git仓库
demo-gateway-dev.properties
文件中eureka.port
的值。 -
第五步:使用POSTMAN 通过POST请求发送到
http://localhost:7600/actuator/refresh
, -
第六步:访问
http://localhost:8085/port
可以看到配置内容被更新了
2.Spring Cloud Bus
第一种方案问题
- 第一种解决方案中,我们客户端发现每次获取最新配置都需要手动进行刷新,如果少的的话还可以使用,但是多的话就比较繁琐了,虽然我们可以使用类似Github的WebHook的工具。
- WebHook是当某个事件发生时,通过发送http post请求的方式来通知信息接收方。
- 但是当客户端越来越多的时候WebHook已经不好使用了,每次新增客户端都需要更改WebHook会显得很麻烦,Spring Cloud官方给出了非常好的解决方案。
- Spring Cloud Bus可以完美解决这一问题。
Spring Cloud Bus
- Spring Cloud Bus 是 Spring Cloud 体系内的消息总线,用来连接分布式系统的所有节点。Spring Cloud Bus 将分布式的节点用轻量级的消息代理(RabbitMQ、Kafka)连接起来。可以通过消息代理广播配置文件的更改,或服务之间的通讯,也可以用于监控。解决了微服务数据变更,及时同步的问题。
- 大家可以将它理解为管理和传播所有分布式项目中的消息既可,其实本质是利用了MQ的广播机制在分布式的系统中传播消息,利用bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一。
流程图
Spring Cloud Bus实现客户端刷新的步骤
- 提交代码触发post给Server端发送bus/refresh
- Server端接收到请求并发送给Spring Cloud Bus
- Spring Cloud Bus接到消息并通知给其它客户端
- 其它客户端接收到通知,请求Server端获取最新配置
- 全部客户端均获取到最新的配置
开发准备
- Spring Cloud Bus 主要使用MQ进行消息的发送与接收。
- 可以根据情况来进行选择,主要使用的是哪个MQ就用哪一个就行了。
- 这里我们就用RabbitMQ作为示例来进行讲解。
- 关于RabbitMQ的内容,可以看我之前的博客内容
实现
1. 在config-server中添加依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency>
2.在config-server中添加配置
application.yml
server:port: 7900
spring:application:name: demo-config-servercloud:config:server:git:uri: https://gitee.com/xxxx/env_project.gitsearch-paths: config-filebus:trace:enabled: truerabbitmq:host: 192.168.29.80port: 5672username: adminpassword: admin
eureka:client:service-url:defaultZone: http://192.168.2.220:7776/eureka/
management:endpoints:web:exposure:include: bus-refresh
bootstrap.yml
encrypt:key: demo-config-server
3.在config-client中添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency>
4.在config-client中添加配置
application.yml
server:port: 8085
eureka:client:service-url:defaultZone: http://192.168.2.220:7776/eureka/
spring:rabbitmq:host: 192.168.29.80
bootstrap.yml
spring:cloud:config:uri: http://localhost:7900profile: devlabel: devname: demo-gatewayapplication:name: demo-config-client