摘自:螞蟻課堂學習視頻:http://www.mayikt.com/course/video/2399
1、分佈式配置中心設計思想
(1)爲什麼要使用分佈式配置中心?
產生背景:傳統的如果生產環境配置文件,需要發生改變,則需要重新打war,重新讀取配置信息到jvm中。
(2)分佈式配置中心
在微服務當中使用同一個服務器管理所有服務配置文件信息,能夠實現後臺可管理,當服務器正在運行的時候,如果【配置文件需要發生改變,可以實現不需要重啓服務器實時更改配置文件信息。
(3)SpringCloud Config分佈式配置中心原理
1)分佈式配置中心所需組件:
· Web管理系統:後臺可以使用圖形界面管理配置文件(SpringCloud Config沒有圖形界面)。
· 存放分佈式配置文件服務器(持久存儲服務器):使用版本控制器存放配置文件信息,使用git環境。
· ConfigServer緩存配置文件服務器(臨時緩存存放)。
· ConfigClient讀取ConfigServer配置文件信息。
2)用戶提交修改的配置文件信息到 Git/SVN服務器,然後由ConfigServer服務器去Git/SVN上去獲取相關的配置文件信息放到緩存中,最後客戶端去獲取ConfigServer配置文件信息。
2、常見分佈式配置中心框架對比
1)攜程的阿波羅,有圖形界面可管理配置文件信息,配置文件存放在數據庫。
2)SpringCloud Config 沒有後臺可管理分佈式配置中逆行,配置文件信息存放在版本控制器中的(git、svn)。
3)Zookeeper實現分佈式配置中心,持久節點 + 事件通知。
3、搭建Git環境存儲配置文件(碼雲)
註冊git賬號,登錄,創建倉庫,然後創建文件夾,創建文件,不多贅述,git操作不會的百度吧。效果如圖,我這裏創建了兩個配置文件,用於測試。
4、搭建ConfigServer配置文件中心
(1)配置中心基於eureka註冊中心,首先搭建eureka註冊中心並啓動,這裏不做說明,
前面文章有搭建eureka註冊中心教程。連接如下:https://mp.csdn.net/postedit/103246697
(2)搭建ConfigServer分佈式配置中心
1、創建maven工程,引入下面的jar:
<dependencies>
<!-- springcloud整合config-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- springcloud eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
2、properties或yml配置文件配置如下:
##服務端口
server.port=8888
##註冊地址
eureka.client.serviceUrl.defaultZone=http://localhost:8100/eureka
##服務名稱
spring.application.name=config-server
##config-server讀取git環境地址
spring.cloud.config.server.git.uri=https://gitee.com/gong_hua/springcloud1
##讀取分支環境
spring.cloud.config.server.git.search-paths=config
spring.cloud.config.label=master
3、創建啓動類:
package com.gonghua;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class AppConfigServer {
//@EnableConfigServer 開啓ConfigServer服務器端
/**
* git環境上創建配置文件名稱規範:服務名稱-環境.properties
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(AppConfigServer.class, args);
}
}
4、啓動eureka註冊中心,啓動配置中心,瀏覽器訪問,效果如下:
5、ConfigClient讀取ConfigServer配置文件信息
引入pom依賴:
<!-- springboot整合web端 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springcloud整合config-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<!-- springcloud eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
配置properties或yml文件:
##服務端口
server.port=8889
##註冊地址
eureka.client.serviceUrl.defaultZone=http://localhost:8100/eureka
##服務名稱(注意:這個地方的name一定要和你的版本控制器中的文件前的服務名稱一致,我的git上創建的文件都是test-configClient開頭的)
spring.application.name=test-configClient
##讀取版本環境(這裏是開發環境或生產環境 git上的文件名稱格式:服務名稱-版本環境.properties)
spring.cloud.config.profile=dev
##讀取分佈式配置中心的服務名稱
spring.cloud.config.discovery.service-id=config-server
##開啓讀取權限
spring.cloud.config.discovery.enabled=true
添加測試類和啓動類
(1)測試類:
@RestController
public class TestController {
@Value("${myselfInfo}")
private String myselfInfo;
@RequestMapping("/getFileInfo")
public String getFileInfo(){
return myselfInfo;
}
}
(2)啓動類:
@SpringBootApplication
@EnableEurekaClient
public class AppConfigClient {
public static void main(String[] args) {
SpringApplication.run(AppConfigClient.class, args);
}
}
啓動服務,訪問如下:
6、SpringCloudConfig實時刷新配置文件
默認情況下,更改git或svn上的配置文件後,是不能實時讀取到的,要想讀到更改後的內容,傳統方式如下:
(1)重啓client端服務器; (2)建立定時任務,定時去讀取;
springcloud分佈式配置中心,可以採用手動刷新或者自動刷新:這二者都不需要重啓服務。
手動刷新:需要人工調用接口,讀取最新配置文件(actuator監控中心)。
自動刷新:消息總線進行實時通知(springbus)。 (缺點:對性能不是很好)
手動刷新相關配置:
(1)客戶端的pom.xml添加actuator依賴:
<!-- 監控中心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(2)application.properties開啓所有斷點的監控
##開啓所有斷點的監控
management.endpoints.web.exposure.include=*
(3)對應的類上添加@RefreshScope註解。
(4)修改git上的配置文件的內容後,這個時候不需要重啓服務器,只需要手動調用actuator的刷新接口(注意是post請求)。
接口地址:http://127.0.0.1:8889/actuator/refresh 作用:重新讀取git服務器上的文件內容,並緩存到內存中去。
然後調用讀取配置文件的接口,這個時候就是讀取的最新的配置文件的內容。如下圖:
修改前: 請求結果:
--------------------------------------------------------
修改後: 刷新:
-------------------------
刷新後的請求的結果: