• SpringCloud-Config&Bus


    Spring Cloud Config

    简介

    在创建项目的时候,为每个项目都配置了一个或者多个配置文件。通过修改配置文件中的参数我们可以创建出不同的服务环境。这存在一些问题:

    1. 服务拆分越多,配置项也就越多。某项服务进行了调整,其他服务也需要相应调整。如果配置项都在每个项目的配置文件中配置,那么只要一有改变,就得改配置文件;

    2. 当修改了配置之后,必须重启服务,否则配置无法生效。

    Spring Cloud Config微服务架构中的微服务提供集中化的外部配置支持,配置中心服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。

    功能

    1. 集中管理配置文件;

    2. 不同环境不同配置,动态化的配置更新,分环境部署;

    3. 运行期间动态调整配置,不再需要在每个服务器部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息;

    4. 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置;

    5. 将配置信息以REST接口的形式暴露。

    简单来说Spring Cloud Config实现了在不重启项目的情况下,刷新项目配置的功能。

    搭建Config

    搭建Spring Cloud项目

    搭建以Consul作为注册中心的spring cloud项目

    在Gitee上创建配置文件

    ①创建仓库,命名为cloud-config

     ②管理仓库,把仓库设为公开

     ③新建文件,命名为cloud-dev.yml

     ④编辑cloud-dev.yml

    info: cloud-dev-7071

    搭建Config服务端

    ①创建maven子模块,命名为cloud-config-server7071

    ②导入依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.cloudgroupId>
    4. <artifactId>spring-cloud-config-serverartifactId>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframework.cloudgroupId>
    8. <artifactId>spring-cloud-starter-consul-discoveryartifactId>
    9. dependency>
    10. <dependency>
    11. <groupId>org.springframework.bootgroupId>
    12. <artifactId>spring-boot-starter-actuatorartifactId>
    13. dependency>
    14. dependencies>

    ③创建application.yml配置文件

    1. server:
    2. port: 7071
    3. spring:
    4. application:
    5. name: cloud-config-server
    6. cloud:
    7. config:
    8. discovery:
    9. enabled: true
    10. #gitee仓库地址
    11. server:
    12. git:
    13. uri: https://gitee.com/AGi_R/cloud-config.git
    14. search-paths:
    15. - cloud-config
    16. #gitee仓库分支
    17. label: master
    18. #consul注册中心配置
    19. consul:
    20. host: localhost
    21. port: 8500
    22. discovery:
    23. service-name: ${spring.application.name}

    ④创建启动类,添加@EnableConfigServer注解

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

    ⑤启动注册中心,启动Config服务端,访问http://localhost:7071/master/cloud-dev.yml进行测试

    创建Config客户端

    ①创建maven子模块,命名为cloud-config-client7081

    ②导入依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.cloudgroupId>
    4. <artifactId>spring-cloud-starter-configartifactId>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframework.cloudgroupId>
    8. <artifactId>spring-cloud-starter-consul-discoveryartifactId>
    9. dependency>
    10. <dependency>
    11. <groupId>org.springframework.bootgroupId>
    12. <artifactId>spring-boot-starter-webartifactId>
    13. dependency>
    14. <dependency>
    15. <groupId>org.springframework.bootgroupId>
    16. <artifactId>spring-boot-starter-actuatorartifactId>
    17. dependency>
    18. dependencies>

    ③创建bootstrap.yml配置文件

    1. server:
    2. port: 7081
    3. spring:
    4. application:
    5. name: cloud-config-client
    6. cloud:
    7. #注册中心
    8. consul:
    9. port: 8500
    10. host: localhost
    11. discovery:
    12. service-name: ${spring.application.name}
    13. config:
    14. #config服务端地址
    15. uri: http://localhost:7071
    16. label: master
    17. name: cloud #gitee仓库里面的cloud-dev的前部分cloud
    18. profile: dev #gitee仓库里面的cloud-dev的后部分dev
    19. management:
    20. endpoints:
    21. web:
    22. exposure:
    23. include: "*"

    ④创建启动类

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

    ⑤创建controller,添加@RefreshScope注解

    1. @RefreshScope
    2. @RestController
    3. public class ConfigClientController {
    4. @Value("${info}") //获取gitee仓库中cloud-dev.yml里面的info的值
    5. private String info;
    6. @GetMapping("/")
    7. public String getInfo() {
    8. return info;
    9. }
    10. }

    ⑥启动注册中心,启动Config服务端,启动Config客户端,访问http://localhost:7081/进行测试

    ⑦在gitee中修改info的值,进行测试

    info: cloud-dev-abcdefg    #修改之后的值

     ⑧这时我们需要向Config客户端发送一个POST请求,刷新info的值

     ⑨再进行测试

    问题

    我们要想刷新客户端的配置,需要向客户端发送POST请求curl -X POST "http://clientIp:port/actuator/refresh"。如果客户端过多,我们也需要发送更多的请求,工作量也随着增加,这时我们就需要Spring Cloud Bus了。Spring Cloud Bus可以解决我们所遇到的问题。

    Spring Cloud Bus

    简介

    Spring Cloud Bus是消息总线,用来连接分布式系统的所有节点。它将分布式的节点用轻量的消息代理(RibbitMQ、Kafka)连接起来。可以通过消息代理广播配置文件的更改,或服务之间的通讯,也可以用于监控。解决了微服务数据变更,及时同步的问题。

    消息总线

    消息代理中间件构建一个共用的消息主题让所有微服务实例订阅,当该消息主题产生消息时会被所有微服务实例监听和消费。

    搭建Bus 

    准备Kafka环境

    官网下载Kafka

    ②解压,放大硬盘根目录下(不然启动时会报错)

     ③进入conf目录,复制zookeeper和Kafka配置文件到bin目录下的Windows目录下(为了启动时方便操作)

     ④进入bin目录下的Windows目录下打开cmd,输入zookeeper-server-start.bat  zookeeper.properties命令启动zookeeper

    ⑤进入bin目录下的Windows目录下打开cmd,输入kafka-server-start.bat  server.properties命令启动Kafka

    创建Bus服务端

    ①创建maven子模块,命名为cloud-config-server-bus-kafka7072

    ②导入依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.cloudgroupId>
    4. <artifactId>spring-cloud-starter-bus-kafkaartifactId>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframework.cloudgroupId>
    8. <artifactId>spring-cloud-config-serverartifactId>
    9. dependency>
    10. <dependency>
    11. <groupId>org.springframework.cloudgroupId>
    12. <artifactId>spring-cloud-starter-consul-discoveryartifactId>
    13. dependency>
    14. <dependency>
    15. <groupId>org.springframework.bootgroupId>
    16. <artifactId>spring-boot-starter-actuatorartifactId>
    17. dependency>
    18. dependencies>

    ③创建application.yml配置文件

    1. server:
    2. port: 7072
    3. spring:
    4. application:
    5. name: cloud-config-server-bus
    6. cloud:
    7. consul:
    8. port: 8500
    9. host: localhost
    10. discovery:
    11. service-name: ${spring.application.name}
    12. config:
    13. discovery:
    14. enabled: true
    15. server:
    16. git:
    17. uri: https://gitee.com/AGi_R/cloud-config.git
    18. search-paths:
    19. - cloud-config
    20. label: master
    21. #kafka消息总线
    22. kafka:
    23. bootstrap-servers:
    24. - localhost:9092
    25. management:
    26. endpoints:
    27. web:
    28. exposure:
    29. include: "*"

     ④创建启动类,添加@EnableConfigServer注解

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

    创建Bus客户端

    ①创建maven子模块,命名为cloud-config-client-bus-kafka7091

    ②导入依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.cloudgroupId>
    4. <artifactId>spring-cloud-starter-bus-kafkaartifactId>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframework.cloudgroupId>
    8. <artifactId>spring-cloud-starter-configartifactId>
    9. dependency>
    10. <dependency>
    11. <groupId>org.springframework.cloudgroupId>
    12. <artifactId>spring-cloud-starter-consul-discoveryartifactId>
    13. dependency>
    14. <dependency>
    15. <groupId>org.springframework.bootgroupId>
    16. <artifactId>spring-boot-starter-webartifactId>
    17. dependency>
    18. <dependency>
    19. <groupId>org.springframework.bootgroupId>
    20. <artifactId>spring-boot-starter-actuatorartifactId>
    21. dependency>
    22. dependencies>

    ③创建bootstrap.yml配置文件,添加Kafka配置

    1. server:
    2. port: 7091
    3. spring:
    4. application:
    5. name: cloud-config-client-bus
    6. cloud:
    7. #注册中心
    8. consul:
    9. port: 8500
    10. host: localhost
    11. discovery:
    12. service-name: ${spring.application.name}
    13. config:
    14. #config服务端地址
    15. uri: http://localhost:7072
    16. label: master
    17. name: cloud #gitee仓库里面的cloud-dev的前部分cloud
    18. profile: dev #gitee仓库里面的cloud-dev的后部分dev
    19. #Kafka配置
    20. kafka:
    21. bootstrap-servers:
    22. - localhost:9092
    23. management:
    24. endpoints:
    25. web:
    26. exposure:
    27. include: "*"

    ④创建启动类

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

    ⑤创建controller,添加@RefreshScope注解

    1. @RefreshScope
    2. @RestController
    3. public class ClientBusController {
    4. @Value("${info}") //gitee配置文件中的info的值
    5. private String info;
    6. @GetMapping("/")
    7. public String getInfo() {
    8. return info;
    9. }
    10. }

    测试

    ①修改gitee中的info的值

    info: cloud-dev-7072

    ②依次启动Consul注册中心,zookeeper,Kafka,Bus服务端,Bus客户端

    ③再启动一个Bus客户端

    ④访问http://localhost:7072/master/cloud-dev.yml获取cloud-dev.yml内容

    ⑤访问http://localhost:7091/http://localhost:7092/进行测试

    ⑥修改gitee中info的值

    info: cloud-dev-123456xyz

    ⑦这次只需要向Bus服务端发POST请求curl -X POST "http://serverIp:port/actuator/bus-refresh"即可实现其他节点的配置文件数据刷新

    ⑧只想修改其中某一个可以使用这个命令curl -X POST "http://serverIp:port/actuator/bus-refresh/clientname:port"

  • 相关阅读:
    javascript二维数组(15)
    螺杆支撑座应用领域合集
    29岁才转行软件测试,目前32了,我的一些经历跟感受
    axios下载csv文件下载-功能实现
    数独程序求解世界最难数独——JAVA版
    读写算杂志社读写算编辑部读写算杂志2022年第30期目录
    Pass基础-DevOps
    springboot中@Async的使用
    【PC】2023年11月商店更新
    中国人民大学与加拿大女王大学金融硕士——另辟蹊径往往能带来柳暗花明
  • 原文地址:https://blog.csdn.net/weixin_46899412/article/details/127667684