@Spring Cloud | NO.4 - 配置中心 Config

什么是Spring Cloud Config

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

以上内容为官方直译

项目集成之配置中心

Config Server

1. pom.xml中添加Maven依赖


    
    org.springframework.boot
    spring-boot-starter-parent
    2.0.1.RELEASE
     



    UTF-8
    UTF-8
    1.8



    
        
        org.springframework.cloud
        spring-cloud-starter-netflix-eureka-client
    
    
        
        org.springframework.cloud
        spring-cloud-config-server
    
    
        org.springframework.boot
        spring-boot-starter-web
    



    
        
        
            org.springframework.cloud
            spring-cloud-dependencies
            Finchley RC1
            pom
            import
        
    

2. 添加注解支持

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

3. application.yml配置

spring:
  application:
    name: config-server
  cloud:
    config:
      enabled: true
      server:
        git:
          # git仓库地址
          uri: https://github.com/kevin-yang-work/SpringcloudConfig/
          # 配置仓库路径下的相对搜索位置,可以配置多个
          search-paths: respo
          username:
          password:
#        svn:
#          uri: http://svn.kevin.com/svn/repos/config-repos/
#          # 客户端来选择
##          default-label: trunk
#          username: kevin
#          password: kevin
#          search-paths: demo
      name: config-client
      # 仓库的分支,默认为master
      label: master

#  profiles:
#    # 如果使用subversion必须加
#    include: subversion

server:
  port: 8888

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
Git仓库信息根据实际情况进行填写
SVN仓库配置见注释内容,后续做详细说明
这里我们将 配置服务中心注册到 Eureka,实现配置服务中心的高可用

至此springCloud配置中心服务端配置完毕。

4. 运行概览

我们在远程仓库中添加一个config-client-dev.properties的文件,内容如下:

foo = foo version 3
其中 config-client对应到客户端 spring.cloud.config.name属性, dev对应到客户端 spring.cloud.config.profile属性

启动程序,访问http://localhost:8888/config-...

{"name":"config-client","profiles":["dev"],"label":null,"version":"dd5e327223129b3d6d73a5e87b8cdf0a4031619c","state":null,"propertySources":[{"name":"https://github.com/kevin-yang-work/SpringcloudConfig//respo/config-client-dev.properties","source":{"foo":"foo version 3"}}]}
返回以上结果证明配置服务中心可从远程仓库获取到配置信息

HTTP具有以下格式的资源(作为客户端访问格式说明):

/{name}-{profiles}.properties
/{name}-{profiles}.yml
/{label}/{name}-{profiles}.properties
/{label}/{name}-{profiles}.json
/{name}-{profiles}.json
/{label}/{name}-{profiles}.yml
其中 name作为 spring.cloud.config.name注入, profiles作为 激活的配置文件或者 spring.cloud.config.name注入, label是可选的git标签(默认为master)

Config Client

1. pom.xml引入Maven依赖


    
    org.springframework.boot
    spring-boot-starter-parent
    2.0.1.RELEASE
     



    UTF-8
    UTF-8
    1.8



    
        
        org.springframework.cloud
        spring-cloud-starter-netflix-eureka-client
    
    
        
        org.springframework.cloud
        spring-cloud-starter-config
    
    
        org.springframework.boot
        spring-boot-starter-web
    



    
        
        
            org.springframework.cloud
            spring-cloud-dependencies
            Finchley RC1
            pom
            import
        
    

2. application.yml配置

spring:
  application:
    name: config-client
  cloud:
    config:
      name: config-client
      label: master
      profile: dev
#      uri: http://localhost:8888/
      discovery:
        enabled: true
        service-id: config-server

server:
  port: 8882

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
这里我们将服务端和客户端都注册到 服务注册中心(Eureka),那么可以通过 discovery下的属性进行 配置服务中心注册,如果不使用服务注册中心,指明 spring.cloud.config.uri属性为配置服务中心地址即可

至此配置服务中心客户端配置完毕。

4. 运行概览

  • 添加REST接口,从配置中心读取foo属性。

    @SpringBootApplication
    @RestController
    public class ConfigClientApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ConfigClientApplication.class, args);
        }
    
        @Value("${foo}")
        String foo;
        @RequestMapping(value = "/hi")
        public String hi(){
            return foo;
        }
    }
  • 启动程序访问http://localhost:8881/hi,结果如下:

    foo version 3

广播远程应用配置文件的更新

上述实现客户端从配置中心读取配置文件中的属性,但是如果配置文件属性有变更,如何将更改应用到所有的客户端呢?这就是此节需要讲述的内容。我们通过Spring Cloud Bus实现通知配置文件的变更。

1. pom.xml引入Maven依赖


    
    org.springframework.cloud
    spring-cloud-starter-bus-amqp


    org.springframework.boot
    spring-boot-starter-actuator


    
    org.springframework.boot
    spring-boot-starter-aop


    
    org.springframework.retry
    spring-retry
消息服务总线需要 actuator的支持,这里还加入了 重试机制的依赖,如果不需要可以忽略

2. application.yml的变更

spring:
  rabbitmq:
    host: rabbitmq.kevin.com
    port: 5672
    username: rabbitmq
    password: rabbitmq
management:
  endpoints:
    web:
      base-path: /
      exposure:
        include: "*"
这里消息服务总线我们需要rabbitMq的支持,请自行配置rabbitMq环境
同样对于 actuator,我们在这里暴露所有端口,如应用到生产,请谨慎选择,这里用到的 endpointbus-refresh,用于配置文件的更新
注意:management.endpoints.web.base-path定义监控根路径,默认为:/actuator

3. 运行概览

启动一个eureka-server,一个confg-server,两个config-client,端口为: 88818882

访问 http://localhost:8881/hi 浏览器显示:
(或访问 http://localhost:8882/hi)

foo version 3

这时我们去代码仓库将foo的值改为“foo version 4”,即改变配置文件foo的值。如果是传统的做法,需要重启服务,才能达到配置文件的更新。此时,我们只需要发送post请求:http://localhost:8881/bus-refresh,你会发现config-client会重新读取配置文件

附加说明

  1. 本文参考资料
  • spring-cloud-eureka-server 官方文档
  • spring-cloud-eureka-client官方文档
  • spring-cloud 中文文档参考手册
  • 史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)
  • 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)

你可能感兴趣的:(spring,springcloud)