spring cloud實戰與思考(一) spring config全局配置方案設計
“spring cloud”的配置中心工具“spring cloud config”提供了分布式系統配置文件集中管理解決方案。該工具功能強大,實現也很簡單。網上可以搜索到很多開發教程和用例。本文並不是分享“spring cloud config”的開發方法,而是想聊一聊它的使用。
任何一個工具不管多麽強大和便利,如果用的不好,也達不到期望的效果。拿到“spring cloud config”後,我期望基於這個工具構建的配置文件管理系統能夠實現:
- 微服務中各個實例的配置項都集中在配置中心。運維人員無需逐一鏈接到各個分布式節點,能夠在配置中心完成微服務實例所有配置項的修改。
- 配置項信息源要單一。同一個配置項不會出現在兩個源中。以免兩個源中同一個配置項數值不一致,導致業務邏輯混亂。
通常在網上看到的“spring cloud config”實例中,“config client”的本地配置文件“bootstrap.properties”如下:
文件中微服務端口號“8001”和實例名稱“booking-server”配置項其實是有可能改動的。例如增減微服務實例、端口號已占用、新增微服務類型等場景。所以將它們放到本地配置文件中無法滿足第一個需求。此外為了滿足第二個需求,需要將配置項按照使用範圍進行分類,分別放入不同的配置文件中:
1) 所有微服務實例共享的配置項,例如common.properties
2) 同類微服務實例共享的配置項,例如booking-common.properties
3) 特定微服務實例獨享的配置項,例如booking-server-a.properties、booking-server-b.properties
這就要求微服務實例能夠加載多個遠端的配置文件。而上面這種配置方式是使用微服務名稱“booking-server”映射到配置中心的“booking-server-dev.properties”配置文件。限制了加載的配置文件數量和名稱。無法滿足第二個需求。
現在以booking微服務dev版本為例,修改上面的配置文件:
- 微服務端口號“server.port”是實例獨享的配置項,將“server.port”放入“booking-server-a.properties
- 微服務名稱“spring.application.name”是booking類服務各個實例共享的配置項,將“spring.application.name”放入“booking-common.properties”配置文件中。
- 服務註冊中心地址配置項“eureka.client.serviceUrl.deaultZone”只能保留在本地配置文件中。
- 配置中心微服務名稱“spring.cloud.config.discovery.service-id”只能保留在本地配置文件中。
- 將微服務booking與其他微服務共享的配置項放入“common.properties”配置文件中。
- 使用“spring.cloud.config.name”配置項同時加載“common.properties”、“booking-common.properties”和“booking-server-a.properties”配置文件。
修改後的配置文件如下:
common-dev.properties配置文件:
booking-common-dev.properties配置文件:
booking-server-a-dev.properties配置文件:
"booking-server-a"本地“bootstrap.properties”配置文件:
現在“booking”微服務實例a的本地配置文件已經得到精簡,只保留了必要的配置項。這些配置項是必須的,用來指示“config client”如何找到“config server”以及應該加載那些配置文件。此外配置項“spring.cloud.config.name”和“spring.cloud.config.profile”配置項可以放到啟動微服務的命令行中。這樣可以編譯一個通用jar包,通過不同命令行參數啟動為不同的微服務實例。
再次精簡的本地“bootstrap.properties”配置文件:
啟動“booking”微服務a的命令:
java -jar .\booking-server.jar --spring.cloud.config.name=common,booking-common,booking-server-a --spring.cloud.config.profile=dev
本文講的東西是比較簡單的。主要是分享一下使用“spring cloud config”的一種思路。
spring cloud實戰與思考(一) spring config全局配置方案設計