前提:

一个微服务都有一个application.properties 那么随着服务越来越多配置文件也越来越多,假如现在30个微服务都连的是同一个数据库,那么改一处,就要改30个地方

所以,一套集中式的,动态的配置管理设置是必不可少的
SpringCloud Config 为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置

概念:
image.png
SpringCloud Config 为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置
由于SpringCloud Config默认使用Git来存储配置文件,最推荐与github整合

配置中心都能干什么?

  1. 集中管理配置文件
  2. 不同环境不同配置,分环境
  3. 运行期间动态调整配置
  4. 当配置发生变化时,服务不需要重启即可感知到配置的变化并应用新的配置

配置中心构建 :
服务名:cloud-config-center-3344
添加pom:

  1. <dependencies>
  2. <!-- 分布式配置中心 -->
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-config-server</artifactId>
  6. </dependency>
  7. <!--同样需要注册到eureka中-->
  8. <dependency>
  9. <groupId>org.springframework.cloud</groupId>
  10. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  11. </dependency>
  12. <dependency>
  13. <groupId>com.yixuexi.springcloud</groupId>
  14. <artifactId>cloud-api-commons</artifactId>
  15. <version>${project.version}</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-actuator</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-devtools</artifactId>
  28. <scope>runtime</scope>
  29. <optional>true</optional>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.projectlombok</groupId>
  33. <artifactId>lombok</artifactId>
  34. <optional>true</optional>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-starter-test</artifactId>
  39. <scope>test</scope>
  40. </dependency>
  41. </dependencies>

创建git仓库,放置config文件
image.png
Yaml文件:

server:
  port: 3344
spring:
  application:
    name: cloud-config-center
  cloud:
    config:
      server:
        git:
          # Github上面git仓库的地址
          uri: https://github.com/tongziyu/springcloud_config.git
          # 搜索的目录
          search-paths:
            - springcloud-config
      # 分支
      label: master

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

主启动类:
@EnableConfigServer 激活配置中心

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

这个时候直接访问即可获取gitlab上指定配置文件的内容:
localhost:3344/master/config-dev.yml
image.png

读取配置文件的规则:

2.1 /{label}/{application}-{profile}.yml(最推荐使用这种方式)

① 读取master分支

② 读取dev分支

2.2 /{application}-{profile}.yml

没有了分支那一项,是因为在application.yaml中配置了 label: master
所以会先去读取master的 (就算不配label 也会先去master寻找)

2.3 /{application}-{profile}[/{label}]

这样读取的是 JSON串

创建被管理配置文件的客户端:
pom文件: 他们的区别就是 客户端的pom是

<dependencies>
  <!-- 客户端的config 依赖 -->
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  </dependency>
  <dependency>
    <groupId>com.atguigu.springcloud</groupId>
    <artifactId>cloud-api-commons</artifactId>
    <version>${project.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

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

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
  </dependency>

  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

image.png

bootstrap.yaml

① bootstrap.yaml是什么

简单理解:bootstrap.yaml 是用来读取并使用github上公共的配置的,而application.yaml是模块自用的

application.yaml 是用户级的资源配置项
bootstrap.yaml是系统级的,优先级更高。

SpringCloud会创建一个 “Bootstrap Context”,作为Spring应用的”Application Context”的父上下文,初始化的时候,“Bootstrap Context”负责从外部源加载配置属性并且解析属性,这两个上下文共享一个从外部获取的”Environment”[环境]

BootStrap 属性有高优先级,默认情况下,他们不会被本地配置覆盖,“Bootstrap Context” 和“Application Context” 有着不同的约定,所以新增一个“bootstrap.yaml”文件保证“Bootstrap Context” 和“Application Context”配置的分离

要将Client模块下的 application.yml文件改为bootstrap.yml,这是很关键的。
因为bootstrap.yaml是要比application.yaml先加载的,bootstrap.yaml优先级高于application.yaml

server:
  port: 3355
spring:
  cloud:
    config:
      label: master # 哪个分支
      name: config  # 什么名字
      profile: dev  # 名字-xxx  什么环境
      uri: http://localhost:3344  # 配置中心地址
      # 上面的进行拼接后位: http://localhost:3344/master/config-dev.yaml

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

主启动类没有特别之处

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

业务类:

@RestController
public class ConfigController {
    /**
     * 这里取的值是从github上取回来的
     */
    @Value("${config.info}")
    private String configInfo;

    @RequestMapping("/test/config/info")
    public String test(){
        return configInfo;
    }
}

客户端的动态刷新:

2.1 修改3355客户端模块

2.1 添加依赖 图形化监控

<!--图形化监控依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2.2 修改yaml,暴露监控端口

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

2.3 controller层添加@RefreshScope注解

@RefreshScope
@RestController
public class ConfigController {
    /**
     * 这里取的值是从github上取回来的
     */
    @Value("${config.info}")
    private String configInfo;

    @RequestMapping("/test/config/info")
    public String test(){
        return configInfo;
    }
}

2.4 运维修改github之后 给3355发一个post请求

目的是告诉3355 github上的配置文件已经修改了,请重新加载

发送的地址为 :http://localhost:3355/actuator/refresh 【注意是post请求】

2.5 测试