飞道的博客

Spring Cloud Config 使用bus 实现刷新所有客户端

380人阅读  评论(0)

1.使用码云创建配置仓库(可以根据需要更改,比如github,gitlab)都一个意思

我根据服务名称创建了两个文件夹分别存放不同模块对应的配置信息

然后分别在各自的文件夹中添加属性,等接下来进行测试

sys-dev.yml的配置

 web-dev.yml的配置

以下提到的模块均有一个父模块,其主要pom如下


  
  1. springboot版本
  2. <parent>
  3. <groupId>org.springframework.boot </groupId>
  4. <artifactId>spring-boot-starter-parent </artifactId>
  5. <version>2.2.2.RELEASE </version>
  6. <relativePath/> <!-- lookup parent from repository -->
  7. </parent>

 springcloud版本 和alibaba cloud 版本


  
  1. <dependency>
  2. <groupId>org.springframework.cloud </groupId>
  3. <artifactId>spring-cloud-dependencies </artifactId>
  4. <version>Hoxton.SR1 </version>
  5. <type>pom </type>
  6. <scope>import </scope>
  7. </dependency>
  8. <dependency>
  9. <groupId>com.alibaba.cloud </groupId>
  10. <artifactId>spring-cloud-alibaba-dependencies </artifactId>
  11. <version>2.2.0.RELEASE </version>
  12. <type>pom </type>
  13. <scope>import </scope>
  14. </dependency>

2.新建configServer 模块

创建一个服务端配置模块,就是创建一个springboot项目

pom中关键的依赖如下: 我使用的nacos做的注册中心,nacos也可以做配置中心-->,(nacos做配置中心)我这里暂且只使用他当注册中心


  
  1. <dependency>
  2. <groupId>com.alibaba.cloud </groupId>
  3. <artifactId>spring-cloud-starter-alibaba-nacos-discovery </artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud </groupId>
  7. <artifactId>spring-cloud-config-server </artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.boot </groupId>
  11. <artifactId>spring-boot-starter </artifactId>
  12. </dependency>

yml文件如下:


  
  1. spring:
  2. application:
  3. name: configServer # 服务名称
  4. cloud:
  5. nacos:
  6. discovery:
  7. server-addr: 127.0 .0 .1: 8848 # nacos地址
  8. config:
  9. server:
  10. git:
  11. uri: 上一步创建的git地址
  12. username: 你的git用户名
  13. password: 你的git密码
  14. search-paths: /** # 因为我分了文件件,这里代表搜索所有文件目录
  15. server:
  16. port: 8888 # 服务端的端口号

启动类如下:


  
  1. @SpringBootApplication
  2. @EnableConfigServer //开启配置服务端
  3. @EnableDiscoveryClient //开启注册功能,将本服务注册到nacos 注册中心
  4. public class ConfigApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(ConfigApplication.class, args);
  7. }
  8. }

3.新建客户端

我这边准备了两个客户端,模块名称叫做sys和web,因为两个基本一样,我这边就拿web举例子

pom如下:


  
  1. <dependency>
  2. <groupId>org.springframework.cloud </groupId>
  3. <artifactId>spring-cloud-starter-bus-amqp </artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot </groupId>
  7. <artifactId>spring-boot-starter-actuator </artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.cloud </groupId>
  11. <artifactId>spring-cloud-starter-config </artifactId>
  12. </dependency>
  13. <dependency>
  14. <groupId>com.alibaba.cloud </groupId>
  15. <artifactId>spring-cloud-starter-alibaba-nacos-discovery </artifactId>
  16. </dependency>

在recources目录下创建bootstrap.yml 内容如下:


  
  1. spring:
  2. application:
  3. name: web # 应用名称,需要和git上的web-dev.yml中的web保持一致
  4. cloud:
  5. config:
  6. discovery:
  7. enabled: true
  8. service-id: configServer #指定配置服务的名称
  9. nacos:
  10. discovery:
  11. server-addr: 127.0 .0 .1: 8848 #nacos的路径
  12. profiles:
  13. active: dev # 激活哪个配置文件, 此代表拉取web-dev.yml这个文件 {application}-{profiles}.yml
  14. management:
  15. endpoints:
  16. web:
  17. exposure:
  18. include: "*" 用来暴露刷新接口

还配置了一个application.yml 内容如下:


  
  1. server:
  2. port: 9000
  3. spring:
  4. rabbitmq:
  5. host: 192 .168 .234 .128
  6. port: 5672
  7. username: guest
  8. password: guest

启动类如下:


  
  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. public class WebApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(WebApplication.class, args);
  6. }
  7. }

 

4.使用docker安装rabbitMQ

 之前我写过一个用docker安装rabbitMQ ,并且正常访问web页面的一个文章,可以直接去那看,如果已经安装好了的话,可略过

地址: docker 安装rabbitMQ

5.测试 以上都完成之后,接下来就进行测试

    5.1 启动nacos注册中心

    5.2 启动configServer 模块

    5.3 启动 sys 和web 模块

    5.4 修改git上的两个配置 ,然后刷新, 随便请求某一个客户端的bus-refresh即可,比如我请求一个web的

    发送一个post请求.可以使用postman工具

    http://127.0.0.1:9000/actuator/bus-refresh

    完成了所有模块的刷新,可以访问这个 http://127.0.0.1:9000/getConfName 进行测试


  
  1. @RestController
  2. @RefreshScope
  3. public class TestConfig {
  4. @Value("${name}") //读取配置文件的值,这里直接是读取的git上的该值
  5. private String name;
  6. @GetMapping("getConfName")
  7. public String getConfName() {
  8. return name;
  9. }
  10. }

   假设只是修改了某一个服务的配置,不想全部模块都刷新, 那么可以执行

    http://127.0.0.1:9000/actuator/refresh

   这样只会刷新web模块9000 端口的这个实例,如果说我们在一个服务器上部署两个web,那么另一个的端口不能再使用9000了,

   比如使用9002 那么上面的操作我们是刷新不了9002那个实例的配置的,需要执行

    http://127.0.0.1:9002/actuator/refresh 来刷新另一个实例

   同理,但我们把服务部署到不同的服务器上,那么没个实例的ip也不一致,也只能一个个刷新,

   因此 refresh  和 bus-refresh 可以具体情况具体使用, 都能实现动态刷新配置的功能

   Spring Cloud config  通过rabbitmq 和bus 实现了动态刷新,有机会写一下nacos实现配置的刷新


转载:https://blog.csdn.net/csdnmuyi/article/details/105861197
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场