Spring Cloud 快速入门(六)分布式配置管理Spring Cloud Config 和 消息总线Spring Cloud Bus

集群中每一台主机的配置文件都是相同的,对配置文件的更新维护就成为了一个棘手的问题,Spring Cloud Config 是负责 Spring Cloud 中配置文件维护管理的配置中心。

1. spring cloud config 概述

1.1 官网介绍

在这里插入图片描述

【原文】Spring Cloud Config provides server and client-side support for externalized configuration in a distributed system. With the Config Server you have a central place to manage external properties for applications across all environments.

【翻译】Spring Cloud Config 为分布式系统中的外部化配置提供服务器和客户端支持。使用Config 服务器,可以在中心位置管理所有环境中应用程序的外部属性。

相关产品:
百度:Disconf
阿里:diamand、Nacos
携程:Apollo

1.2 统合说明

Spring Cloud Config 就是对微服务的配置文件进行统一管理的。其工作原理是,我们首先需要将各个微服务公共的配置信息推送到 GitHub 远程版本库。然后我们再定义一个 Spring Cloud Config Server,其会连接上这个 GitHub 远程库。这样我们就可以定义 Config 版的 Eureka Server、提供者与消费者了,它们都将作为 Spring Cloud Config Client 出现,它们都会通过连接 Spring Cloud Config Server 连接上 GitHub 上的远程库,以读取到指定配置文件中的内容。

1.3 原理

Config Server 可以组装的最终配置文件格式有三种:yml、properties、json。
在这里插入图片描述

2. 环境搭建

2.1 创建配置文件工程 00-config-server-9999

2.1.1 总步骤

  • 导入 config server 的依赖,将其它所有依赖删除
  • 在启动类上添加@EnableConfigServer 注解
  • 在配置文件中指定要连接的 git 远程库地址等信息

2.1.2 创建工程

复制第五章的 00-zuul-9000 工程,并重命名为 00-config-server-9999。

2.1.3 添加依赖

删除全部依赖,然后再导入 Spring Cloud Config Server 依赖。

<!--spring cloud config server依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

2.1.4 定义配置文件

首先复制我们远程git仓库的地址:

在这里插入图片描述
将当前配置文件中所有内容全部删除,添加Spring Cloud Config的相关配置:
在这里插入图片描述

我这里已经设置好了SSH的密钥,如果要用http方式连接,通过如下参数进行账号和密码配置:
在这里插入图片描述
在这里插入图片描述

server:
  port: 9999

spring:
  cloud:
    config:
      server:
        git:
          # 指定git远程库地址
          uri: [email protected]:waxjava/abcmsc-config-center.git
          # 指定获取到git远程库连接的超时时限,默认为5秒
          timeout: 5
          # 指定要操作的git远程库分支,默认master
          default-label: master

2.1.5 修改启动类

在这里插入图片描述

@EnableConfigServer  // 开启Config的服务器功能
@SpringBootApplication
public class ApplicationConfigServer9999 {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(ApplicationConfigServer9999.class, args);
    }


}

2.1.6 演示

(1) 查看配置文件:

在这里插入图片描述
可以看到该文件是一个多环境选择的配置文件,并指定激活dev环境:
在这里插入图片描述

(2) 启动ConfigServer后访问:

  • application-dev.yml

    • yml格式
      在这里插入图片描述

    • properties格式(可以自由切换格式)
      在这里插入图片描述

    • json格式(可以自由切换格式)
      在这里插入图片描述

  • application-test.yml
    在这里插入图片描述

  • application.yml
    在这里插入图片描述
    看到直接访问application.yml,是没有的

  • 访问一个没有的环境配置:
    在这里插入图片描述
    看到给出的是公共部分的配置

  • 前面访问路径省略了分支
    在这里插入图片描述

  • 查看master分支的信息/
    /application/master
    在这里插入图片描述

由此可以看出ConfigServer并不是简单的把配置文件下载下来,还会对配置文件进行再组装

2.1.7 修改 windows 的 host 文件

接下来我们准备创建ConfigServer的客户端工程了,在这之前,给当前工程地址配置下域名:
在这里插入图片描述

2.2 定义 Config 版的 Eureka 服务器 06-config-eureka-server

2.2.1 总步骤

  • 导入 config 的客户端依赖
  • 定义 bootstrap.yml 配置文件,在其中指定要连接的 config server 地址
  • 删除之前的 application.yml 文件

2.2.2 创建工程

复制第二章中的 00-eurekaserver-8000 工程,并重命名为 06-config-eureka-server。
启动类更名为ApplicationConfigEuerkaServer。

2.2.3 添加 config 客户端依赖

在原工程依赖的基础上添加 spring cloud config 的客户端依赖。

<!--spring cloud config客户端依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

2.2.4 定义 bootstrap.yml

gitee上EuerkaServer对应的配置文件查看:
在这里插入图片描述
在这里插入图片描述

删除原来的application.yml配置文件,添加bootstrap.yml:

  • bootstrap.yml 中配置的是应用启动时所必须的配置信息。
  • application.yml 中配置的是应用运行过程中所必须的配置信息
  • bootstrap.yml 优先于 application.yml 进行加载。
# bootstrap.yml:在应用启动时加载,其一般用于配置应用启动过程中所需要的数据,即若没有这些配置,则应用无法启动
# application.yml:在应用启动时加载,其一般用于配置应用运行过程中所需要的数据,即若没有这些配置,则应用无法运行
spring:
  cloud:
    config:
      # 指定要连接的config server的uri
      # 集群方式:uri: http://localhost:9999,http://localhost:8888,http://localhost:7777
      uri: http://localhost:9999
      # 指定要访问的远程库分支
      label: master
      # 指定要从git远程库读取的配置文件名称,注意无需扩展名
      name: application-eureka-config
      # 环境选择,如果配置文件中指定了选择的环境,这里可以不配置
      profile: dev

2.2.5 演示

启动访问成功
在这里插入图片描述

2.3 定义 Config 版的提供者 06-config-provider

2.3.1 创建工程

复制第二章的 02-provider-8081 工程,重命名为 06-config-provider。
重命名启动类ApplicationConfigProvider。

2.3.2 添加 config 客户端依赖

在原工程依赖的基础上添加 spring cloud config 的客户端依赖。

<!--spring cloud config客户端依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

2.3.3 定义 bootstrap.yml

spring:
  cloud:
    config:
      uri: http://localhost:9999
      label: master
      name: application-provider-config
      profile: dev

gitee上对应的配置文件查看:
在这里插入图片描述

2.4 定义 Config 版的消费者 06-config-consumer

2.4.1 创建工程

复制第二章的 02-consumer-8080 工程,并重命名为 06-config-consumer。
重命名启动类ApplicationConfigConsumer。

2.4.2 添加 config 客户端依赖

在原工程依赖的基础上添加 spring cloud config 的客户端依赖。

<!--spring cloud config客户端依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

2.4.3 定义 bootstrap.yml

spring:
  cloud:
    config:
      uri: http://localhost:9999
      label: master
      name: application-consumer-config
      profile: dev

gitee上对应的配置文件查看:
在这里插入图片描述

2.5 配置文件自动更新

2.5.1 Webhooks

GitHub 中提供了 Webhooks 功能来确保远程库中的配置文件更新后,客户端中的配置信息也可以实时更新。具体实现方式可参考如下一篇博文:
https://blog.csdn.net/qq_32423845/article/details/79579341

这种方式存在很大的弊端,并不适合生产环境下的使用,而 Spring Cloud Bus 消息总线系统解决了这些问题。所以,生产环境下一般使用的是 Spring Cloud Bus 完成配置文件的自动更新。

webhooks 存在的弊端:

  • 每个 config client 都需要在 git 远程库中注册,若 config clent 数量发生变化,则需要修改 git 远程库。
  • 每个 config client 若要在不重启的情况下更新配置,则都需要提交一个 actuator 的 post 请求。这样的话,若存在多个 config client 需要更新,则需要提交多个这种 post 请求。

4. Spring Cloud Bus

4.1 Spring Cloud Bus 概述

(1) 官方简介
在这里插入图片描述

【翻译】用于将服务和服务实例与分布式消息系统链接在一起的事件总线。在集群中传播状态更改很有用(例如配置更改事件)。
在这里插入图片描述

(2) 工作原理
消息总线系统整合了 java 的事件处理机制和消息中间件。
在这里插入图片描述

把事件通过Java事件处理机制(转换器)转换成消息,在消息中间件中传输,其他应用接受到消息再通过Java事件处理机制(转换器)转换成事件

(3) 配置自动更新原理
先是一个Config Client提交了bus-refresh请求
在这里插入图片描述

提交以后就会获得更新后的配置文件
在这里插入图片描述

这个提交请求的Config Client会把提交的消息通过消息总线系统广播给其他的Config Client
只要在这个消息总线上的Config Client也会提交这样一个post请求
在这里插入图片描述

然后就都会更新配置
在这里插入图片描述

4.2 环境搭建

4.2.1 修改远程库中的配置文件

为了方便后面的测试,这里分别在提供者配置文件 application-provider-config.yml 与消费者配置文件 application-consumer-config.yml 中各添加了一个自定义属性。

(1) 修改 application-provider-config.yml
在这里插入图片描述

(2) 修改 application-consumer-config.yml
在这里插入图片描述

4.2.2 创建提供者工程 06-bus-config-provider

总步骤

  • 导入 actuator 与 bus-kafka 依赖
  • 在配置文件中指定要连接的 kafka 集群,并开启 actuator 的 bus-refresh 监控终端
  • 在需要自动更新的类上添加@RefreshScope 注解

(1) 创建工程
复制 06-config-provider,并重命名为 06-bus-config-provider。
修改启动类类名ApplicationBusConfigProvider。

(2) 导入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
<!--actuator依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

(3) 修改配置文件
在这里插入图片描述

spring:
  cloud:
    config:
      uri: http://localhost:9999
      label: master
      name: application-provider-config
      profile: dev

  # 指定要连接的kafka集群
  kafka:
    bootstrap-servers: kafkaOS1:9092,kafkaOS2:9092,kafkaOS3:9092

# 开启actuator的bus-refresh监控终端
management:
  endpoints:
    web:
      exposure:
        include: bus-refresh

(4) 修改接口实现类
在这里插入图片描述

@RefreshScope
@RestController
@RequestMapping("/provider/depart")
public class DepartController {
    
    
    @Autowired
    private DepartService service;
    // 声明服务发现客户端
    @Autowired
    private DiscoveryClient client;

    @Value("${suffix}")
    private String suffix;

    @PostMapping("/save")
    public boolean saveHandler(@RequestBody Depart depart) {
    
    
        depart.setName(depart.getName() + suffix);
        return service.saveDepart(depart);
    }
	...
}

4.2.3 创建消费者工程 06-bus-config-consumer

(1) 创建工程
复制 06-config-consumer,并重命名为 06-bus-config-consumer。
修改启动类更名为ApplicationBusConfigConsumer。

(2) 导入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
<!--actuator依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

(3) 修改配置文件

在这里插入图片描述

spring:
  cloud:
    config:
      uri: http://localhost:9999
      label: master
      name: application-consumer-config
      profile: dev
  # 指定要连接的kafka集群
  kafka:
    bootstrap-servers: kafkaOS1:9092,kafkaOS2:9092,kafkaOS3:9092

# 开启actuator的bus-refresh监控终端
management:
  endpoints:
    web:
      exposure:
        include: bus-refresh

(4) 修改处理器类

@RefreshScope
@RestController
@RequestMapping("/consumer/depart")
public class SomeController {
    
    
    @Autowired
    private RestTemplate restTemplate;
    @Value("${prefix}")
    private String prefix;

    private static final String SERVICE_PROVIDER = "http://abcmsc-provider-depart";
    @PostMapping("/save")
    public boolean saveHandler(@RequestBody Depart depart) {
    
    
        depart.setName(prefix + depart.getName());
        String url = SERVICE_PROVIDER + "/provider/depart/save";
        return restTemplate.postForObject(url, depart, Boolean.class);
    }
	...
}

4.2.4 演示

  • 一开始的配置如下:
    在这里插入图片描述
    在这里插入图片描述

  • 测试
    在这里插入图片描述
    在这里插入图片描述

  • 修改配置
    在这里插入图片描述
    在这里插入图片描述

  • 任意一个ConfigClient提交bus-refresh
    在这里插入图片描述

  • 没有重启应用访问7070的应用测试:
    在这里插入图片描述
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41947378/article/details/109075318
今日推荐