0. 分布式系统面临的问题—-配置问题

微服务架构下,每个微服务的配置文件中都需要配置一大堆的配置,可以提取出公共的部分进行统一管理

1. 概述

image.png

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

2 架构

SpringCloud Config分为 服务端客户端 两部分。

服务端 —- 也称分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密、解密信息等访问接口。

客户端 —- 则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载,配置信息配置服务器默认采用Git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过Git客户端工具来方便的管理和访问配置内容。

3. 作用

  • 集中管理配置文件
  • 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
  • 运行期间动态调整配置,不再需要在每个服务器的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
  • 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置(结合bus)
  • 将配置信息以REST接口的形式暴露
    • post,curl访问刷新均可
  • image.png

    4. 服务端

    4.1 依赖

    1. <!-- 服务端添加 config server -->
    2. <dependency>
    3. <groupId>org.springframework.cloud</groupId>
    4. <artifactId>spring-cloud-config-server</artifactId>
    5. </dependency>

    4.2 主启动类

    @EnableConfigServer
    

    4.3 YAML配置

    ```yaml server: port: 3344

eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka spring: application: name: cloud-config-center cloud: config: server: git:

      # 码云地址
      username: ******
      password: ******
      uri: ******
      # git上面存放配置的文件夹
      search-paths:
        - springcloud-config
  label: master
<a name="8xJBB"></a>
## 4.4 测试
[http://localhost:3344/master/config-dev.yml](http://localhost:3344/master/config-dev.yml)
> 读取到在git(码云)上的配置文件信息

![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616683776335-e42ee818-8e71-4d05-9ec4-b25ff6a4c6b6.png#crop=0&crop=0&crop=1&crop=1&height=123&id=SMZKy&margin=%5Bobject%20Object%5D&name=image.png&originHeight=164&originWidth=1032&originalType=binary&ratio=1&rotation=0&showTitle=false&size=19852&status=done&style=none&title=&width=774)
<a name="EA4cX"></a>
# 5. 客户端
<a name="UpVRi"></a>
## 5.1 依赖
```xml
<!-- 客户端添加 config client -->
<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

5.2 bootstrap.yml配置

参考:application.yml与bootstrap.yml的区别

image.png

server:
  port: 3355

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

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

5.3 主启动

/**
 * @author JShawn 2021/3/25 22:54
 */
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3355 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientMain3355.class, args);
    }
}

5.4 业务类

/**
 * @author JShawn 2021/3/25 22:56
 */
@RestController
public class ConfigClientController {

    // 读取config配置中心的数据返回页面显示
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/configInfo")
    public String getConfigInfo()
    {
        return configInfo;
    }
}

5.5 出现的问题

问题:修改git(码云)config配置中心的配置提交后,config-server可以读取到,但是config-client不能动态获取刷新,每次都需要重启微服务才行。

解决:避免每次更新配置都要重启客户端微服务3355,见下方5.5.1 手动刷新 和5.5.2 动态刷新

5.5.1 手动刷新

5.5.1.1 修改客户端POM

引入actuator监控

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

5.5.1.2 修改客户端YML,暴露监控接口

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

5.5.1.3 客户端业务类Controller增加注解 @RefreshScope

支持Config的动态刷新

// 支持Config的动态刷新
@RefreshScope
public class ConfigClientController {

}

5.5.1.4 给客户端config-client发送POST请求,手动刷新

curl  -X POST "http://localhost:3355/actuator/refresh"

5.5.1.5 查看结果

客户端拉取成功 image.png

5.5.2 动态刷新(重点)

问题:目前手动刷新还是存在问题,就算是写脚本每次统一执行一遍也很麻烦,而且不能定向刷新,比如不更新全部只更新某几个节点的配置信息,这样就很麻烦,需要每一个都执行一遍POST请求。因此,为了满足以上需求需要Bus与Config进行结合使用(见下节:十四、Bus———消息总线