美文网首页微服务开发实战
配置中心 Spring Cloud Config

配置中心 Spring Cloud Config

作者: 董二弯 | 来源:发表于2019-06-09 15:18 被阅读1次

    当我们的后台服务逐渐增多,各个服务的配置也越来越多,随之而来的就是一个配置管理问题,各自管各自的开发时没什么问题,到了线上之后管理就会很头疼,到了要大规模更新就更麻烦了。这时候Spring Cloud Config的作用就体现出来了,它是一个统一管理配置的组件。它支持配置统一放在内存中(即本地),也支持放在远程Git仓库中,也支持放在关系型数据库中。在spring cloud config 组件中,分两个角色,一是Config Server,二是Config Client。Config Server用于管理配置并暴露Http API接口,Config Client通过暴露的接口来读取配置文件。
    本章依然使用前面讲解其他组件所建的工程,github地址

    Config Server从本地读取配置文件

    这种方式是本地仓库模式。本地仓库指将所有的配置文件统一写在Config Server工程目录下。现搭建一个Config Server和Config Client,Config Server采用本地仓库模式。

    • 创建一个Module工程,工程名取为config-server。在pom文件中添加Config Server的起步依赖。
    <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-config-server</artifactId>
     </dependency>
    
    • 在启动类加上@EnableConfigServer注解,开启Config Server的功能。@EnableEurekaClient开启EurekaClient的功能。
    @SpringBootApplication
    @EnableEurekaClient
    @EnableConfigServer
    public class ConfigServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(ConfigServerApplication.class, args);
        }
    }
    
    • 在配置文件中做相关的配置,其中主要是通过spring.profiles.active=native来配置从本地读取配置,读取路径为classpath下的shared目录。
    server:
      port: 8090
    spring:
      cloud:
        config:
          server:
            native:
              search-locations: classpath:/shared
      profiles:
        active: native
      application:
        name: config-server
    
    • 在resources目录下建一个shared文件夹,在其中新建一个eureka-client-dev.yml文件,用于模拟eureka-client工程dev(开发环境)的配置文件。
      eureka-client-dev.yml
    name: dzy  #这里仅仅添加一个变量
    
    • 在eureka-client工程的pom文件中添加Config的启动依赖。
    <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    
    • 新建配置文件bootstrap.yml,在其中添加配置如下
    spring:
      application:
        name: eureka-client
      cloud:
        config:
          fail-fast: true  #如果没有读取成功,则执行快速失败
          profile: dev   # 读取的是dev文件
          discovery:
            enabled: true
            serviceId: config-server # config-server的服务实例名称
    

    注意
    这里用的必须是bootstrap.yml,而不是application.yml。bootstrap相对于application具有优先的执行顺序。其中配置文件中变量{spring.application.name}和变量{spring.profiles.active},两者以“-”相连,构成了向config server读取的配置文件名。本列中为eureka-client-dev.yml。

    • 在eureka-client中添加一个controller来获取config server中的配置,代码如下
    @RestController
    public class ConfigController {
        @Value("${name}")
        private String name;
    
        @GetMapping("/name")
        public String config() {
            return "I am " + name;
        }
    }
    
    • 测试
      其中eureka-server、eureka-client、config-server。访问eureka-client的“/name”的映射接口。可以看到从配置中心中读取到变量name的值。

    Config Server从远程Git仓库读取配置文件

    这种模式 Config Server不从本地的仓库读取,而是从Git仓库读取配置。

    • 修改config-server的配置,把本地改为Git仓库地址。
    server:
      port: 8090
    spring:
      application:
        name: config-server
      cloud:
        config:
          server:
            git:
              uri: https://github.com/dzydzydzy/spring-cloud.git #git仓库地址
              search-paths: eureka-client  #为搜索远程仓库的文件夹地址
              username:    #git仓库登录用户名
              password:    #git仓库登录密码
          label: master   # git仓库的分支名
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
    
    • 在对应git仓库地址中建立配置文件


      image.png
    • 测试
      其中eureka-server、eureka-client、config-server。访问eureka-client的“/name”的映射接口。可以看到从配置中心中读取到变量name的值。

    构建高可用的Config Server

    只需要把Config Server和Config Client向Eureka Server注册,且将Config Server多实例集群部署。

    使用Spring Cloud Bus刷新配置

    以上的方式当仓库中配置更改时,需要重新启动config client才能实现配置的更改。Spring Cloud Bus的一个功能让这个过程变的简单,当远程git仓库的配置更改后,只需要向某一个微服务实例发送一个post请求,通过消息组件通知其他微服务实例重新拉取配置文件。如图,当远程Git仓库的配置更改后,通过发送“/bus/refresh”Post请求给某一个微服务实例,通过消息组件,通知其他微服务实例更新配置。


    image.png
    • 只需要改造Config Client,本列中改造eureka-client,现在组件用RabbitMQ。首先需要在pom中引用RabbitMQ实现的Spring Cloud Bus的起步依赖。在此之前需要在本地安装RabbitMQ服务器。
    <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
    
    • 在配置文件中添加RabbitMQ的相关配置。
    spring:
      rabbitmq:
        host:  #rabbitmq服务器ip地址
        port:  #rabbitmq服务器端口
        username: #rabbitmq服务器用户名
        password: #rabbitmq服务器密码
    management:
      security:
        enabled: false  #通过消息总线更改配置,需要经过安全验证,这里为了方便先屏蔽安全验证
    
    • 需要在更新的配置类上加@RefreshScope注解,这样才会在不重启服务的情况下更新配置
    @RestController
    @RefreshScope
    public class ConfigController {
        @Value("${name}")
        private String name;
    
        @GetMapping("/name")
        public String config() {
            return "I am " + name;
        }
    }
    
    • 测试
      其中eureka-server、eureka-client、config-server。访问eureka-client的“/name”的映射接口。可以看到从配置中心中读取到变量name的值。此时改变git仓库变量的值,通过postman发送刷新配置请求http://localhost:8763/bus/refresh。再次访问“/name”的映射接口,可以发现没有重启也能访问到改变后的变量。

    注意
    “bus/refresh"API接口可以指定服务,使用"destination"参数,例如"/bus/refresh?destination=eureka-client:**",即刷新服务名为eureka-client的所有服务实例。

    总结

    本章学习了为什么要使用Spring Cloud Config,以及Config Server在本地和GitHub上读取配置的两者方式,最后介绍了通过Spring Cloud Bus在不启动服务实例时获取最新的配置。在下一章一起学习服务链路追踪——Spring Cloud Sleuth

    相关文章

      网友评论

        本文标题:配置中心 Spring Cloud Config

        本文链接:https://www.haomeiwen.com/subject/wsugxctx.html