分佈式配置中心spingcloud-config-server

原文地址:

http://118.25.172.253/2018/11/16/分佈式配置中心spingcloud-config-server搭建/html

分佈式配置中心spingcloud-config-server

分佈式配置中心個人項目早就在使用了,是我一個同事搭建的,對於這個,我只是瞭解一點。因此抽空本身搭建了一個,其中也發現了很多問題。因此寫了這篇文章記錄一下搭建過程!相信跟着我寫的步驟,,大部分人應該能夠搭建成功的!經過這篇文章後,你也能夠學會單機、集羣下實現應用的熱部署java

簡介

Spring Cloud Config爲分佈式系統中的外部化配置提供服務器和客戶端支持。使用Config Server,您能夠在全部環境中管理應用程序的外部屬性。客戶端和服務器映射的概念與Spring Environment和PropertySource抽象相同,所以它們與Spring應用程序很是契合,但能夠與任何以任何語言運行的應用程序一塊兒使用。隨着應用程序經過從開發人員到測試和生產的部署流程,您能夠管理這些環境之間的配置,並肯定應用程序具備遷移時須要運行的一切。服務器存儲後端的默認實現使用git,所以它輕鬆支持標籤版本的配置環境,以及能夠訪問用於管理內容的各類工具。能夠輕鬆添加替代實現,並使用Spring配置將其插入。git

以上簡介來自springcloud的中文文檔github

配置中心倉庫搭建

這裏咱們使用github做爲咱們的配置文件倉庫。web

  1. 如今github上建立一個倉庫,個人倉庫名叫springcloud-config-server-repospring

  2. 將倉庫克隆到本地apache

  3. 在倉庫下新建一個目錄,叫config-server-client,裏面放三個配置文件json

    config-server-client-dev.yml	
     config-server-client-product.yml	
     config-server-client-test.yml
    複製代碼

配置文件裏面都只有一行。bootstrap

開發環境後端

environment: dev
複製代碼

測試環境

environment: test
複製代碼

線上環境

environment: product
複製代碼

通常來講,config-server-client表明你項目的文件,裏面三個文件是這個項目開發、測試、線上的三個配置文件! 4. 將配置文件提交到github上。。倉庫就已經搭建好了,效果見下圖!

image

配置中心服務器端搭建

搭建以前,先介紹一下我使用的springcloud版本。這裏我是使用最新的版本。。大家能夠把下面代碼放到本身項目的父pom依賴中

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>

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


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


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
複製代碼
  1. 新建一個maven工程,取名springcloud-config-server

  2. 修改pom文件,加入以下依賴

    <!--配置中心-->
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-config-server</artifactId>
     </dependency>
    複製代碼
  3. 新建配置文件application.yml以下

    server:
         port: 8083
     
     spring:
         application:
             name: config-server
         cloud:
             config:
                 server:
                     git:
                         uri: https://github.com/kingrocy/springcloud-config-server-repo.git
                         searchPaths: '{application}' #application表明客戶端的名稱 這種寫法的目的是根據項目名稱將配置文件區分開
                         username:
                         password:
                 label: master
    複製代碼
  4. 編寫啓動類

    package com.yunhui;
     
     import org.springframework.boot.SpringApplication;
     import org.springframework.boot.autoconfigure.SpringBootApplication;
     import org.springframework.cloud.config.server.EnableConfigServer;
     /**
      * @Author: Yun
      * @Description:
      * @Date: Created in 2018-05-24 17:54
      */
     @SpringBootApplication
     @EnableConfigServer
     public class ConfigServerApplication {
         public static void main(String[] args) {
             SpringApplication.run(ConfigServerApplication.class);
         }
     }
    複製代碼

到此,咱們的配置中心服務器端已經搭建完成了!咱們啓動應用,在瀏覽器下輸入以下地址進行測試:http://localhost:8083/config-server-client/dev

若是瀏覽器返回下面json 則表明服務器端搭建完成!

{
        "name": "config-server-client",
        "profiles": [
            "product"
        ],
        "label": null,
        "version": "9f48ac3dfd2d4bf14d3bef631188fe22dad57a45",
        "state": null,
        "propertySources": [
            {
                "name": "https://github.com/kingrocy/springcloud-config-server-repo.git/config-server-client/config-server-client-product.yml",
                "source": {
                    "environment": "product"
                }
            }
        ]
    }
複製代碼

經過配置中心服務器端訪問配置文件有以下幾種形式

/{application}/{profile}[/{label}]
    /{application}-{profile}.yml
    /{label}/{application}-{profile}.yml
    /{application}-{profile}.properties
    /{label}/{application}-{profile}.properties
複製代碼

其中application爲項目名稱 profile爲環境名稱 label爲github 分支名稱(默認爲master)

踩坑一:經過輸入http://localhost:8083/config-server-client/dev在瀏覽器端返回不了json。。一直返回xml,並且配置中心客戶端獲取配置文件時,一直獲取不到!

解決辦法:上面的問題是由於在配置中心的pom文件中導入了一些多餘的springcloud的依賴包影響,,將多餘的依賴包都移除,從新啓動項目,一切正常!

配置中心客戶端搭建

  1. 建立項目springcloud-config-server-client

  2. 修改pom文件以下:

    <?xml version="1.0" encoding="UTF-8"?>
     <project xmlns="http://maven.apache.org/POM/4.0.0"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
         <parent>
             <artifactId>springcloud</artifactId>
             <groupId>com.yunhui</groupId>
             <version>1.0-SNAPSHOT</version>
         </parent>
         <modelVersion>4.0.0</modelVersion>
     
         <artifactId>springcloud-config-server-client</artifactId>
     
         <dependencies>
     
             <dependency>
                 <groupId>org.springframework.cloud</groupId>
                 <artifactId>spring-cloud-starter-config</artifactId>
             </dependency>
     
             <!-- eureka client須要  若沒有,eureka client沒法啓動(啓動後會自動中止)踩坑二 -->
             <dependency>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-starter-web</artifactId>
             </dependency>
     
         </dependencies>
     </project>
    複製代碼
  3. 在resource目錄下建立bootstrap.yml文件

    server:
         port: 8084
     
     spring:
         application:
             name: config-server-client
         cloud:
             config:
                 profile: dev
                 label: master
                 uri: http://localhost:8083
     
     #springboop 2.0以後 spring-boot-starter-actuator將/refresh等接口關閉了。。經過下面配置開啓 踩坑三
     management:
         endpoints:
             web:
                 exposure:
                     include: "*"
    複製代碼

注意:此處的配置文件是叫bootstrap,而不是application。。由於bootstrap配置文件時優先於applictaion加載的。。因此咱們在bootsrap中配置配置中心的地址,讓項目在啓動的時候去拉此項目在配置中心的配置文件,再進行加載!

  1. 建立啓動類。。

    package com.yunhui;
     import org.springframework.beans.factory.annotation.Value;
     import org.springframework.boot.SpringApplication;
     import org.springframework.boot.autoconfigure.SpringBootApplication;
     import org.springframework.cloud.context.config.annotation.RefreshScope;
     import org.springframework.web.bind.annotation.RequestMapping;
     import org.springframework.web.bind.annotation.RestController;
     
     /**
      * @Author: Yun
      * @Description:
      * @Date: Created in 2018-05-24 18:26
      */
     @SpringBootApplication
     @RestController
     @RefreshScope
     public class ConfigServerClientApplication {
     
         public static void main(String[] args){
             SpringApplication.run(ConfigServerClientApplication.class);
         }
     
         @Value("${environment}")
         String environment;
     
         @RequestMapping("/env")
         public String from() {
             return environment;
         }
     }
    複製代碼

啓動項目,在瀏覽器中輸入http://localhost:8084/env。若瀏覽器中顯示dev,則客戶端配置拉取成功!若沒有,則檢查配置!

單機下熱部署

在以前的步驟中,咱們搭建的配置中心服務端以及客戶端都已經成功了,客戶端已經能夠拉取配置中心的配置文件了。可是若是咱們改了配置中心的配置文件,,此時咱們的客戶端是拉取不到最新的配置文件的。。若是想要最新的配置文件生效,仍是得將項目重啓,此時,咱們使用config-server提供的動態刷新配置功能。。

步驟:

  1. 客戶端pom文件新增依賴

    <!--config-client須要 若沒有 則沒法刷新配置-->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-actuator</artifactId>
     </dependency>
    複製代碼
  2. 在須要刷新的配置上,再其類上加 @RefreshScope註解。。再使用post請求 請求{客戶端IP}:{客戶端端口}/actuator/refresh這個url,這樣客戶端就會刷新在@RefreshScope下全部使用@Value引用的配置屬性了。

經過上面兩個步驟,咱們實現了單機狀況下的客戶端獲取最新配置文件的方法.但這個方法是基於咱們的客戶端不多,沒有幾個的狀況下,咱們能夠用這種人工的方式。可是在咱們的客戶端是一個大的集羣,裏面的機器有幾十甚至上百,那採起這種方式就是不可行的。因此咱們須要採用下面的這種方式來集羣推送配置信息

集羣下熱部署

原理

集羣下的消息推送是依賴於消息隊列,配置中心可以主動進行信息推送,將最新的配置信息經過消息隊列分發到集羣的機器中,集羣中的機器自動讀取,從新加載
複製代碼

步驟:(注意:如下步驟須要在配置中心服務器和客戶端都須要進行操做的)

  • pom文件中添加springcloud的封裝的消息組件

    <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-bus-amqp</artifactId>
      </dependency>
    複製代碼
  • spring-cloud-starter-bus-amqp默認是整合rabbitmq,咱們只需在配置文件中加入rabbitmq的相關配置信息便可使用

    spring:    
          rabbitmq:
              host: 192.168.0.16
              port: 5672
              username: 用戶名
              password: 密碼
    複製代碼

經過上面的配置,配置中心服務器和客戶端就會在啓動的時候自動連上rabbitmq。springcloud提供了一個api給消息集羣。經過post請求調用集羣中的任意一臺機器(包括配置中心服務器和客戶端)的下面這個url {ip}:{port}/actuator/bus-refresh 就可使集羣中機器自動刷新配置,實現熱部署!

引伸

上面的配置修改後,須要人工去請求單機或集羣的接口來實現熱部署。這是比較浪費資源的。咱們能夠經過git的webhook的來實現自動化構建操做。這樣的話,在咱們推送代碼到線上分支時,git會自動監控文件,若是文件發生了變化,就能夠調用咱們的/actuator/bus-refresh實現集羣熱部署了。

至此,springcloud的分佈式配置中心已經搭建完成!

項目源碼:springcloud學習筆記

相關文章
相關標籤/搜索