一、前言
在前面的部落格中,小編依次向大家介紹了配置中心Eureka,負載均衡機制Ribbon和Feign,系統容錯機制Hystrix。這樣基本上的分布式開發是沒有問題了,在使用的時候也是非常的痛快吧。
但是現在我們的架構是微服務架構,是以我們将會有很多的微服務,每個微服務都有各自的配置檔案,這樣當我們需要對一些服務進行批量的修改的時候我們可能就會要挨個的依次修改,這樣的工作量也是很大的。
針對這個情況,我們就想把所有的服務的 配置檔案全部抽離出來然後統一管理。更改後,通過消息總線動态重新整理項目。這篇部落格,小編先向大家介紹一下SpringCloud Config。
二、什麼是Spring Cloud Config?
springcloud config 是用來為分布式系統中的基礎設施和微服務應用提供集中化的外部配置支援。
分為服務端和用戶端:
- 服務端,也叫做分布式配置中心,是一個獨立的微服務,用于連接配接所有用戶端和配置倉庫,提供配置資訊、加密解密等通路接口。
- 用戶端,可以是各個微服務,通過指定配置中心,在啟動的時候,通過配置中心讀取對應的配置檔案。
配置中心預設是git,也支援svn,本地化檔案系統。
三、實戰
3.1 準備
根據上一篇部落格搭建好的架構,我們在這個基礎上進行修改,您可以在這裡得到代碼。
https://github.com/AresKingCarry/SpringCloudDemo
3.2 建立立config 服務端
建立新springboot項目config:

3.3 添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
3.4 啟動類添加注解
啟動類添加
@EnableConfigServer
注解,開啟服務端配置中心的功能:
package com.wl.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
3.5 修改配置檔案
配置Git配置檔案:
server:
port:
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://github.com/AresKingCarry/springcloudconfigserver.git
username: AresKingCarry
password: **********e
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倉庫的使用者密碼
如果Git倉庫為公開倉庫,可以不填寫使用者名和密碼,如果是私有倉庫需要填寫,本例子是公開倉庫,放心使用。
在https://github.com/AresKingCarry/springcloudconfigserver.git的master上,指明了不同運作環境的檔案,檔案内容中寫明了内容。
config-client.yml
config-client-dev.yml 開發環境配置檔案
config-client-test.yml 測試環境配置檔案
config-client-prod.yml 生産環境配置檔案
http請求位址和資源檔案映射如下:
• /{application}/{profile}[/{label}]
• /{application}-{profile}.yml
• /{label}/{application}-{profile}.yml
• /{application}-{profile}.properties
• /{label}/{application}-{profile}.properties
另附配置svn:
spring:
profiles: dev
cloud:
config:
server:
svn:
uri: https://1**.**1.**.7:10096/svn/***/sjpt/SMF/branches/****/config-repo
username: cloud
password: password
default-label: dev
3.6 建立用戶端
3.7 添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
3.8 修改配置檔案 bootstrap.yml
注意,這裡要從建立立配置檔案,命名為bootstrap.yml。
server:
port:
spring:
application:
name: config-client
cloud:
config:
label: master
profile: dev
uri: http://localhost:8888
配置檔案中:
• spring.cloud.config.label 指明遠端倉庫的分支
• spring.cloud.config.profile
○ dev開發環境配置檔案
○ test測試環境
○ pro正式環境
• spring.cloud.config.uri= http://localhost:8888/ 指明配置服務中心的網址。
為什麼要用 bootstrap.yml 而不用 application.yml?
springboot的配置檔案加載順序,對于本應用外的jar封包件加載會優先于應用jar包内的配置内容,而通過 bootstrap.yml 對 config-server的配置,使得該應用會從config-server中擷取一些外部的配置檔案這些資訊的優先級比本地的高,進而實作外部化配置。
3.9 配置controller通路類
package com.wl.configclient.controller;
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.RestController;
/**
* Created by Ares on 2018/4/18.
*/
@RestController
@RefreshScope
public class ConfigController {
@Value("${shoujin}")
private String shoujin;
@GetMapping("/getInfo")
public String getInfo(){
return shoujin;
}
}
這樣我們就可以通過spring的@Value注解通路到配置檔案中的參數的值了。
四、小結
可以說本例中隻是一個簡單的demo, 雖然配置中心中的值是抽象出來的,把所有的配置檔案的值都抽象出來了,可以統一的管理,這樣就對系統有了一個限制,比如,使用Git就必須要求所有的節點聯網,使用svn就要求在區域網路内,是以根據不同的環境進行不同的選擇吧。