学习笔记:微服务-22 spring cloud config+kafka+spring cloud bus 消息总线实现配置自动更新

上节配置了spring cloud config server,集中管理配置文件,当配置文件发生变化时,客户端通过

curl -X POST http://客户端地址:端口/actuator/refresh 可以刷新客户端配置,但是如果微服务多了,一个微服务有多个实例在运行,需要一个个去刷新,采用bus消息总线,可以实现一键刷新所有实例的配置。

原理图:

一、启动kafka (安装参看我的其他文章)

cd  kafka_2.12-2.1.0

启动自带的zookeeper

bin/zookeeper-server-start.sh config/zookeeper.properties &     

启动kafka

bin/kafka-server-start.sh config/server.properties &

查看topic

bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --list

二、spring cloud config  server 配置

1. pom.xml


 
 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0 </modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot </groupId>
  7. <artifactId>spring-boot-starter-parent </artifactId>
  8. <version>2.1.1.RELEASE </version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.linbsoft </groupId>
  12. <artifactId>microservice-config-server-8401 </artifactId>
  13. <version>0.0.1-SNAPSHOT </version>
  14. <name>microservice-config-server-8401 </name>
  15. <description>Demo project for Spring Boot microservice-microservice-config-server-8401 </description>
  16. <properties>
  17. <project.build.sourceEncoding>UTF-8 </project.build.sourceEncoding>
  18. <project.reporting.outputEncoding>UTF-8 </project.reporting.outputEncoding>
  19. <java.version>1.8 </java.version>
  20. <spring-cloud.version>Greenwich.M3 </spring-cloud.version> <!-- Finchley.M8 -->
  21. </properties>
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.cloud </groupId>
  25. <artifactId>spring-cloud-config-server </artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot </groupId>
  29. <artifactId>spring-boot-starter-web </artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.cloud </groupId>
  33. <artifactId>spring-cloud-starter-netflix-eureka-client </artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework.cloud </groupId>
  37. <artifactId>spring-cloud-starter-config </artifactId>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.cloud </groupId>
  41. <artifactId>spring-cloud-starter-bus-kafka </artifactId>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.cloud </groupId>
  45. <artifactId>spring-cloud-starter-stream-kafka </artifactId>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework.cloud </groupId>
  49. <artifactId>spring-cloud-bus </artifactId>
  50. </dependency>
  51. <dependency>
  52. <groupId>org.springframework.boot </groupId>
  53. <artifactId>spring-boot-actuator </artifactId>
  54. </dependency>
  55. <dependency>
  56. <groupId>org.springframework.boot </groupId>
  57. <artifactId>spring-boot-starter-test </artifactId>
  58. <scope>test </scope>
  59. </dependency>
  60. </dependencies>
  61. <dependencyManagement>
  62. <dependencies>
  63. <dependency>
  64. <groupId>org.springframework.cloud </groupId>
  65. <artifactId>spring-cloud-dependencies </artifactId>
  66. <version>${spring-cloud.version} </version>
  67. <type>pom </type>
  68. <scope>import </scope>
  69. </dependency>
  70. </dependencies>
  71. </dependencyManagement>
  72. <repositories>
  73. <repository>
  74. <id>spring-milestones </id>
  75. <name>Spring Milestones </name>
  76. <url>https://repo.spring.io/milestone </url>
  77. <snapshots>
  78. <enabled>false </enabled>
  79. </snapshots>
  80. </repository>
  81. </repositories>
  82. <build>
  83. <plugins>
  84. <plugin>
  85. <groupId>org.springframework.boot </groupId>
  86. <artifactId>spring-boot-maven-plugin </artifactId>
  87. </plugin>
  88. </plugins>
  89. </build>
  90. </project>

       其中: spring-cloud-starter-bus-kafka  ,spring-cloud-starter-stream-kafka,spring-cloud-bus是对kafka bus总线的支持

2.  application.properties文件

server.port=8401
spring.application.name=MicroserviceConfigServer8401
eureka.client.serviceUrl.defaultZone=http://admin:123@centos7.linbsoft.com:8101/eureka/,http://admin:123@microservice1.linbsoft.com:8102/eureka/
spring.profiles.active=native
spring.cloud.config.server.native.search-locations=classpath:/config

#以下是gitub获取配置文件

#spring.cloud.config.server.git.uri=https://github.com/XXX/spring-cloud-config
#spring.cloud.config.label=master
#spring.cloud.config.server.git.searchPaths=config-repo
#spring.cloud.config.server.git.username=XXX
#spring.cloud.config.server.git.password=***

spring.cloud.bus.enabled=true
spring.kafka.bootstrap-servers=centos7.linbsoft.com:9092
management.endpoints.web.exposure.include=*
spring.cloud.bus.refresh.enabled=true

3. 启动类加注解

@EnableConfigServer

三、spring cloud config client

自动配置客户端设置

1. pom.xml


 
 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0 </modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot </groupId>
  7. <artifactId>spring-boot-starter-parent </artifactId>
  8. <version>2.1.1.RELEASE </version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.linbsoft </groupId>
  12. <artifactId>microservice-serverA-8801 </artifactId>
  13. <version>0.0.1-SNAPSHOT </version>
  14. <name>microservice-serverA-8801 </name>
  15. <description>Demo project for Spring Boot microservice-microservice-serverA-8801 </description>
  16. <properties>
  17. <project.build.sourceEncoding>UTF-8 </project.build.sourceEncoding>
  18. <project.reporting.outputEncoding>UTF-8 </project.reporting.outputEncoding>
  19. <java.version>1.8 </java.version>
  20. <spring-cloud.version>Greenwich.M3 </spring-cloud.version> <!-- Finchley.M8 -->
  21. </properties>
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.boot </groupId>
  25. <artifactId>spring-boot-starter-web </artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.cloud </groupId>
  29. <artifactId>spring-cloud-starter-netflix-eureka-client </artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.cloud </groupId>
  33. <artifactId>spring-cloud-starter-config </artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework.cloud </groupId>
  37. <artifactId>spring-cloud-starter-bus-kafka </artifactId>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.cloud </groupId>
  41. <artifactId>spring-cloud-starter-stream-kafka </artifactId>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.cloud </groupId>
  45. <artifactId>spring-cloud-bus </artifactId>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework.boot </groupId>
  49. <artifactId>spring-boot-actuator-autoconfigure </artifactId>
  50. </dependency>
  51. <dependency>
  52. <groupId>org.springframework.boot </groupId>
  53. <artifactId>spring-boot-starter-actuator </artifactId>
  54. </dependency>
  55. <dependency>
  56. <groupId>de.codecentric </groupId>
  57. <artifactId>spring-boot-admin-starter-client </artifactId>
  58. <version>2.1.1 </version>
  59. </dependency>
  60. <dependency>
  61. <groupId>org.springframework.boot </groupId>
  62. <artifactId>spring-boot-starter-test </artifactId>
  63. <scope>test </scope>
  64. </dependency>
  65. </dependencies>
  66. <dependencyManagement>
  67. <dependencies>
  68. <dependency>
  69. <groupId>org.springframework.cloud </groupId>
  70. <artifactId>spring-cloud-dependencies </artifactId>
  71. <version>${spring-cloud.version} </version>
  72. <type>pom </type>
  73. <scope>import </scope>
  74. </dependency>
  75. </dependencies>
  76. </dependencyManagement>
  77. <repositories>
  78. <repository>
  79. <id>spring-milestones </id>
  80. <name>Spring Milestones </name>
  81. <url>https://repo.spring.io/milestone </url>
  82. <snapshots>
  83. <enabled>false </enabled>
  84. </snapshots>
  85. </repository>
  86. </repositories>
  87. <build>
  88. <plugins>
  89. <plugin>
  90. <groupId>org.springframework.boot </groupId>
  91. <artifactId>spring-boot-maven-plugin </artifactId>
  92. </plugin>
  93. </plugins>
  94. </build>
  95. </project>

像server一样,加入了spring-cloud-starter-bus-kafka  ,spring-cloud-starter-stream-kafka,spring-cloud-bus依赖。

2. bootstrap.properties 这个先于从配置服务器取得的配置文件

spring.application.name=MicroserviceServerA8801
server.port=8801
eureka.client.serviceUrl.defaultZone=http://admin:123@centos7.linbsoft.com:8101/eureka/,http://admin:123@microservice1.linbsoft.com:8102/eureka/
#spring.cloud.config.uri=http://centos7.linbsoft.com:8401
spring.cloud.config.enabled=true
spring.cloud.config.profile=dev
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=MicroserviceConfigServer8401
management.endpoints.web.exposure.include=*
management.security.enabled=false
spring.cloud.stream.default-binder=kafka
spring.cloud.bus.enabled=true
spring.kafka.bootstrap-servers=centos7.linbsoft.com:9092
spring.cloud.bus.trace.enabled=true
spring.cloud.bus.refresh.enabled=true

3. 在启动类加入注解

@EnableDiscoveryClient

4. 增加测试类,就是显示姓名,年龄,这两个值是写在配置中心的配置文件中的

@RestController
@RefreshScope
public class TestController {
    
    @Value("${name}")
    private String name;
    @Value("${age}")
    private Integer age;

    @RequestMapping("/test")
    public String test(){
        return this.name+this.age;
    }
}

5.配置中心的配置文件

/microservice-config-server-8401/src/main/resources/config/MicroserviceServerA8801-dev.properties

内容简单两行:

name=linbin
age=88

四.测试

1.配置修改前的config server中配置文件

2.配置修改前测试客户端读取的配置文件

3. 修改配置文件

4. 保存后查看config server已变化

5. 启动刷新,spring cloud config server自动向kafka总线发出消息

(1)为了检测消息,先启动一个消费者进程监控消息

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic springCloudBusOutput --from-beginning

(2)开启另外一个shell,向spring cloud config server发出刷新配置的post请求

curl -X POST http://centos7.linbsoft.com:8401/actuator/bus-refresh

(3)在(1)的监控shell可以看到向kafka发出的消息

(5)查看客户端是否更新类配置文件

可以看见客户端已更新了配置文件

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值