springCloud學習1(集中式配置管理)

springcloud 總集:https://www.tapme.top/blog/detail/2019-02-28-11-33java

1、前言

  在開發普通的 web 應用中,咱們一般是將配置項寫在單獨的配置文件中,好比application.yml,application.properties,可是在微服務架構中,可能會出現數百個微服務,若是每一個微服務將配置文件寫在自身的配置文件中,會致使配置文件的管理很是複雜。所以集中式的配置管理是很是有必要的,每一個服務啓動時從集中式的存儲庫中讀取須要的配置信息。其模型以下:git

配置管理概念架構

簡單來講就是以下幾點:github

  1. 啓動一個微服務實例時向配置管理服務請求獲取其所在環境的特定配置文件
  2. 實際的配置信息駐留在存儲庫中。能夠選擇不一樣的實現來保存配置數據,包含:源代碼控制下的文件、關係數據庫或鍵值數據存儲
  3. 應用程序配置數據的實際管理和應用程序無關。配置的更改一般經過構建和部署管道來處理
  4. 進行配置管理更改時,必須通知使用該配置的服務實例

  因爲本系列爲 spring cloud,因此使用Spring Cloud Config來構建配置管理,固然還有不少其餘優秀的解決方案(Etcd,Eureka,Consul...)。web

2、構建配置服務

  spring cloud 是創建在 spring boot 的基礎上的,所以須要有 spring boot 的構建基礎。spring

一、pom 編寫

  pom 主要依賴以下(篇幅緣由列出主要內容,完整代碼請到 github 上查看),spring boot 版本和 spring cloud 版本以下,以後不在贅述:數據庫

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

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Camden.SR5</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>
    <spring-cloud.version>Camden.SR5</spring-cloud.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

二、註解引導類

  只需在 spring boot 啓動類上加入一個@EnableConfigServer註解便可。json

三、配置服務配置編寫(使用文件存儲)

  這裏是給配置服務使用的配置文件,用於聲明端口,存儲庫類別等信息,並非給其餘微服務使用的配置。配置以下(使用文件存儲配置信息):bootstrap

server:
  port: 8888
spring:
  profiles:
    # 使用文件系統來存儲配置信息,須要設置爲native
    active: native
cloud:
  config:
    server:
      native:
        # 使用文件來存放配置文件,爲每一個應用程序提供用逗號分隔的文件夾列表
        searchLocations: file:///D:/configFolder/licensingservice

四、建立供應用程序使用的配置文件

  經過上面的searchLocations可知目前有一個名爲 licensingservice 的應用程序,在對應目錄下建立以下三個配置文件:springboot

  • licensingservice.yml
server:
  port: 10010
spring:
  application:
    name: licensingservice
  • licensingservice-dev.yml
server:
  port: 10011
  • licensingservice-prod.yml
server:
  port: 10012

配置文件命名約定爲:應用程序名稱-環境名稱.yml。如今啓動應用便能經過 http 請求來獲取配置了。服務器

  請求localhost:8888/licensingservice/default,返回結果以下:

{
  "name": "licensingservice",
  "profiles": ["default"],
  "label": null,
  "version": null,
  "state": null,
  "propertySources": [
    {
      "name": "file:///D:/configFolder/licensingservice/licensingservice.yml",
      "source": {
        "server.port": 10001,
        "spring.application.name": "licensingservice"
      }
    }
  ]
}

  請求localhost:8888/licensingservice/dev,返回結果以下:

{
  "name": "licensingservice",
  "profiles": ["dev"],
  "label": null,
  "version": null,
  "state": null,
  "propertySources": [
    {
      "name": "file:///D:/configFolder/licensingservice/licensingservice-dev.yml",
      "source": {
        "server.port": 10011
      }
    },
    {
      "name": "file:///D:/configFolder/licensingservice/licensingservice.yml",
      "source": {
        "server.port": 10001,
        "spring.application.name": "licensingservice"
      }
    }
  ]
}

2、和 spring boot 客戶端集成

  上面寫了如何使用 spring cloud config 構建配置服務,這一節來構建 licensingserivce 服務,使用上面的配置服務來獲取配置文件。

一、建立 springboot 工程

  建立 springboot 項目 licensingservice,主要依賴以下:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-config-client</artifactId>
</dependency>

二、編寫配置文件

  共兩個配置文件,application.yml,bootstrap.yml

  • application.yml

    本配置文件用於存放留在本地配置信息,若是存在同名配置,本地的會被覆蓋,不會生效

    server:
    port: 10099
  • bootstrap.yml

    給 spring cloud config client 讀取的配置文件,根據該配置向配置中心請求

    spring:
    application:
      #指定名稱,以便spring cloud config客戶端知道查找哪一個配置
      name: licensingservice
    profiles:
      #指定環境(default,dev,prod)
      active: dev
    cloud:
      config:
        #指定config server地址
        uri: http://localhost:8888

    PS:若是想要覆蓋 bootstrap.yml 的配置可在啓動命令加上-d 參數,如:

    java -Dsptring.cloud.config.uri=.... -Dspring.profiles.active=prod xxxxx.jar

三、啓動

  啓動 licensingservice 能夠發現啓動端口爲 10011,說明遠程讀取配置生效了。

3、使用 git 做爲配置服務的數據源

一、建立源配置文件

  在 github 某個倉庫下建立配置文件,好比在https://github.com/FleyX/demo-project倉庫下的springcloud/config目錄下建立 licengingservice 服務的配置文件。

二、修改 config server 配置文件

  修改 confsvr 中的 application.yml

server:
  port: 8888
spring:
  profiles:
    # 使用文件系統來存儲配置信息,須要設置爲native,git設置爲git
    active: git
  application:
    name: test
  cloud:
    config:
      server:
        native:
          # 使用文件來存放配置文件,爲每一個應用程序提供用逗號分隔的文件夾列表
          searchLocations: file:///D:/configFolder/licensingservice
        git:
          uri: https://github.com/FleyX/demo-project
          # 查找配置文件路徑(,分隔)
          search-paths: springcloud/config/licensingservice
          #若是爲公開倉庫,用戶名密碼可不填寫
          username:
          password:
      #配置git倉庫的分支
      label: master

三、啓動

  從新啓動,便可發現配置成功生效。

4、配置刷新

  使用 spring cloud 配置服務器時,有一個問題是如何在屬性變化時動態刷新應用程序。spring cloud 配置服務始終提供最新版本的屬性,對低層存儲庫屬性的更改將會是最新的。可是 config client 並不會知道配置的變動,所以不會自動刷新屬性。

  Spring Boot Actuator 提供了一個@RefreshScope屬性來從新讀取應用程序配置信息,開發人員可經過/refresh進行刷新。該註釋須要註釋在啓動入口類上。注意:只會加載自定義 Spring 屬性,例如數據庫,端口等配置不會從新加載

總結

  本篇只是用到了 spring-cloud-config 這個來進行配置集中管理,並無涉及到微服務,在下一篇將開始微服務的學習。
  本篇兩個項目代碼存放於:點擊跳轉

相關文章
相關標籤/搜索