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

什么是Spring Cloud Config

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

以上内容为官方直译

项目集成之配置中心

Config Server

1. pom.xml中添加Maven依赖java

<parent>
    <!-- spring boot -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <!-- netflix-eureka-client-->
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <!-- Spring Cloud Config Server -->
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <!-- spring cloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2. 添加注解支持git

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

3. application.yml配置github

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配置中心服务端配置完毕。web

4. 运行概览spring

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

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依赖服务器

<parent>
    <!-- spring boot -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <!-- netflix-eureka-client-->
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <!-- Spring Cloud Config Client-->
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <!-- spring cloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

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依赖

<dependency>
    <!-- 消息服务总线 通知微服务架构的配置文件的更改 -->
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <!-- 配置重试机制须要 -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
    <!-- 配置重试机制须要 -->
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>
消息服务总线须要 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. 本文参考资料
相关文章
相关标签/搜索