SpringCloud(七):springcloud配置中心和客戶端

前言:

Spring Cloud Config組件是獨立的,不須要註冊到eureka。
config工做原理是把讀取目標到配置拉取到本地緩存一份而後供給其餘客戶端使用,因此一旦config啓動成功,能夠將git上到配置刪除(可是實際狀況沒人這麼幹)。 

若是微服務架構中沒有使用統一配置中心時,所存在的問題:java

  • 配置文件分散在各個項目裏,不方便維護
  • 配置內容安全與權限,實際開發中,開發人員是不知道線上環境的配置的
  • 更新配置後,項目須要重啓

在SpringCloud中咱們使用config組件來做爲統一:git

項目中父pom:github

 <!-- 管理springboot版本和依賴 -->
     <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
    </parent>
    
    <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的版本。Finchley.RELEASE適用於springboot2.0.3版本 -->
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>
    
    <!-- 管理springcloud版本 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
 
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
         <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
    </dependencies>

在config服務添加application.yml文件:web

server: port: 7000 #服務名字 spring: application: name: config-server cloud: config: server: git: #git 倉庫的地址 uri: https://github.com/forgeorgeo/springcloud.git
#git 倉庫的帳號密碼;不寫也能夠 username: 466786065@qq.com password: java362430 #有下層目錄的話 esarch-paths: #加入註冊中心,實現高可用 eureka: client: service-url: defaultZone: http://localhost:8888/eureka/

固然咱們還要用git把代碼文件提交到在github:spring

config啓動類:bootstrap

package cm.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.config.server.EnableConfigServer; @SpringBootApplication @EnableConfigServer @EnableDiscoveryClient public class ServiceConfigApplication { public static void main(String[] args) { SpringApplication.run(ServiceConfigApplication.class, args); System.out.println("------啓動成功!"); } }

此時能夠訪問:http://localhost:7000/config-info-dev.yml  緩存

結果:安全

 

 二:客戶端:springboot

 

 項目pom文件:架構

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
    </parent>
    
    <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>Finchley.RELEASE</spring-cloud.version>
    </properties>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
     
 <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
        </dependency>
         <!--Spring Boot Actuator,感應服務端變化-->
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

建立bootstrap.yml 文件:

spring: cloud: config: label: master uri: http://localhost:7000   #服務端路徑
            name: config-info    #git上文件名(如文件:config-info-dev.yml) profile: dev #文件後綴(開發,測試版本)

建立application.yml 文件:

server: port: 9091 #客戶端端口 spring: application: name: user-service   #客戶端服務名

這裏的兩個配置文件中bootstrap 加載順序在application 以前。

到這裏 springcloud Config訪問github配置文件最簡單的配置就完成了,下面咱們在 config客戶端寫一個接口測試一下

package cn.demo.web; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope public class Controller { @Value("${spring.cloud}") private String config; @GetMapping("/test/config") public String test() { return config; } }

先啓動 config服務,在啓動 config客戶端,訪問http://localhost:9091/test/config

可是這樣就行了嗎?雖然服務沒有重啓,可是咱們要一個服務一個服務的發送post請求,咱們能受的了嗎?這比以前的沒配置中心好多了,那麼咱們如何繼續避免挨個挨個的向服務發送Post請求來告知服務,你的配置信息改變了,須要及時修改內存中的配置信息。

這時候咱們就不要忘記消息隊列的發佈訂閱模型。讓全部爲服務來訂閱這個事件,當這個事件發生改變了,就能夠通知全部微服務去更新它們的內存中的配置信息。這時Bus消息總線就能解決,這留到下一篇隨筆講解。

配置規則詳解

還記得最開始咱們建的那幾個測試文件的命名規則麼?

  • hellxztest.yml
  • hellxztest-dev.yml
  • hellxztest-stable.yml
  • hellxztest-prod.yml

這裏的application能夠自定義爲其它的名稱,這裏能夠用應用的名稱,即應用名,後邊的dev、stable、prod這些均可以視爲一個應用下多個不一樣的配置文件,能夠當作環境名,如下均用環境名代稱。

Config支持咱們使用的請求的參數規則爲:

  • / { 應用名 } / { 環境名 } [ / { 分支名 } ]
  • / { 應用名 } - { 環境名 }.yml
  • / { 應用名 } - { 環境名 }.properties
  • / { 分支名 } / { 應用名 } - { 環境名 }.yml
  • / { 分支名 } / { 應用名 } - { 環境名 }.properties

注意:

  1. 第一個規則的分支名是能夠省略的,默認是master分支
  2. 不管你的配置文件是properties,仍是yml,只要是應用名+環境名能匹配到這個配置文件,那麼就能取到
  3. 若是是想直接定位到沒有寫環境名的默認配置,那麼就可使用default去匹配沒有環境名的配置文件
  4. 使用第一個規則會匹配到默認配置
  5. 若是直接使用應用名來匹配,會出現404錯誤,此時能夠加上分支名匹配到默認配置文件
  6. 若是配置文件的命名很由多個-分隔,此時直接使用這個文件名去匹配的話,會出現直接將內容以源配置文件內容直接返回,內容前可能會有默認配置文件的內容(已測試)
相關文章
相關標籤/搜索