• SpringCloud五大组件 --- Spring Cloud Config 分布式配置


    11. Spring Cloud Config 分布式配置

    Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。使用Config Server,您可以在所有环境中管理应用程序的外部属性。客户端和服务器上的概念映射与Spring EnvironmentPropertySource抽象相同,因此它们与Spring应用程序非常契合,但可以与任何以任何语言运行的应用程序一起使用。随着应用程序通过从开发人员到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切。服务器存储后端的默认实现使用git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。很容易添加替代实现,并使用Spring配置将其插入。

    概述

    分布式系统面临的–配置文件问题

    微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的。spring cloud提供了configServer来解决这个问题,我们每一个微服务自己带着一个application.yml,那上百个的配置文件修改起来,令人头疼!

    什么是SpringCloud config分布式配置中心?

    在这里插入图片描述

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

    spring cloud config 分为服务端客户端两部分。

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

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

    spring cloud config 分布式配置中心能干嘛?

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

    spring cloud config 分布式配置中心与GitHub整合

    由于spring cloud config 默认使用git来存储配置文件 (也有其他方式,比如自持SVN 和本地文件),但是最推荐的还是git ,而且使用的是 http / https 访问的形式。

    入门案例

    搭建Git仓库

    在这里插入图片描述

    生成秘钥

    ssh-keygen -t rsa -C “2xxxxxxxxxx@qq.com”

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    拉取

    在这里插入图片描述

    提交到服务端

    在这里插入图片描述

    在这里插入图片描述

    服务端

    新建springcloud-config-server-3344模块导入pom.xml依赖

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

    resource下创建application.yml配置文件,Spring Cloud Config服务器从git存储库(必须提供)为远程客户端提供配置:

    server:
      port: 3344
    
    spring:
      application:
        name: springcloud-config-server
      # 连接码云远程仓库
      cloud:
        config:
          server:
            git:
              # 注意是https的而不是ssh
              uri: https://gitee.com/hczhczadmin/springcloud-config.git
              # 通过 config-server可以连接到git,访问其中的资源以及配置~
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    主启动类

    @EnableConfigServer // 开启spring cloud config server服务
    @SpringBootApplication
    public class Config_server_3344 {
        public static void main(String[] args) {
            SpringApplication.run(Config_server_3344.class,args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这里已经将本地git仓库springcloud-config文件夹下新建的application.yml提交到码云仓库:

    HTTP服务具有以下格式的资源:

    /{
        application}/{
        profile}[/{
        label}]
    /{
        application}-{
        profile}.yml
    /{
        label}/{
        application}-{
        profile}.yml
    /{
        application}-{
        profile}.properties
    /{
        label}/{
        application}-{
        profile}.properties
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    其中“应用程序”作为SpringApplication中的spring.config.name注入(即常规的Spring Boot应用程序中通常是“应用程序”),“配置文件”是活动配置文件(或逗号分隔列表的属性),“label”是可选的git标签(默认为“master”)。

    测试访问http://localhost:3344/application-dev.yml

    在这里插入图片描述

    测试访问

    在这里插入图片描述

    测试访问 http://localhost:3344/application/test/master

    在这里插入图片描述

    客户端

    将本地git仓库springcloud-config文件夹下新建的config-client.yml提交到码云仓库:

    在这里插入图片描述

    spring:
        profiles:
          active: dev
    
    ---
    server:
      port: 8201
    #spring的配置
    spring:
        profiles: dev
        application:
          name: springcloud-config-dev
    
    
    # Eureka配置:配置服务注册中心地址
    eureka:
      client:
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka/
    
    ---
    server:
      port: 8202
    #spring的配置
    spring:
        profiles: test
        application:
          name: springcloud-config-test
    
    
    # Eureka配置:配置服务注册中心地址
    eureka:
      client:
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    在这里插入图片描述

    在这里插入图片描述

    新建一个springcloud-config-client-3355模块,并导入依赖

    
    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-configartifactId>
        <version>2.1.1.RELEASEversion>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-actuatorartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    resources下创建application.yml和bootstrap.yml配置文件

    bootstrap.yml 是系统级别的配置

    # 系统级别的配置
    spring:
      cloud:
        config:
          name: config-client # 需要从git上读取的资源名称,不要后缀
          profile: dev
          label: master
          uri: http://localhost:3344
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    application.yml 是用户级别的配置

    # 用户级别的配置
    spring:
      application:
        name: springcloud-config-client
    
    • 1
    • 2
    • 3
    • 4

    创建controller包下的ConfigClientController.java 用于测试

    @RestController
    public class ConfigClientController {
        @Value("${spring.application.name}")
        private String applicationName; //获取微服务名称
        @Value("${eureka.client.service-url.defaultZone}")
        private String eurekaServer; //获取Eureka服务
        @Value("${server.port}")
        private String port; //获取服务端的端口号
        @RequestMapping("/config")
        public String getConfig(){
            return "applicationName:"+applicationName +
             "eurekaServer:"+eurekaServer +
             "port:"+port;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    主启动类

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

    测试:

    启动服务端Config_server_3344 再启动客户端ConfigClient

    在这里插入图片描述

    访问:http://localhost:8201/config/

    在这里插入图片描述

    修改为test环境后:

    在这里插入图片描述

    在这里插入图片描述

    小案例

    本地新建config-dept.yml和config-eureka.yml并提交到码云仓库

    在这里插入图片描述

    config-eureka.yml

    spring:
        profiles:
          active: dev
    
    ---
    server:
      port: 7001
      
    #spring的配置
    spring:
        profiles: dev
        application:
          name: springcloud-config-eureka
          
    # Eureka配置
    eureka:
      instance:
        # Eureka服务端的实例名字
        hostname: eureka7001.com
      client:
        # 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
        register-with-eureka: false
        # fetch-registry如果为false,则表示自己为注册中心,客户端的化为 ture
        fetch-registry: false
        # Eureka监控页面~
        service-url:
          #重写Eureka的默认端口以及访问路径 --->http://localhost:7001/eureka/
          # 单机: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
          # 集群(关联):7001关联7002、7003
          defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
    
    ---
    server:
      port: 7001
      
    #spring的配置
    spring:
        profiles: test
        application:
          name: springcloud-config-eureka
          
    # Eureka配置
    eureka:
      instance:
        # Eureka服务端的实例名字
        hostname: eureka7001.com
      client:
        # 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
        register-with-eureka: false
        # fetch-registry如果为false,则表示自己为注册中心,客户端的化为 ture
        fetch-registry: false
        # Eureka监控页面~
        service-url:
          #重写Eureka的默认端口以及访问路径 --->http://localhost:7001/eureka/
          # 单机: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
          # 集群(关联):7001关联7002、7003
          defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    config-dept.yml

    spring:
        profiles:
          active: dev
    
    ---
    server:
      port: 8001
    
    #mybatis的配置
    mybatis:
      type-aliases-package: com.hcz.pojo
      config-location: classpath:mybatis/mybatis-config.xml
      mapper-locations: classpath:mybatis/mapper/*.xml
    
    #spring的配置
    spring:
      profiles:dev
      application:
        name: springcloud-config-dept
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: org.gjt.mm.mysql.Driver
        url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8
        username: root
        password: 123456
    
    # Eureka配置:配置服务注册中心地址
    eureka:
      client:
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
      instance:
        instance-id: springcloud-provider-dept-8001 #修改Eureka上的默认描述信息
        prefer-ip-address: true #改为true后默认显示的是ip地址而不再是localhost
    
    # info配置
    info:
      app.name: hcz-springcloud  # 项目的名称
      company.name: 软件学院      # 公司的名称
    
    ---
    server:
      port: 8001
    
    #mybatis的配置
    mybatis:
      type-aliases-package: com.hcz.pojo
      config-location: classpath:mybatis/mybatis-config.xml
      mapper-locations: classpath:mybatis/mapper/*.xml
    
    #spring的配置
    spring:
      profiles:test
      application:
        name: springcloud-config-dept
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: org.gjt.mm.mysql.Driver
        url: jdbc:mysql://localhost:3306/db02?useUnicode=true&characterEncoding=utf-8
        username: root
        password: 123456
    
    # Eureka配置:配置服务注册中心地址
    eureka:
      client:
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
      instance:
        instance-id: springcloud-provider-dept-8001 #修改Eureka上的默认描述信息
        prefer-ip-address: true #改为true后默认显示的是ip地址而不再是localhost
    
    # info配置
    info:
      app.name: hcz-springcloud  # 项目的名称
      company.name: 软件学院      # 公司的名称
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    在这里插入图片描述

    在这里插入图片描述

    新建springcloud-config-eureka-7001模块,并将原来的springcloud-eureka-7001模块下的内容拷贝的该模块。

    <dependencies>
            
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-configartifactId>
                <version>2.1.1.RELEASEversion>
            dependency>
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-eureka-serverartifactId>
                <version>1.4.6.RELEASEversion>
            dependency>
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-devtoolsartifactId>
            dependency>
        dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    1.清空该模块的application.yml配置,并新建bootstrap.yml连接远程配置

    # 系统级别的配置
    spring:
      cloud:
        config:
          name: config-eureka # 需要从git上读取的资源名称,不要后缀
          profile: dev
          label: master
          uri: http://localhost:3344
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.主启动类

    @SpringBootApplication
    @EnableEurekaServer  //服务端的启动类,可以接受别人注册进来
    public class ConfigEurekaServer_7001 {
        public static void main(String[] args) {
            SpringApplication.run(ConfigEurekaServer_7001.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.测试

    第一步:启动 Config_Server_3344,并访问 http://localhost:3344/master/config-eureka-dev.yml

    在这里插入图片描述

    第二部:启动ConfigEurekaServer_7001,访问 http://localhost:7001/ 测试

    在这里插入图片描述

    显示上图则成功

    ====================================================================

    新建springcloud-config-dept-8001模块并拷贝springcloud-provider-dept-8001的内容

    在pom.xml中添加spring cloud config依赖

    
    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-configartifactId>
        <version>2.1.1.RELEASEversion>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    同理导入spring cloud config依赖、清空application.yml 、新建bootstrap.yml配置文件并配置

    spring:
      cloud:
        config:
          name: config-dept
          label: master
          profile: dev
          uri: http://localhost:3344
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    主启动类

    @SpringBootApplication
    @EnableEurekaClient //在服务启动后自动注册到Eureka中!
    @EnableDiscoveryClient //服务发现~
    @EnableCircuitBreaker //
    public class ConfigDeptProvider_8001 {
        public static void main(String[] args) {
            SpringApplication.run(ConfigDeptProvider_8001.class,args);
        }
        //增加一个 Servlet
        @Bean
        public ServletRegistrationBean hystrixMetricsStreamServlet(){
            ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
            registrationBean.addUrlMappings("/actuator/hystrix.stream");
            return registrationBean;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    测试

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    OS | 【一 概述】强化阶段 —— 应用题总结
    算法题:摆动序列
    GBase 8s是如何保证数据一致性
    iOS开发基础109-网络安全
    SENSORO 城市数字化服务平台入围2023《财富》中国最佳设计榜
    Executors-四种创建线程的手段
    计算机毕业设计ssm社区爱心活动网站be83l系统+程序+源码+lw+远程部署
    解决小程序中textarea ios端样式不兼容的方法
    上海无居住证120积分随迁子女如何求学(中考)
    MySQL第二讲·表的创建与修改
  • 原文地址:https://blog.csdn.net/hcz666/article/details/126404464