SpringCloud微服務(wù)應(yīng)用config配置中心詳解
前言
在系統(tǒng)架構(gòu)中,和安全、日志、監(jiān)控等非功能需求同樣,配置管理也是一種非功能需求。配置中心是整個(gè)微服務(wù)基礎(chǔ)架構(gòu)體系中的一個(gè)組件,如下圖,它的功能看上去并不起眼,無(wú)非就是簡(jiǎn)單配置的管理和存取,但它是整個(gè)微服務(wù)架構(gòu)中不可或缺的一環(huán)。另外,配置中心若是真得用好了,它還能推進(jìn)技術(shù)組織持續(xù)交付和DevOps轉(zhuǎn)型。

一、傳統(tǒng)應(yīng)用配置痛點(diǎn)
配置散亂格式不標(biāo)準(zhǔn)
配置散亂格式不標(biāo)準(zhǔn)
有的用 properties 格式,有的用 xml 格式,還有的存 DB,團(tuán)隊(duì)傾向自造輪子,作法五花八門。
主要采用本地靜態(tài)配置,配置修改麻煩
配置修改通常須要通過(guò)一個(gè)較長(zhǎng)的測(cè)試發(fā)布周期。在分布式微服務(wù)環(huán)境下,當(dāng)服務(wù)實(shí)例不少時(shí),修改配置費(fèi)時(shí)費(fèi)力。
易引起生產(chǎn)事故
團(tuán)隊(duì)在發(fā)布的時(shí)候?qū)y(cè)試環(huán)境的配置帶到生產(chǎn)上,引起資損事故。
配置缺少安全審計(jì)和版本控制功能
二、Config 配置中心介紹
配置中心實(shí)際上就是分布式系統(tǒng)中集中統(tǒng)一管理線上應(yīng)用程序配置項(xiàng)的管理平臺(tái)。
在微服務(wù)架構(gòu)中,當(dāng)系統(tǒng)從一個(gè)單體應(yīng)用,被拆分成分布式系統(tǒng)上一個(gè)個(gè)服務(wù)節(jié)點(diǎn)后,配置文件也必須跟著遷移(分割),這樣配置就分散了。不僅如此,分散中還伴隨著冗余,如下圖所示:

創(chuàng)建配置中心,將配置從各個(gè)應(yīng)用中剝離出來(lái),對(duì)配置進(jìn)行統(tǒng)一管理,應(yīng)用自身不需要自己去管理配置。如下圖所示:

總結(jié)起來(lái)最主要包括以下三方面核心功能:
配置統(tǒng)一管理
配置項(xiàng)的修改編輯統(tǒng)一在配置中心頁(yè)面進(jìn)行,還包括統(tǒng)一的配置版本管理、環(huán)境隔離、灰度發(fā)布以及熱發(fā)布,在不重啟應(yīng)用的情況下使得修改的配置可以生效起作用。
權(quán)限統(tǒng)一控制
主要控制其配置的讀取權(quán)限以及修改權(quán)限,通過(guò)統(tǒng)一的權(quán)限管理提升運(yùn)維效率。
操作統(tǒng)一審計(jì)
記錄用戶操作修改配置的歷史信息,這樣在出現(xiàn)問(wèn)題的時(shí)候可以進(jìn)行復(fù)盤回查,同時(shí)進(jìn)行操作審計(jì)。
三、服務(wù)端Config Server搭建
1.pom依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <!-- 動(dòng)態(tài)刷新使用 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
2.application啟動(dòng)類配置
@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
3.application.yml配置
spring:
application:
name: config-server
# 使用本地文件,也可配置成從git獲取配置文件
profiles:
active:
- native
cloud:
config:
server:
native:
search-locations: classpath:/config
allow-override: true
override-none: true
override-system-properties: false
discovery:
enabled: true
fail-fast: true
# 注冊(cè)eureka地址,提供客戶端eureka訪問(wèn)
eureka:
client:
serviceUrl:
defaultZone: http://ip:port/eureka/
server:
port: 8889
4.test-dev.xml(客戶端應(yīng)讀取的配置)
profile:
dev
spring:
rabbitmq:
host: 10.10.10.10
port: 5672
username: admin
password: 123456
test:
override: client-server
refresh: re3
5.項(xiàng)目結(jié)構(gòu)

四、客戶端Config Client搭建
1.pom依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!-- 動(dòng)態(tài)刷新使用 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.application啟動(dòng)類配置
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
}3.bootstrap.yml配置
創(chuàng)建bootstrap.yml配置,因?yàn)閱?dòng)服務(wù)會(huì)優(yōu)先采用這個(gè)文件的配置,然后是application.yml的配置,服務(wù)器啟動(dòng)核心配置可能在配置中心,所以必須創(chuàng)建bootstrap.yml,優(yōu)先連接配置中心
spring:
cloud:
config:
# 采用的是test-dev.yml,name是前綴,profile是后綴,label是git存放的分支節(jié)點(diǎn)(本次未使用)
name: test
profile: dev
label: dev
# 通過(guò)service-id(eureka服務(wù)名)連接配置中心
discovery:
enabled: true
service-id: config-server
eureka:
client:
serviceUrl:
defaultZone: http://ip:port/eureka/4.application.yml配置
server:
port: 8888
spring:
application:
name: config-client
eureka:
client:
serviceUrl:
defaultZone: http://ip:port/eureka/
# 動(dòng)態(tài)刷新使用
management:
endpoints:
web:
exposure:
# 暴露監(jiān)控接口,*為全部接口
include: '*'5.測(cè)試controller
@RestController
@RefreshScope
public class TestController {
@Value("${spring.rabbitmq.host}")
String host;
@Value("${test.override}")
String override;
@Value("${test.refresh}")
String refresh;
@RequestMapping("/config")
public String getConfig(){
return host;
}
@RequestMapping("/override")
public String getOverride(){
return override;
}
@RequestMapping("/refresh")
public String getRefresh(){
return refresh;
}
}6.項(xiàng)目結(jié)構(gòu)

五.動(dòng)態(tài)刷新
上述配置中已經(jīng)包含了動(dòng)態(tài)刷新配置,讓我們一起看一下,是哪些配置起到的作用呢
1.客戶端Config client,添加spring-boot-starter-actuator依賴
<!-- 動(dòng)態(tài)刷新使用 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
2.Controller層添加注解@RefreshScope
@RestController @RefreshScope public class TestController
3.客戶端application.yml增加配置
# 動(dòng)態(tài)刷新使用
management:
endpoints:
web:
exposure:
# 暴露監(jiān)控接口,*為全部接口
include: '*'4.客戶端手動(dòng)調(diào)用動(dòng)態(tài)刷新接口
http://localhost:8888/actuator/refresh
六.測(cè)試
開(kāi)啟eureka,gateway,config server,config client服務(wù),注意開(kāi)啟順序
1.調(diào)用TestController中config接口


返回了server中mq的ip,正確
2.調(diào)用TestController中override接口


返回了server中test.override的配置,覆蓋了client的test.override
3.調(diào)用TestController中refresh接口(動(dòng)態(tài)刷新)


現(xiàn)在,我們修改server中test.refresh配置,由re2改為re3
重啟client server(因?yàn)榕渲弥行牡呐渲梦募捎玫姆?wù)端管理,如果放置git可以不用重啟)
重啟完成后再起請(qǐng)求refresh接口

仍然返回re2,現(xiàn)在我們調(diào)用刷新接口

注意設(shè)置Post的header屬性Content-Type=application/json

刷新成功,并返回了屬性名稱,再次請(qǐng)求refresh接口,得到最新的配置:re3

到此這篇關(guān)于SpringCloud微服務(wù)應(yīng)用-config配置中心(介紹、搭建、動(dòng)態(tài)刷新、測(cè)試)的文章就介紹到這了,更多相關(guān)SpringCloud config配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Spring MVC在Controller層中注入request的坑詳解
這篇文章主要給大家介紹了關(guān)于Spring MVC在Controller層中注入request的坑的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
Java基于Runtime調(diào)用外部程序出現(xiàn)阻塞的解決方法
這篇文章主要介紹了Java基于Runtime調(diào)用外部程序出現(xiàn)阻塞的解決方法,是一個(gè)非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09
Java實(shí)戰(zhàn)之郵件的撰寫和發(fā)送
這篇文章主要為大家詳細(xì)介紹了通過(guò)Java代碼實(shí)現(xiàn)郵件的撰寫和發(fā)送功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的小伙伴們可以學(xué)習(xí)一下2021-11-11
使用注解進(jìn)行Spring開(kāi)發(fā)的全過(guò)程
使用注解(Annotation)是一種在代碼級(jí)別進(jìn)行說(shuō)明和標(biāo)記的技術(shù),它從JDK 5.0開(kāi)始引入,并在現(xiàn)代Java開(kāi)發(fā)中得到了廣泛應(yīng)用,本文將詳細(xì)介紹Spring框架中常用的注解及示例,幫助開(kāi)發(fā)者快速掌握Spring注解開(kāi)發(fā)的要點(diǎn)和技巧,需要的朋友可以參考下2023-11-11
Spring Boot超詳細(xì)分析啟動(dòng)流程
SpringBoot是Spring開(kāi)源組織下的子項(xiàng)目,是Spring組件一站式解決方案,主要是簡(jiǎn)化了使用Spring的難度,簡(jiǎn)省了繁重的配置,提供了各種啟動(dòng)器,開(kāi)發(fā)者能快速上手,這篇文章主要給大家介紹了關(guān)于Spring Boot啟動(dòng)流程知識(shí)點(diǎn)的相關(guān)資料,需要的朋友可以參考下2022-07-07
java用list集合存儲(chǔ)學(xué)生信息并算出成績(jī)平均值操作
這篇文章主要介紹了java用list集合存儲(chǔ)學(xué)生信息并算出成績(jī)平均值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Java實(shí)現(xiàn)特定范圍的完數(shù)輸出算法示例
這篇文章主要介紹了Java實(shí)現(xiàn)特定范圍的完數(shù)輸出算法,簡(jiǎn)單說(shuō)明了完數(shù)的概念、計(jì)算原理并結(jié)合實(shí)例形式分析了java針對(duì)給定范圍內(nèi)的完數(shù)輸出操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12
Java對(duì)象轉(zhuǎn)json JsonFormat注解
這篇文章主要介紹了Java對(duì)象轉(zhuǎn)json JsonFormat注解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05

