一、簡介
在分布式系統中,由于獨立的微服務數量很多,為了友善服務配置檔案統一管理,并實作不重新開機服務自動重新整理配置,實時更新,是以需要分布式配置中心元件。在Spring Cloud中,有分布式配置中心元件spring cloud config,支援配置服務放在配置服務的記憶體中(即本地),也支援放在遠端Git倉庫中。在spring cloud config 元件中,分兩個角色,它是屬于CS架構 ,一是config server,二是config client。
SpringCloudConfig
就是我們通常意義上的配置中心,把應用原本放在本地檔案的配置抽取出來放在中心伺服器,進而能夠提供更好的管理、釋出能力。
SpringCloudConfig
分服務端和用戶端,服務端負責将
git或者svn
中存儲的配置檔案釋出成
REST
接口,用戶端可以從服務端REST接口擷取配置。但用戶端并不能主動感覺到配置的變化,進而主動去擷取新的配置,這需要每個用戶端通過
POST
方法觸發各自的
/refresh
。
SpringCloudBus
通過一個輕量級消息代理連接配接分布式系統的節點。這可以用于廣播狀态更改(如配置更改)或其他管理指令。
SpringCloudBus
提供了通過
POST
方法通路的
endpoint/bus/refresh
,這個接口通常由
git
的鈎子功能調用,用以通知各個
SpringCloudConfig
的用戶端去服務端更新配置。
注意:這是工作的流程圖,實際的部署中
SpringCloudBus
并不是一個獨立存在的服務,這裡單列出來是為了能清晰的顯示出工作流程。
spring cloud 配置服務同時提供了git和svn兩種方式,下面是一個使用git的示例。
一.建立一個SpingCloud-config-Server
1.pom.xml檔案
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.yxf.springcloud</groupId>
<artifactId>mymicroservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>mymicroservicecloud-config-3344</artifactId>
<dependencies>
<!-- springCloud Config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- 避免Config的Git插件報錯:org/eclipse/jgit/api/TransportConfigCallback -->
<!-- https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit -->
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>4.10.0.201712302008-r</version>
</dependency>
<!-- 圖形化監控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 熔斷 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</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-jetty</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>
</dependency>
<!-- 熱部署插件 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
2.項目啟動類
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class Config_6688_StartSpringCloudApp
{
public static void main(String[] args)
{
SpringApplication.run(Config_6688_StartSpringCloudApp.class, args);
}
}
3.application.yml
server:
port: 6688
spring:
application:
name: microservicecloud-config
cloud:
config:
server:
git:
uri: http://192.168.0.132/yxs/microservicecloud-config.git
二.建立一個Eureka-config-client(單獨建立一個工程僅為讀取配置檔案)
1.pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.yxf.springcloud</groupId>
<artifactId>mymicroservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>mymicroservicecloud-config-client-3355</artifactId>
<dependencies>
<!-- SpringCloud Config用戶端 -->
<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.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</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-jetty</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>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
2.項目啟動類
package com.yxf.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ConfigClient_3355_StartSpringCloudApp
{
public static void main(String[] args)
{
SpringApplication.run(ConfigClient_3355_StartSpringCloudApp.class, args);
}
}
3.application.yml(應用程式特有配置資訊,可以用來配置後續各個子產品中需使用的公共參數等。)
spring:
application:
name: microservicecloud-config-client
4.bootstap.yml(用來程式引導時執行,應用于更加早期配置資訊讀取,如可以使用來配置application.yml中使用到參數等)
spring:
cloud:
config:
name: microservicecloud-config-client
profile: test #本次通路的配置項
label: master
uri: http://127.0.0.1:6688 #本微服務啟動後先去找6688号服務,通過SpringCloudConfig擷取Git的服務位址
測試效果