前言對於微服務而言配置本地化是個很大的雞肋,不可能每次需要改個配置都要重新把服務重新啟動一遍,因此最終的解決方案都是將配置外部化,託管在一個平臺上達到不用重啟服務即可
2021-06-25 10:44:43
對於微服務而言配置本地化是個很大的雞肋,不可能每次需要改個配置都要重新把服務重新啟動一遍,因此最終的解決方案都是將配置外部化,託管在一個平臺上達到不用重啟服務即可一次修改多處生效的目的。
但是對於單體應用的Spring Boot項目而言,動態重新整理顯然是有點多餘,反正就一個服務,改下重啟不就行了?
然而在某些特殊的場景下還是必須用到動態重新整理的,如下:
當然以上列舉的兩種場景每個公司都有不同的解決方案,這裡不做深究。
微服務下的動態配置中心有三種主流的方式,如下圖:
上圖中的三種配置中心方案可以說是現在企業中使用率最高的,分別是:
其實上述三種都可以在Spring Boot項目中適配,但是作為單體應用有些重了,下面作者簡單的介紹兩種可用的方案。
不得不說阿里巴巴確實挺有野心,阿里要做的其實是一個微服務生態,Nacos不僅僅可以作為Spring Cloud的配置和註冊中心,也適配了Dubbo、K8s,官方文件中對於如何適配都做了詳細的介紹,作者 這裡就不再詳細介紹了,如下圖:
當然Nacos對Spring、Spring Boot 項目同樣適用。
如何使用呢?這裡作者只提供下思路,不做過多的深究,這篇在作者下個專欄Spring Cloud 進階會詳細介紹:
此種方案雖說可以實現配置的動態重新整理,但是還要整合Nacos,啟動一個Nacos的服務,完全是有點大材小用了,實際項目中不推薦使用。
此種方案實際使用的是Config配置中心,但是不像Nacos那般重,完全適用於單體應用的SpringBoot項目,只需要做小部分的更改即可達到效果。
<!-- springCloud的依賴--><dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement><!-- config的依賴--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!-- actuator的依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
management.endpoints.web.exposure.include=*
config.version=22config.app.name=dynamic-projectconfig.platform=mysql
@RestController//@RefreshScope該註解必須標註,否則無法完成動態更新@RefreshScopepublic 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; }
config.version=33config.app.name=dynamic-projectconfig.platform=ORACLE
可以看到,配置已經自動修改了,結束。
看到了方案一覺得如何?是不是有點雞肋了
第一個問題:為什麼還要呼叫一次手動重新整理呢?
第二個問題:只能手動的在配置檔案中改嗎?如果想在後臺管理系統改怎麼辦?
想要解決上述兩個問題還是要看下Config的源碼,程式碼關鍵部分在org.springframework.cloud.context.refresh.ContextRefresher#refresh()方法中,如下圖:
因此只需要在修改屬性之後呼叫下ContextRefresher#refresh()(非同步,避免一直阻塞等待)方法即可。
為了方便測試,我們自己手動寫一個refresh介面,如下:
@GetMapping("/show/refresh") public String refresh(){ //修改配置檔案中屬性 HashMap<String, Object> 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); //將修改後的配置設定到environment中 environment.getPropertySources().addFirst(propertySource); //非同步呼叫refresh方法,避免阻塞一直等待無響應 new Thread(() -> contextRefresher.refresh()).start(); return "success"; }
上述程式碼中作者只是手動設定了配置檔案中的值,實際項目中可以通過持久化的方式從資料庫中讀取配置重新整理。
下面我們測試看看,啟動項目,訪問http://localhost:8080/show/version,發現是之前配置在application.properties中的值,如下圖:
呼叫refresh介面:http://localhost:8080/show/refresh重新設定屬性值;
再次呼叫http://localhost:8080/show/version檢視下配置是否修改了,如下圖:
從上圖可以發現,配置果然修改了,達到了動態重新整理的效果。
本文從微服務的配置中心介紹到Spring Boot 搭建簡易的配置中心,詳細介紹了幾種可行性的方案,作者強力推薦最後一種方案,簡化版的Config,完全適用於單體應用。
作者:碼猿技術專欄
連結:https://juejin.cn/post/6977169384787673096
來源:掘金
相關文章
前言對於微服務而言配置本地化是個很大的雞肋,不可能每次需要改個配置都要重新把服務重新啟動一遍,因此最終的解決方案都是將配置外部化,託管在一個平臺上達到不用重啟服務即可
2021-06-25 10:44:43
出品|開源中國文|局長6月24日,微軟正式公佈了下一代 Windows,和之前曝光的資訊一樣,新系統的名稱為 Windows 11。這是繼2014年10月微軟正式公佈 Windows 10 之後,時隔 6 年半帶
2021-06-25 10:43:55
【6月25日訊】相信大家都知道,華為手機在遭受到「晶片斷供」原因,一年一度的華為P50系列旗艦手機也遭到了延期,不斷延期釋出的華為P50系列手機,現在已經遲到好幾個月了,雖然華為
2021-06-25 10:43:39
其實3DMark的各個測試裡面都混有一個物理測試,這個測試其實就是跑CPU的,我們在測試CPU時也經常單獨跑這個物理測試,現在3DMark推出了一個專門跑CPU效能的測試——CPU Profile。
2021-06-25 10:43:32
6月初的鴻蒙釋出會上,華為消費者業務CEO餘承東在最後公佈了華為P50系列的真機圖,並表示會想盡辦法為大家帶來這款偉大的產品。據多方媒體爆料,華為P50系列有可能會在7月底就會
2021-06-25 10:42:49
在5G手機持續爆發、華為遇冷的大背景下,2021年必將成為智慧手機產業頗為關鍵的一年,智慧手機市場格局,仍然充滿變數。但是,對於大多數手機廠商來說,目前已經在5G時代成功駐足,尤其
2021-06-25 10:42:41