Spring Cloud Config分佈式配置中心的使用和遇到的坑

分佈式配置中心

爲何要有用分佈式配置中心這玩意兒?如今這微服務大軍已經覆蓋了各類大小型企業,每一個服務的粒度相對較小,所以系統中會出現大量的服務,每一個服務都要有本身都一些配置信息,或者相同的配置信息,可能不一樣環境每一個服務也有單獨的一套配置,這種狀況配置文件數量比較龐大,維護起來至關費勁,舉個栗子:
在開發的過程當中,通常數據庫是開發環境數據庫,全部服務DB的IP配置爲:92.168.0.1,忽然老大說,開發環境換了,DB的IP要修改,這下可很差受了,全部模塊挨個修改DB的配置,就問你難受不難受?
這個時候分佈式配置中心就發揮了很大的優點,只須要修改配置中心配置,全部服務便可自動生效,爽不爽!java

<!-- more -->git

Spring Cloud Config

官網地址:http://cloud.spring.io/spring-cloud-config/spring

簡介

Spring Cloud Config爲服務端和客戶端提供了分佈式系統的外部化配置支持。配置服務器爲各應用的全部環境提供了一箇中心化的外部配置。它實現了對服務端和客戶端對Spring EnvironmentPropertySource抽象的映射,因此它除了適用於Spring構建的應用程序,也能夠在任何其餘語言運行的應用程序中使用。做爲一個應用能夠經過部署管道來進行測試或者投入生產,咱們能夠分別爲這些環境建立配置,而且在須要遷移環境的時候獲取對應環境的配置來運行。數據庫

置服務器默認採用git來存儲配置信息,這樣就有助於對環境配置進行版本管理,而且能夠經過git客戶端工具來方便的管理和訪問配置內容。固然他也提供本地化文件系統的存儲方式。json

使用 spring Cloud 進行集中式配置管理,將以往的配置文件從項目中摘除後放到Git 或svn中集中管理,並在須要變動的時候,能夠通知到各應用程序,應用程序刷新配置不須要重啓。bootstrap

實現原理

其實這個實現原理相對比較簡單一些,基於git的交互操做。springboot

  1. 咱們把配置文件存放到git上面
  2. Spring Cloud Config配置中心服務鏈接git
  3. 客戶端須要配置配置信息從配置中心服務獲取
  4. 當客戶端啓動,會從配置中心獲取git上面的配置信息

配置中心服務端

pom.xml添加依賴服務器

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

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

Application啓動類添加註解app

添加@EnableConfigServer註解,啓用配置中心:分佈式

package com.qianxunclub;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;


/**
* @author chihiro.zhang
*/
@SpringBootApplication
@EnableConfigServer
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

配置文件

application.yml或者application.properties添加配置信息:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/qianxunclub/spring-boot-config-repo
          default-label: master
          search-paths: /**
          basedir: target/config
  • spring.cloud.config.server.git.uri:配置git倉庫地址
  • spring.cloud.config.server.git.search-paths:倉庫文件夾目錄,若是是/**,就是全部目錄全部文件
  • spring.cloud.config.server.git.default-label:配置倉庫的分支
  • spring.cloud.config.server.git.basedir:配置文件拉去到本地的目錄位置

啓動測試

首先在git裏面添加一個application-dev.yml配置文件,內容如此下:

test: 我是配置中心配置信息

已經配置完成了,啓動一波試試,看效果咋樣,正常狀況下是能夠正常啓動的,而後獲取配置文件試試
訪問地址:http://localhost:8888/test/dev
若是返回以下,就是成功了:

{
    "name":"test",
    "profiles":[
        "dev"
    ],
    "label":null,
    "version":"64e7882a8f280641724e454a2db5a3da7b44d3d4",
    "state":null,
    "propertySources":[
        {
            "name":"https://gitee.com/qianxunclub/spring-boot-config-repo/application-dev.yml",
            "source":{
                "test":"配置中心的配置信息"
            }
        }
    ]
}

http請求地址和資源文件映射以下:

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

配置中心客戶端使用

pom.xml添加依賴

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

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

配置文件

建立bootstrap.yml文件,切記,是bootstrap.yml文件bootstrap.yml文件,我就由於寫到了application.yml這個裏面,各類出現問題啊,添加以下配置:

spring:
  cloud:
    config:
      name: application
      profile: dev
      label: master
      uri: http://localhost:8888/
  • spring.cloud.config.label:指明遠程倉庫的分支
  • spring.cloud.config.profile:指定不一樣環境配置文件,和git倉庫的 application-dev.yml對應
  • spring.cloud.config.name:配置名稱,通常和git倉庫的application-dev.yml對應
  • spring.cloud.config.uri:上面的配置中心服務地址

啓動測試

先添加一個獲取配置信息的類:

/**
 * @author chihiro.zhang
 */
@Configuration
@EnableAutoConfiguration
public class DemoConfiguration {

    @Value("${test}")
    private  String test;
}

找個地方隨便調用一下,輸出這個test,就會打印上面git裏面配置的信息了,爽不!

說說中間遇到的坑

  1. 服務端git配置死活獲取不了git倉庫配置文件
spring:
    cloud:
        config:
        server:
            git:
                uri: https://gitee.com/qianxunclub/spring-boot-config-repo
                default-label: master
                search-paths: /**
                basedir: target/config

當時這個uri配置的是公司的git倉庫,公司的git倉庫訪問是須要開代理纔能有權限訪問的,代理也開了,但是一直報錯:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Wed Jun 06 11:10:56 CST 2018
There was an unexpected error (type=Not Found, status=404).
Cannot clone or checkout repository: http://xxx.com:5080/framework/config-repo

很鬱悶,不知道爲啥,但是就在剛剛,就剛剛,寫博客的時候,有測試了一下,通了。。。。日了狗了,不知道啥緣由,等研究出來了再來補充。

  1. 客戶端配置必定要配置在bootstrap.yml裏面 uri默認會調用端口爲8888的地址http://localhost:8888/
    啓動的時候,會加載labeluri,profile配置,profile能夠在啓動參數添加,profile也能夠加在application.yml添加
    name也能夠加在application.yml添加

demo

配置中心服務端:https://gitee.com/qianxunclub/qianxunclub-springboot-config
配置git倉庫:https://gitee.com/qianxunclub/qianxunclub-springboot-config
配置客戶端使用:https://gitee.com/qianxunclub/qianxunclub-starter-demo
客戶端主要配置在:https://gitee.com/qianxunclub/qianxunclub-starter-parent/tree/master/qianxunclub-starter-config

相關文章
相關標籤/搜索