注意:必须先具备良好的RabbitMQ环境

1.新建cloud-config-client-3366模块

项目名称:cloud-config-client-3366

鼠标点击父工程项目右击 —> New —> Module

具体创建步骤参考【搭建EurekaServer端服务注册中心

1.添加pom.xml

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-config</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-web</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-actuator</artifactId>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-devtools</artifactId>
  21. <scope>runtime</scope>
  22. <optional>true</optional>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.projectlombok</groupId>
  26. <artifactId>lombok</artifactId>
  27. <optional>true</optional>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-test</artifactId>
  32. <scope>test</scope>
  33. </dependency>
  34. </dependencies>

2.添加bootstrap.yml

server:
  port: 3366

spring:
  application:
    name: config-client
  cloud:
    #Config客户端配置
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
      uri: http://localhost:3344 #配置中心地址

#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

3.添加主启动类

@EnableEurekaClient
@SpringBootApplication
public class ConfigClient3366Application {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClient3366Application.class, args);
    }
}

4.添加controller控制器

@RestController
@RefreshScope
public class ConfigClientController {

    @Value("${server.port}")
    private String serverPort;

    @Value("${config.info}")
    private String configInfo;


    @GetMapping("/configInfo")
    public String getConfigInfo(){
        return "serverPort:"+serverPort+"\t\n\n configInfo: "+configInfo;
    }

}

2.设计思想

1.利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置

image.png

2.利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置(更加推荐)

image.png
图二的架构显然更加合适,图一不适合的原因如下:

  • 打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新职责
  • 破坏了微服务各节点的对等性
  • 有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改

3.给cloud-config-center-3344配置中心服务端添加消息总线支持

1.修改pom.xml

<!--添加消息总线RabbitMQ支持-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2.修改application.yml

一下是全部的配置,新增了 #rabbitmq相关配置,#暴露bus刷新配置的端点

server:
  port: 3344
spring:
  application:
    name: cloud-config-center
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/zc6637/springcloud-config.git # 配置git仓库的地址(最后不需要带/,否则会出现:No custom http config found for URL: XXX)
          search-paths: # git仓库地址下的相对搜索地址(可用使用通配符),可以配置多个,用,分割。可以{application}实现按应用查配置
            - springcloud-config
          username: 1175250848@qq.com
          password: lmyzc520.
      label: master
  http:
    encoding:
      force: true #解决springCloud-config返回中文乱码
  #rabbitmq相关配置
  rabbitmq:
    host: localhost
    port: 5672
    username: ant #自定义用户
    password: 123456

eureka:
  client:
    # 表示是否将自己注册进EurekaServer默认为true
    register-with-eureka: true
    # 是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
  instance:
    instance-id: cloudConfig3344
    #访问路径可以显示IP地址
    prefer-ip-address: true
    #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    #lease-renewal-interval-in-seconds: 1
    #Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
    #lease-expiration-duration-in-seconds: 2

##rabbitmq相关配置,暴露bus刷新配置的端点
management:
  endpoints: #暴露bus刷新配置的端点
    web:
      exposure:
        include: 'bus-refresh'

4.给cloud-config-center-3355客户端添加消息总线支持

1.修改pom.xml

<!--添加消息总线RabbitMQ支持-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2.修改bootstrap.yml

一下是全部的配置,新增了 #rabbitmq相关配置,#暴露监控端点

server:
  port: 3355

spring:
  application:
    name: config-client
  cloud:
    config: #Config客户端配置
      enabled: true #是否启用配置中心功能,默认true是开启的
      label: master #githup/gitee分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称 ,根据上面三个配置:master分支上的config-dev.yml的配置文件被读取http://localhost:3344/master/config-dev.yml
      uri: http://localhost:3344 #配置中心地址
    #rabbitmq相关配置 15672是Web管理界面的端口;5672是MQ访问的端口
  rabbitmq:
    host: 192.168.28.137
    port: 5672
    username: ant
    password: 123456
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

3.给cloud-config-center-3366客户端添加消息总线支持

1.修改pom.xml

<!--添加消息总线RabbitMQ支持-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2.修改bootstrap.yml

一下是全部的配置,新增了 #rabbitmq相关配置,暴露bus刷新配置的端点

server:
  port: 3366

spring:
  application:
    name: config-client
  cloud:
    #Config客户端配置
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
      uri: http://localhost:3344 #配置中心地址

  #rabbitmq相关配置 15672是Web管理界面的端口;5672是MQ访问的端口
  rabbitmq:
    host: 192.168.28.137
    port: 5672
    username: ant
    password: 123456

#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

3.启动测试

启动Eureka注册中心:cloud-eureka-server7001,cloud-eureka-server7002
启动配置中心:cloud-config-center-3344
启动客户端:cloud-config-client-3355,cloud-config-client-3366

启动所有服务后,我们登录RabbitMQ的控制台可以发现Spring Cloud Bus 创建了一个叫springCloudBus的交换机及三个以 springCloudBus.anonymous开头的队列:
image.png

image.png

浏览器输入:http://localhost:3344/config-dev.yml

data:
  info: config info for dev(master)
  name: 版本v1
  port: 9998

浏览器输入:http://localhost:3355/configInfohttp://localhost:3366/configInfo
返回如下内容:

{"port":"9998","name":"版本v1","info":"config info for dev(master)"}

修改config-dev.yml,并提交
image.png

浏览器输入:http://localhost:3344/config-dev.yml
返回如下内容,可以看到配置中心已经获取到了最新的配置了

data:
  info: config info for dev(master)
  name: 版本v2
  port: 9998

浏览器输入:http://localhost:3355/configInfohttp://localhost:3366/configInfo
返回如下内容,发现还是获取的上一个版本的配置,没有获取到最新的配置

{"port":"9998","name":"版本v1","info":"config info for dev(master)"}

1.发送Post请求,广播通知

执行如下请求,用于广播通知其他客户端更新配置

curl -X POST "http://localhost:3344/actuator/bus-refresh"

执行如上命令会触发订阅过springCloudBus主题的客户端从而刷新获取最新的配置,如下图可以看到图表有波动
image.png

浏览器输入:http://localhost:3355/configInfohttp://localhost:3366/configInfo
返回如下内容,发现已经获取到最新的配置了

{"port":"9998","name":"版本v2","info":"config info for dev(master)"}