www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]前言對(duì)于微服務(wù)而言配置本地化是個(gè)很大的雞肋,不可能每次需要改個(gè)配置都要重新把服務(wù)重新啟動(dòng)一遍,因此最終的解決方案都是將配置外部化,托管在一個(gè)平臺(tái)上達(dá)到不用重啟服務(wù)即可一次修改多處生效的目的。但是對(duì)于單體應(yīng)用的SpringBoot項(xiàng)目而言,動(dòng)態(tài)刷新顯然是有點(diǎn)多余,反正就一個(gè)服務(wù),改...

前言

對(duì)于微服務(wù)而言配置本地化是個(gè)很大的雞肋,不可能每次需要改個(gè)配置都要重新把服務(wù)重新啟動(dòng)一遍,因此最終的解決方案都是將配置外部化,托管在一個(gè)平臺(tái)上達(dá)到不用重啟服務(wù)即可一次修改多處生效的目的。

但是對(duì)于單體應(yīng)用的Spring Boot項(xiàng)目而言,動(dòng)態(tài)刷新顯然是有點(diǎn)多余,反正就一個(gè)服務(wù),改下重啟不就行了?

然而在某些特殊的場(chǎng)景下還是必須用到動(dòng)態(tài)刷新的,如下:

  1. 添加數(shù)據(jù)源:對(duì)接某個(gè)第三方平臺(tái)的時(shí)候,你不可能每次添加一個(gè)數(shù)據(jù)源都要重啟下服務(wù)
  2. 固化的對(duì)接:大量的固定對(duì)接方式,只是其中的某個(gè)固定的代碼段不同,比如提供視圖中的字段不同,接口服務(wù)中字段不同等情況。
當(dāng)然以上列舉的兩種場(chǎng)景每個(gè)公司都有不同的解決方案,這里不做深究。

微服務(wù)下有哪幾種主流的方案?

微服務(wù)下的動(dòng)態(tài)配置中心有三種主流的方式,如下圖:

如何讓Spring?Boot?的配置?“動(dòng)”?起來(lái)?
上圖中的三種配置中心方案可以說(shuō)是現(xiàn)在企業(yè)中使用率最高的,分別是:

  1. Nacos:阿里巴巴的最近開(kāi)源的項(xiàng)目,這個(gè)家伙很牛逼,一個(gè)干掉了Eureka(停更)和Config Bus,既能作為配置中心也能作為注冊(cè)中心,并且有自己的獨(dú)立的 管理平臺(tái),可以說(shuō)是現(xiàn)在最主流的一種。

  2. Config Bus:早期在用的微服務(wù)配置中心,可以依托GitHub管理微服務(wù)的配置文件,這種現(xiàn)在也是有不少企業(yè)在用,但是需要自己獨(dú)立部署一個(gè)微服務(wù),和Nacos相比遜色了不少。

  3. Apollo:攜程開(kāi)源項(xiàng)目Apollo,這個(gè)也是不少企業(yè)在用,陳某了解的不多,有興趣的可以深入研究下。

針對(duì)Spring Boot 適用的幾種方案?

其實(shí)上述三種都可以在Spring Boot項(xiàng)目中適配,但是作為單體應(yīng)用有些重了,下面作者簡(jiǎn)單的介紹兩種可用的方案。

Spring Boot Nacos(不推薦)

不得不說(shuō)阿里巴巴確實(shí)挺有野心,阿里要做的其實(shí)是一個(gè)微服務(wù)生態(tài),Nacos不僅僅可以作為Spring Cloud的配置和注冊(cè)中心,也適配了Dubbo、K8s,官方文檔中對(duì)于如何適配都做了詳細(xì)的介紹,作者 這里就不再詳細(xì)介紹了,如下圖:

如何讓Spring?Boot?的配置?“動(dòng)”?起來(lái)?
當(dāng)然Nacos對(duì)Spring、Spring Boot 項(xiàng)目同樣適用。

如何使用呢?這里作者只提供下思路,不做過(guò)多的深究,這篇在作者下個(gè)專欄Spring Cloud 進(jìn)階會(huì)詳細(xì)介紹:

  1. 下載對(duì)應(yīng)版本的Nacos,啟動(dòng)項(xiàng)目,訪問(wèn)http://localhost:8848進(jìn)入Nacos的管理界面;

  2. Spring Boot 項(xiàng)目引入Nacos的配置依賴nacos-config-spring-boot-starter,配置Nacos管理中心的地址。

  3. @NacosPropertySource@NacosValue兩個(gè)注解結(jié)合完成。

  • @NacosPropertySource:指定配置中心的dataId,和是否自動(dòng)刷新
  • @NacosValue替代@Value注解完成屬性的自動(dòng)裝配
  1. 如果公司項(xiàng)目做了后臺(tái)管理,則可以直接調(diào)用Nacos開(kāi)放的API修改對(duì)應(yīng)配置的值(替代了Nacos管理界面的手動(dòng)操作),API的地址:https://nacos.io/zh-cn/docs/open-api.html
此種方案雖說(shuō)可以實(shí)現(xiàn)配置的動(dòng)態(tài)刷新,但是還要集成Nacos,啟動(dòng)一個(gè)Nacos的服務(wù),完全是有點(diǎn)大材小用了,實(shí)際項(xiàng)目中不推薦使用。

Spring Boot Config actuator(推薦)

此種方案實(shí)際使用的是Config配置中心,但是不像Nacos那般重,完全適用于單體應(yīng)用的SpringBoot項(xiàng)目,只需要做小部分的更改即可達(dá)到效果。

方案一(不推薦)

  1. 添加Config的依賴,如下:

<dependencyManagement>
????<dependencies>
????????<dependency>
????????????????<groupId>org.springframework.cloudgroupId>
????????????????<artifactId>spring-cloud-dependenciesartifactId>
????????????????<version>Hoxton.SR3version>
????????????????<type>pomtype>
????????????????<scope>importscope>
????????????dependency>
????dependencies>
dependencyManagement>


<dependency>
??????<groupId>org.springframework.cloudgroupId>
??????<artifactId>spring-cloud-starter-configartifactId>
????dependency>

??
????<dependency>
??????<groupId>org.springframework.bootgroupId>
??????<artifactId>spring-boot-starter-actuatorartifactId>
????dependency>
  1. 配置文件中暴露Spring Boot的端點(diǎn),如下:
management.endpoints.web.exposure.include=*
  1. 配置文件中新增三個(gè)屬性配置:
config.version=22
config.app.name=dynamic-project
config.platform=mysql
  1. 結(jié)合@RefreshScope注解動(dòng)態(tài)刷新,寫個(gè)Controller,如下:
@RestController
//@RefreshScope該注解必須標(biāo)注,否則無(wú)法完成動(dòng)態(tài)更新
@RefreshScope
public?class?DynamicConfigController?{
????@Value("${config.version}")
????private?String?version;

????@Value("${config.app.name}")
????private?String?appName;

????@Value("${config.platform}")
????private?String?platform;


????@GetMapping("/show/version")
????public?String?test(){
????????return?"version=" version "-appName=" appName "-platform=" platform;
????}
  1. 啟動(dòng)項(xiàng)目測(cè)試,瀏覽器訪問(wèn)http://localhost:8080/show/version,返回信息如下圖:
如何讓Spring?Boot?的配置?“動(dòng)”?起來(lái)?
  1. 修改target目錄下的配置文件,如下:
config.version=33
config.app.name=dynamic-project
config.platform=ORACLE
  1. POST請(qǐng)求http://localhost:8080/actuator/refresh接口,手動(dòng)刷新下配置(必須,否則不能自動(dòng)刷新)

  2. 瀏覽器再次輸入http://localhost:8080/show/version,結(jié)果如下圖:

如何讓Spring?Boot?的配置?“動(dòng)”?起來(lái)?
可以看到,配置已經(jīng)自動(dòng)修改了,結(jié)束。

方案二(推薦)
看到了方案一覺(jué)得如何?是不是有點(diǎn)雞肋了

第一個(gè)問(wèn)題:為什么還要調(diào)用一次手動(dòng)刷新呢?

第二個(gè)問(wèn)題:只能手動(dòng)的在配置文件中改嗎?如果想在后臺(tái)管理系統(tǒng)改怎么辦?

想要解決上述兩個(gè)問(wèn)題還是要看下Config的源碼,代碼關(guān)鍵部分在org.springframework.cloud.context.refresh.ContextRefresher#refresh()方法中,如下圖:

如何讓Spring?Boot?的配置?“動(dòng)”?起來(lái)?
因此只需要在修改屬性之后調(diào)用下ContextRefresher#refresh()(異步,避免一直阻塞等待)方法即可。

為了方便測(cè)試,我們自己手動(dòng)寫一個(gè)refresh接口,如下:

@GetMapping("/show/refresh")
????public?String?refresh(){
????????//修改配置文件中屬性
????????HashMap?map?=?new?HashMap<>();
????????map.put("config.version",99);
????????map.put("config.app.name","appName");
????????map.put("config.platform","ORACLE");
????????MapPropertySource?propertySource=new?MapPropertySource("dynamic",map);
????????//將修改后的配置設(shè)置到environment中
????????environment.getPropertySources().addFirst(propertySource);
????????//異步調(diào)用refresh方法,避免阻塞一直等待無(wú)響應(yīng)
????????new?Thread(()?->?contextRefresher.refresh()).start();
????????return?"success";
????}
上述代碼中作者只是手動(dòng)設(shè)置了配置文件中的值,實(shí)際項(xiàng)目中可以通過(guò)持久化的方式從數(shù)據(jù)庫(kù)中讀取配置刷新。

下面我們測(cè)試看看,啟動(dòng)項(xiàng)目,訪問(wèn)http://localhost:8080/show/version,發(fā)現(xiàn)是之前配置在application.properties中的值,如下圖:

如何讓Spring?Boot?的配置?“動(dòng)”?起來(lái)?
調(diào)用refresh接口:http://localhost:8080/show/refresh重新設(shè)置屬性值;

再次調(diào)用http://localhost:8080/show/version查看下配置是否修改了,如下圖:

如何讓Spring?Boot?的配置?“動(dòng)”?起來(lái)?
從上圖可以發(fā)現(xiàn),配置果然修改了,達(dá)到了動(dòng)態(tài)刷新的效果。

總結(jié)

本文從微服務(wù)的配置中心介紹到Spring Boot 搭建簡(jiǎn)易的配置中心,詳細(xì)介紹了幾種可行性的方案,作者強(qiáng)力推薦最后一種方案,簡(jiǎn)化版的Config,完全適用于單體應(yīng)用。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉