SpringCloud-2.0-周阳(13. 分布式配置中心 - SpringCloud Config)

Posted ABin-阿斌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud-2.0-周阳(13. 分布式配置中心 - SpringCloud Config)相关的知识,希望对你有一定的参考价值。

上一篇 :12. 服务网关 - Gateway

下一篇 :14. 消息总线 - SpringCloud Bus

  • 声明:原文作者:csdn:yuan_404

文章目录

文章目录

1 . 概述

2 . 搭建 Git 环境

  1. 在 Git 中新建自己的仓库

    我这里选择的是 Gitee 码云

    我新建了一个 spring-cloud-2.0-config 的仓库

  2. 将仓库克隆到本地

    我就直接克隆到了项目中

  3. 新建三个配置文件

    config-dev.yml 、config-prod.yml 、config-test.yml

3 . Config服务端

3.1 配置中心的搭建

  1. 新建模块 :cloud-config-center-3344

    它为 Cloud 的配置中心模块 cloudConfig Center

  2. 修改 POM

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>com.demo.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>
    
    
  3. 编写 YML

    server:
      port: 3344
    spring:
      application:
        name: cloud-config-center
      cloud:
        config:
          server:
            git:
              # 填写自己的 github 路径
              uri:  https://gitee.com/yuan934672344/spring-cloud-2.0-config.git
              search-paths:
                - springcloud-config
          label: master
    eureka:
      client:
        service-url:
          defaultZone:  http://localhost:7001/eureka
    
    
  4. 编写主启动类

    @SpringBootApplication
    @EnableConfigServer
    public class ConfigCenterMain3344 
        public static void main(String[] args) 
                SpringApplication.run(ConfigCenterMain3344 .class,args);
            
    
    
    
  5. 修改一下 config-dev.yml

    config:
      info: "config-dev.yml"
    
    
  6. 启动 Config-Center-3344 ,测试

    访问 :http://localhost:3344/config-dev.yml

3.2 配置文件读取规则

  • 配置资源的五种访问形式(官网截图)

  • 上述访问形式中占位符的含义

4 . Config客户端

4.1 配置客户端

  1. 新建模块 :cloud-config-client-3355

  2. 修改 POM

    <dependencies>
        <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.demo.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>
    
    
  3. 编写 YML

    注意是 bootstrap.yml,不是 application

    server:
      port: 3355
    
    spring:
      application:
        name: config-client
      cloud:
        config:
          # 分支名称
          label: master
          # 配置文件名
          name: config
          # 环境
          profile: dev
          # 配置中心的地址
          uri: http://localhost:3344
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:7001/eureka
    
    
  • 说明 :
  • applicaiton.yml 是用户级的资源配置项
  • bootstrap.yml 是系统级的,优先级更加高
  • Spring Cloud 会创建一个 Bootstrap Context ,作为 Spring 应用的 Application Context上下文。初始化的时候,BootstrapContext 负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的 Environment
  • Bootstrap 属性有高优先级,默认情况下,它们不会被本地配置覆盖。Bootstrap context 和 Application Context 有着不同的约定,所以新增了一个 bootstrap.yml 文件,保证 Bootstrap Context 和 Application Context 配置的分离。
  • 要将 Client 模块下的 application.yml 文件改为 bootstrap.yml ,这是很关键的,因为 bootstrap.yml 是比 application.yml 先加载的。bootstrap.yml 优先级高于 application.yml
  1. 编写主启动类

    @SpringBootApplication
    public class ConfigClientMain3355 
        public static void main(String[] args) 
            SpringApplication.run( ConfigClientMain3355.class,args);
        
    
    
    
  2. 简单修改一下 config-dev.yml 文件

    为了可以比较直观的看到、区分结果

  3. 业务类

  • Controller : ConfigClientController

    @RestController
    public class ConfigClientController 
    
        @Value("$config.info")
        private String configInfo;
    
        @GetMapping("/configInfo")
        public String getConfigInfo()
            return configInfo;
        
    
    
    
  1. 启动测试

    启动 Config-Center-3344 、Config-Client-3355

    访问 :http://localhost:3355/configInfo

  2. 再次修改 config-dev.yml 文件

  3. 不重启,测试

    Config-Center 端,直接刷新就可以得到更新的信息

    但是 Config-Client 端得不到更新的信息,只有重启

  • 但是实际运用中不可能一直重启项目,所以就需要动态刷新

4.2 避免重启 - 动态刷新

  • 修改 Config-Client-3355 模块
  1. 修改 POM

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
    
  2. 修改 YML

    暴露监控端口

    management:
      endpoints:
        web:
          exposure:
            include: "*"
    
    

  3. 修改 Controller,添加注解 @RefreshScope

  4. 修改 Config-dev 文件

  5. 测试

    访问 :http://localhost:3344/config-dev.yml

    访问 :http://localhost:3355/configInfo

    因为修改了代码,项目会热部署自动重启,所以 Version-3.0 会被更新过来,但是 Version-4.0 是在重启之后更改的,所以没有更新过来。

  • 还是没有更新成功

  • 这是因为 需要运维人员发送Post请求刷新3355

  • 必须是 POST 请求

  • 使用 CMD 的 CURL 命令

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

  • 再次测试

4.3 避免大量刷新语句 - 消息总线

  • 上述情况只有一个Client-3355,如果修改配置文件后,需要主动刷新大量的客户端,这样的方法就太麻烦了。
  • 简单的处理方法是写一个脚本,自动刷新这些客户端
  • 高级一点的就是使用消息总线

5 . 将 springcloud-config 与之前的项目整合

  • 因为模块太多,这里就整合一个,举个例子
  • 修改 cloud-provider-payment-8001
  1. 修改 POM

    确保 POM 文件中有一下依赖

    <!-- Spring-Cloud-Config -->
    <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
    	  <groupId>org.springframework.boot</groupId>
    	  <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
    
  2. 修改原来的 application.yml

    将自己独有的配置信息保留,比如端口号、在 Eureka 中配置的实例名等

    # ---------------- 远程配置 ----------------
    server:
      port: 8001
    eureka:
      instance:
        instance-id: payment-8001
    
    
  3. 在 Git 中创建一个 cloud-payment-service.yml

    这个名字可以可以和服务名一致

    将上一步中,提取的公共的配置代码,写入这个文件

    除此之外,还要添加上 环境(dev)、动态刷新的配置

    spring:
    # 配置环境
      profiles: dev
      # 配置服务名称
      application:
        name: cloud-payment-service
      # 配置数据源
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: org.gjt.mm.mysql.Driver
        url: jdbc:mysql://localhost:3306/spring_cloud_01?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
        username: root
        password: 123456
    
    # 配置 Mybatis 的包扫描
    mybatis:
      type-aliases-package: com.demo.springcloud.pojo
      mapper-locations: classpath:mapper/*.xml
    
    # Eureka 相关配置
    eureka:
      client:
        # 是否将自己注册进 Eureka Server
        register-with-eureka: true
        # 是否从 Eureka Server 抓取已有的注册信息
        # 集群的话这里必须设置为 True 才能配合 Ribbon 使用负载均衡
        fetchRegistry: true
        service-url:
          defaultZone: http://localhost:7001/eureka, http://localhost:7002/eureka
      instance:
        prefer-ip-address: true
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    
    
  4. 新建一个 bootstrap.yml

    spring:
      cloud:
        config:
          # 分支名称
          label: master
          # 配置文件名
          name: cloud-payment-service
          # 环境
          profile: dev
          # 配置中心的地址
          uri: http://localhost:3344
    
    
  5. 修改 Controller,添加 @RefreshScope

  6. 启动测试

    启动 Eureka-7001、Config-Center-3344、Provider-8001

    访问 :http://localhost:3344/cloud-payment-service-dev.yml

    访问 :http://localhost:8001/provider/getPaymentById/1

  • 至此 Provider-payment-8001 的远程配置就配置完成,其余的都是一样的套路

以上是关于SpringCloud-2.0-周阳(13. 分布式配置中心 - SpringCloud Config)的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud-2.0-周阳:(12. 服务网关 - Gateway)

SpringCloud-2.0-周阳(24. 分布式事务 - Seata)

SpringCloud-2.0-周阳(25. 简述 Seata 的原理)

SpringCloud-2.0-周阳(16. 请求链路追踪 - SpringCloud Sleuth)

SpringCloud-2.0-周阳(23. 熔断降级 - Sentinel)

SpringCloud-2.0-周阳(20.Nacos 集群和持久化配置)