Spring Cloud Config 分散式配置中心【Finchley 版】

weixin_33807284發表於2018-08-23

一、 介紹

1,為什麼需要配置中心?

當服務部署的越來越多,規模越來越大,對應的機器數量也越來越龐大,靠人工來管理和維護服務的配置資訊,變得困難,容易出錯。
因此,需要一個能夠動態註冊和獲取服務資訊的地方,來統一管理服務名稱和其對應的伺服器列表資訊,稱之為服務配置中心。服務提供者在啟動時,將其提供的服務名稱、伺服器地址註冊到服務配置中心。服務消費者通過服務配置中心來獲得需要呼叫的服務,通過相應的負載均衡演算法,選擇其中一臺伺服器開始呼叫。

2,什麼是 Spring Cloud Config

spring cloud config 是 spring cloud 中的一個元件,分散式配置中心元件,它支援配置服務放在配置服務的記憶體中(即本地),也支援放在遠端Git倉庫中。在spring cloud config 元件中,分兩個角色,一是config server,二是config client。

二、 Spring Cloud Config 實戰

2.1,構建Config Server

2.1.1,建立一個名為config-server 的 spring-boot專案,pom.xml依賴如下: 注意元件版本我用的是 Spring Boot 2.0.x

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.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>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

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

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

2.2,在入口類ConfigServerApplication 新增註解 @EnableConfigServer,開啟Config配置中心服務端

2.3,在根目錄新建的配置檔案 config-dev.yml,並提交到git倉庫,例項是mysql的資料原本配置資訊,提交的github中,配置檔案如下:

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.10.100:3306/spring?useSSL=false
    username: test
    password: 123456

2.4,配置 application.yml ,配置如下:

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/jarvisqi/spring-cloud-microservice
          search-paths: config-server
          username:
          password:
          default-label: master
server:
  port: 9400
  • spring.cloud.config.server.git.url :指定git的倉庫地址,改成你自己的
  • spring.cloud.config.server.git.search-paths :指定你的配置檔案所在的目錄
  • username,password 如果是github公開的就不用新增,自己的私有倉庫自己新增

2.4,啟動Config-Server,並訪問:http://localhost:9400/config/dev 地址,看到如下資訊,說明服務端正常執行:

{
    "name": "config",
    "profiles": [
        "dev"
    ],
    "label": null,
    "version": "e64289cb775e2ac7db7494c07d7e8c4933163daf",
    "state": null,
    "propertySources": [
        {
            "name": "https://github.com/jarvisqi/spring-cloud-microservice/config-server/config-dev.yml",
            "source": {
                "spring.datasource.driver-class-name": "com.mysql.jdbc.Driver",
                "spring.datasource.url": "jdbc:mysql://192.168.10.100:3306/spring?useSSL=false",
                "spring.datasource.username": "test",
                "spring.datasource.password": 123456
            }
        }
    ]
}

source 下面的key就是配置的資訊,http請求地址和資原始檔對映如下:

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


2.2,構建Config Client

2.2.1,建立一個名為config-client 的 spring-boot專案,pom.xml依賴如下: 注意元件版本我用的是 Spring Boot 2.0.x

  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.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>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</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-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2.2.2,配置 application.yml ,配置如下:

spring:
  application:
    name: config-client
  cloud:
    config:
      uri: http://localhost:9400
      name: config
      profile: dev
      label: master
server:
  port: 9410
  • spring.cloud.config.uri : 指定config-server 服務端地址,注意並不是git倉庫地址
  • spring.cloud.config.name:注意 如果name值不寫,會預設取 spring.application.name的值,資原始檔名就變成了 config-client-dev,根據http請求地址和資原始檔對映,肯定找不到,會報錯,無法啟動
  • spring.cloud.config.profile:一般就是 dev ,test ,prd,你自定義也行,因為我提交的檔案寫的是 dev
  • spring.cloud.config.label :git的分支

2.2.3,配置 boostrap.yml ,配置如下:

spring:
  cloud:
    config:
      uri: http://localhost:9400

注意,此處有坑,如果你不新增 boostrap.yml檔案並重新指定指定 spring.cloud.config.uri,啟動客戶端會報錯,會預設指定 埠:8888,不是自定義的埠,無法啟動會報錯,當然你可以直接用 boostrap.yml ,我看那此處很多人遇到問題,遇到問題就說降低版本到1.5.X就正確,這也能算解決方案?

2.2.4,新增 ConfigController 介面,並獲取配置資訊,程式碼如下:

@RestController
public class ConfigController {

    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;

    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @RequestMapping("/dataconfig")
    public DataConfig getDataConfig() {
        DataConfig config = new DataConfig(driverClassName, url, username, password);
        return config;
    }
}

2.2.5,首先啟動config-server,保證執行正常,再啟動 config-client,並請求地址 http://localhost:9410/dataconfig,得到如下結果,說明配置中心完成:

{
    "driverClassName": "com.mysql.jdbc.Driver",
    "url": "jdbc:mysql://192.168.10.100:3306/spring?useSSL=false",
    "username": "test",
    "password": "123456"
}

以上,就可以單獨部署配置中心,配置資訊值需要git提交到指定的目錄,微服務各個獨立的服務應用都能獲取。

附上原始碼:https://github.com/jarvisqi/spring-cloud-microservice.git

參考:

相關文章