天天看點

Spring Cloud Config 分布式配置中心0. 開發環境1. Spring Cloud Config簡介2. 建立Config Server3. 建立Config Client

Java EE 目錄:https://blog.csdn.net/dkbnull/article/details/87932809

Spring Cloud 專欄:https://blog.csdn.net/dkbnull/column/info/36820

Spring Boot 專欄:https://blog.csdn.net/dkbnull/column/info/26341

在Spring Boot服務中,我們可以通過設定多個profile來配置不同的

application-{profile}.yml

,然後在啟動服務時指定要加載的配置檔案

spring.profiles.active={profile}

但是在Spring Cloud微服務架構中,這種配置方式不再适用。Spring Cloud對于配置有着更高、更靈活的要求,需要做到統一管理,實時更新,這時我們使用分布式配置中心元件來管理配置,也就是Spring Cloud Config。

0. 開發環境

  • IDE:IntelliJ IDEA 2017.1 x64
  • JDK:1.8.0_91
  • Spring Boot:2.0.9.RELEASE
  • Spring Cloud:Finchley.RELEASE

1. Spring Cloud Config簡介

Spring Cloud Config是一個解決分布式系統的配置管理方案,為分布式系統外部化配置提供了支援,包含Config Server和Config Client兩部分,Server提供配置檔案存儲,對外提供接口以擷取配置檔案的内容,Client通過接口擷取資料,并初始化自己。

2. 建立Config Server

2.1 建立Git倉庫

建立Git倉庫,用于存放配置檔案。

這裡我們直接在SpringCloudDemo倉庫中建立spring-cloud-config-repo檔案夾,然後建立三個配置檔案

spring-cloud-config-client-pro.yml

version: 1.0
profile: pro
           

spring-cloud-config-client-dev.yml

version: 1.0
profile: dev
           

spring-cloud-config-client-test.yml

version: 1.0
profile: test
           

2.2 建立Config Server

建立Config Server服務spring-cloud-config-server

2.3 引入依賴

<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>
           

2.4 建立啟動類

@EnableConfigServer 注解表示開啟配置伺服器

package cn.wbnull.springcloudconfig;

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

@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfigServerApplication {

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

2.5 建立application.yml

server:
  port: 8092
  servlet:
    context-path: /springcloudconfig

spring:
  application:
    name: spring-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/dkbnull/SpringCloudDemo
          search-paths: spring-cloud-config-repo
          username: ""
          password: ""
      label: master
           
  • spring.cloud.config.server.git.uri 配置Git倉庫的位址
  • spring.cloud.config.server.git.searchPaths 配置檔案的路徑
  • spring.cloud.config.label 配置倉庫的分支
  • spring.cloud.config.server.git.username 通路Git倉庫的使用者名,公開倉庫可不填寫
  • spring.cloud.config.server.git.password 通路Git倉庫的密碼,公開倉庫可不填寫

2.6 測試

啟動spring-cloud-config-server服務,浏覽器通路 http://127.0.0.1:8092/springcloudconfig/spring-cloud-config-client/pro ,傳回如下

{
	"name": "spring-cloud-config-client",
	"profiles": [
		"pro"
	],
	"label": null,
	"version": "8bddb99fecf031d284f1d7503b70c212f665e86f",
	"state": null,
	"propertySources": [
		{
			"name": "https://github.com/dkbnull/SpringCloudDemo/spring-cloud-config-repo/spring-cloud-config-client-pro.yml",
			"source": {
				"version": 1.0,
				"profile": "pro"
			}
		}
	]
}
           

浏覽器通路 http://127.0.0.1:8092/springcloudconfig/spring-cloud-config-client/dev ,傳回如下

{
	"name": "spring-cloud-config-client",
	"profiles": [
		"dev"
	],
	"label": null,
	"version": "2fa4983d777889ef29e453a7b4818645269124b1",
	"state": null,
	"propertySources": [
		{
			"name": "https://github.com/dkbnull/SpringCloudDemo/spring-cloud-config-repo/spring-cloud-config-client-dev.yml",
			"source": {
				"version": 1.0,
				"profile": "dev"
			}
		}
	]
}
           

從Git倉庫擷取配置成功。

2.7 配置檔案映射關系

Http請求位址與配置檔案映射關系如下:

映射{application}-{profile}.yml或{application}-{profile}.properties配置檔案

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.yml
/{label}/{application}-{profile}.properties
           
  • {application}通常使用微服務的名稱,對應于Git倉庫中配置檔案檔案名的字首
  • {profile}對應于{application}-{profile}的{profile}
  • {label}對應于Git倉庫的分支名,預設為master

3. 建立Config Client

3.1 建立Config Client

建立Config Client服務spring-cloud-config-client

3.2 引入依賴

<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>
           

3.3 建立啟動類

package cn.wbnull.springcloudconfig;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringCloudConfigClientApplication {

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

3.4 建立application.yml

server:
  port: 8093
  servlet:
    context-path: /springcloudconfig
           

3.5 建立bootstrap.yml

Spring Boot服務啟動時會加載application.yml/application.properties配置檔案,Spring Cloud中有”引導上下文“的概念,引導上下文會加載bootstrap.yml/bootstrap.properties配置檔案,即bootstrap.yml/bootstrap.properties會在Spring Boot服務啟動之前加載,具有更高的優先級。預設情況下bootstrap.yml/bootstrap.properties中的屬性不能被覆寫。

spring:
  application:
    name: spring-cloud-config-client
  cloud:
    config:
      uri: http://127.0.0.1:8092/springcloudconfig
      profile: pro
      label: master
           
  • spring.application.name 配置Config Server擷取的配置檔案的{application}
  • spring.cloud.config.uri 配置Config Server的位址
  • spring.cloud.config.profile 配置Config Server擷取的配置檔案的{profile}
  • spring.cloud.config.label 配置Config Server擷取的配置檔案的{label}

3.6 建立控制器類

package cn.wbnull.springcloudconfig.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Scope("prototype")
public class GatewayController {

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

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

    @GetMapping(value = "/gateway")
    public String gateway() throws Exception {
        return "version:" + version + ",profile:" + profile;
    }
}
           

3.7 測試

依次啟動spring-cloud-config-server、spring-cloud-config-client,浏覽器通路 http://127.0.0.1:8093/springcloudconfig/gateway ,傳回如下

version:1.0,profile:pro
           

spring-cloud-config-client成功通過spring-cloud-config-server從Git倉庫中擷取到了指定配置檔案的配置資訊。

GitHub:https://github.com/dkbnull/SpringCloudDemo

微信:https://mp.weixin.qq.com/s/jcFZUliJ5Fq5MSQWQNombw

微網誌:https://weibo.com/ttarticle/p/show?id=2309404371771666085647

知乎:https://zhuanlan.zhihu.com/p/65654453

繼續閱讀