zoukankan      html  css  js  c++  java
  • 8、SpringCloud-Config(Git远程配置)

    Spring Cloud Config 分布式配置

    Dalston.RELEASE

    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 访问的形式。

    简单案例配置:

    服务端

    1、上传配置到码云

    上传配置文件到码云上面,关于git的操作可以参考我的上一篇博客~

     2、新建springcloud-config-server-3344项目,添加依赖

    dependencies>
       <!--web-->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <!--config-->
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-config-server</artifactId>
           <version>2.1.1.RELEASE</version>
       </dependency>
       <!--eureka-->
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-eureka</artifactId>
           <version>1.4.6.RELEASE</version>
       </dependency>
    /dependencies>

    3、编写application.yaml配置

    server:
      port: 3344
    
    spring:
      application:
        name: springcloud-config-server
      # 连接码云远程仓库
      cloud:
        config:
          server:
            git:
              uri: https://gitee.com/zhang-zhixi/springcloud-config.git
              
    # 不加这个配置会报Cannot execute request on any known server 这个错:连接Eureka服务端地址不对
    # 或者直接注释掉eureka依赖 这里暂时用不到eureka
    eureka:
      client:
        register-with-eureka: false
        fetch-registry: false

    4、测试读取码云上的配置文件

    开启3344端口

    访问:http://localhost:3344/application-dev.yaml

    客户端:

    1、在码云项目文件中新建配置:config-client.yaml

    spring:
      profiles:
        active: dev
    
    ---
    server:
      port: 8201
    # spring配置
    spring:
      profiles: dev
      application:
        name: springcloud-provider-dept
    #Eureka配置
    eureka:
      client:
        service-url: #监控页面~
          defaultZone: http://eureka7001.com:7001/eureka/
    
    ---
    server:
      port: 8202
    # spring配置
    spring:
      profiles: test
      application:
        name: springcloud-provider-dept
    #Eureka配置
    eureka:
      client:
        service-url: #监控页面~
          defaultZone: http://eureka7001.com:7001/eureka/

    2、上传到码云

     3、新建springcloud-config-server-3355项目,导入pom依赖

     <dependencies>
         <!--config-->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-config</artifactId>
             <version>2.1.1.RELEASE</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-actuator</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
     </dependencies>

     4、编写配置:resources

    bootstrap.yml 是系统级别的配置

    spring:
      cloud:
        config:
          # 用于获取远程属性的应用程序的名称
          name: config-client
          # 远程服务器的URI(默认为http:// localhost:8888)。
          uri: http://localhost:3344
          # 用于拉取远程配置属性的标签名称。 默认设置是在服务器上设置的(通常是基于git的服务器的“ master”)
          label: master
          # 获取远程配置的默认环境
          profile: dev

    application.yml 是用户级别的配置

    server:
      port: 3355
    spring:
      application:
        name: springcloud-config-client-3355

    5、编写controller:ClientController

    @RestController
    public class ClientController {
    
        // 读取端口
        @Value("${server.port}")
        private String serverPort;
        // 读取应用名称
        @Value("${spring.application.name}")
        private String appName;
        // 读取eureka
        @Value("${eureka.client.service-url.defaultZone}")
        private String eurekaConfig;
    
        @RequestMapping("/config")
    public String config() {
            return serverPort + "
    " + appName + "
    " + eurekaConfig + "
    ";
        }
    }

    6、编写主启动文件Client_3355

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

    7、测试

    1.启动springcloud-config-server-3344(服务端访问git)

      访问http://localhost:3344/config-client-dev.yaml,可以拿到git上的文件,说明成功读取到client配置文件、

    2.启动springcloud-config-server-3355(客户端访问服务端)

      其实是客户端通过访问服务端从而拿到git上面的文件

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

     远程配置服务实战测试

    远程注册中心设置zureka:

    1、创建配置文件:

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

     config-eureka.yaml:

    spring:
      profiles:
        active: dev
    ---
    server:
      port: 7001
    
    # spring配置
    spring:
      profiles:
        active: dev
    
    #Eureka配置
    eureka:
      instance:
        hostname: eureka7001.com #Eureka服务端的实例名字
      client:
        register-with-eureka: false #表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
        fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心
        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:
        active: test
    
    #Eureka配置
    eureka:
      instance:
        hostname: eureka7001.com #Eureka服务端的实例名字
      client:
        register-with-eureka: false #表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
        fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心
        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/
    View Code

    config-dept.yaml:

    spring:
      profiles:
        active: dev
    
    # 环境一
    ---
    server:
      port: 8001
    
    # mybatis配置
    mybatis:
      type-aliases-package: com.zhixi.pojo
      config-location: classpath:mybatis/mybatis-config.xml
      mapper-locations: classpath:mybatis/mapper/*.xml
    
    # spring配置
    spring:
      profiles: dev
      application:
        name: springcloud-provider-dept # 三个服务名称一致
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: org.gjt.mm.mysql.Driver
        url: jdbc:mysql://localhost:3306/db01?userSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
        username: root
        password: zhixi158
    
    # 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上的默认描述信息
    
    # info配置
    info:
      # 项目的名称
      app.name: zhixi-springcloud
      # 公司的名称
      company.name: com.zhixi.study
    
    
    
    
    
    # 环境一
    ---
    server:
      port: 8001
    
    # mybatis配置
    mybatis:
      type-aliases-package: com.zhixi.pojo
      config-location: classpath:mybatis/mybatis-config.xml
      mapper-locations: classpath:mybatis/mapper/*.xml
    
    # spring配置
    spring:
      profiles: test
      application:
        name: springcloud-provider-dept # 三个服务名称一致
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: org.gjt.mm.mysql.Driver
        url: jdbc:mysql://localhost:3306/db02?userSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
        username: root
        password: zhixi158
    
    # 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上的默认描述信息
    
    # info配置
    info:
      # 项目的名称
      app.name: zhixi-springcloud
      # 公司的名称
      company.name: com.zhixi.study
    View Code

     2、上传到git

     上传方法跟上面一样,不必多说了~

    3、新建模块

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

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

    spring:
      cloud:
        config:
          name: config-eureka # 仓库中的配置文件名称
          label: master
          profile: dev
          uri: http://localhost:3344

    2.application.yaml配置

    spring:
      application:
        name: springcloud-config-eureka-7001

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

    <!--config-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>

    4.主启动类EurekaConfig_Run_7001

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

    5.测试

    启动 Config_Server_3344 

    访问http://localhost:3344/config-eureka-dev.yaml,出现以下页面说明能够成功访问到git上的配置:

     启动springcloud-config-eureka-7001

     访问:http://localhost:7001/,可以看到成功访问到了注册中心

     

     服务提供者设置:provider

    1、新建模块

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

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

    2、pom依赖

    <dependencies>
            <!--config-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
                <version>2.1.1.RELEASE</version>
            </dependency>
            <!--我们需要拿到实体类,所以要配置api moudle-->
            <dependency>
                <groupId>com.zhixi</groupId>
                <artifactId>springcloud-01-api</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
            </dependency>
            <!--test-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-test</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jetty</artifactId>
            </dependency>
            <!--热部署-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
            </dependency>
            <!--Eureka-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
                <version>1.4.6.RELEASE</version>
            </dependency>
            <!--完善监控信息-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!--Eureka依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
                <version>1.4.6.RELEASE</version>
            </dependency>
            <!--actuator完善监控信息-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    
        </dependencies>
    View Code

    3、编写配置信息

    application.yaml

    spring:
      application:
        name: springcloud-provider-config-dept-8001

    bootstrap.yaml

    spring:
      cloud:
        config:
          name: config-dept # 仓库中的配置文件名称
          label: master
          profile: dev
          uri: http://localhost:3344

    4、编写主启动类

    // 启用发现客户端
    @EnableDiscoveryClient
    // 开启Eureka客户端注解,在服务启动后自动向注册中心注册服务
    @EnableEurekaClient
    // 启动类
    @SpringBootApplication
    public class DeptConfigProvider_8001 {
        public static void main(String[] args) {
            SpringApplication.run(DeptConfigProvider_8001.class, args);
        }
    }

    5、测试

    启动springcloud-config-server-3344(服务端访问git)

    启动springcloud-config-eureka-7001(注册中心

    启动springcloud-provider-config-dept-8001(服务提供)

    可以看到远程配置的8001已经生效了~

     然后通过远程git服务来访问业务,发现也是没有问题的:

  • 相关阅读:
    27 Spring Cloud Feign整合Hystrix实现容错处理
    26 Spring Cloud使用Hystrix实现容错处理
    25 Spring Cloud Hystrix缓存与合并请求
    24 Spring Cloud Hystrix资源隔离策略(线程、信号量)
    23 Spring Cloud Hystrix(熔断器)介绍及使用
    22 Spring Cloud Feign的自定义配置及使用
    21 Spring Cloud使用Feign调用服务接口
    20 Spring Cloud Ribbon配置详解
    19 Spring Cloud Ribbon自定义负载均衡策略
    18 Spring Cloud Ribbon负载均衡策略介绍
  • 原文地址:https://www.cnblogs.com/zhangzhixi/p/14389766.html
Copyright © 2011-2022 走看看