@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. 本文參考資料
相關文章
相關標籤/搜索