前面我們一起交流了Apollo配置中心的基本原理以及各種環境的搭建,今天我們進行springboot整合Apollo實現集中化配置、自動化更新
應用場景
任何沒有業務應用場景的技術都是紙上談兵,先說說應用場景
隨着現在微服務技術越來越火爆熱門,越來越普及,當單體服務升級為集群或者微服務的時候,服務變多變復雜,相關的配置也會呈幾何倍數增長
拿springboot舉例,我們開發環境的時候,數據庫參數、緩存各種參數都寫在application配置文件中,測試、生產環境通過啟動參數-Dspring.datasource....之類的進行指定。或者有些通過application-env配置文件進行不同環境的不同參數進行配置,在啟動的時候指定當前運行環境-Dspring.profile.active=dev等。但是服務變多以后,配置參數的檢查,更新將會是一個災難性的場景,而且還不支持配置參數的熱更新,修改參數后必須重新打包、重啟應用。
所以在這種情況下,配置中心這種中間件應運而生,目前主流的有攜程的Apollo、netflux的config、ali的nacos,今天我們主要討論Apollo
應用整合
首先創建一個springboot應用,具體創建過程不是本文重點(略)
整合改造過程
1.修改pom添加Apollo依賴,以支持Apollo配置中心
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.4.0</version> </dependency>
2.填寫Apollo信息配置
# 項目名稱
app.id=${spring.application.name}
# Apollo配置中心地址
apollo.meta=http://localhost:8080
# 是否開啟spring參數自動更新
apollo.autoUpdateInjectedSpringProperties=true
3.啟動類上面添加注解
在啟動類上加上apollo開啟注解@EnableApolloConfig
4.創建配置項
項目改造完成以后,打開瀏覽器輸入apollo控制台地址進行配置的管理
創建一個和剛才創建的應用同名的應用(配置中的spring.application.name),然后在里面新增一個配置(因為8080端口被apollo占用,所以增加一個服務綁定端口的配置)
test=9995
server.port=8085
然后在springboot中創建一個controller
@RestController public class HelloController { @Value("${test}") private String test; @GetMapping("hello") public Object say() { System.out.println(res); return "hello " + test; } }
5.啟動程序,進行測試
啟動程序后,打開瀏覽器訪問http://localhost:8085/hello即可看到頁面上顯示的“hello 9995”
當我們在apollo上對這個參數進行修改test=555並發布后,再訪問http://localhost:8085/hello即可看到頁面上顯示的“hello 555”
這樣就實現了服務的集中化配置,以及自動化熱更新
apollo集群配置
Apollo配置中心的四個維度其中有一個集群,默認都是沒有配置集群的(default),如果有需要,可以這樣添加
1.Apollo配置中心新增一個集群
打開Apollo控制台,進入項目,在界面左下方找到添加集群按鈕並點擊
然后在添加集群頁面輸入集群名稱(我這里用的shanghai),勾選所要生效的環境確定即可
2.在springboot項目中使用
springboot中如果不指定集群配置,即使用默認的集群default,如果需要使用新的集群,可在配置文件或者啟動參數中加這個配置
apollo.cluster=shanghai
最后再在shanghai這個集群中添加一些配置並發布,比如
test=8888 server.port=8003
再重啟springboot即可看到服務端口變為8003,再打開瀏覽器訪問http://localhost:8085/hello即可看到頁面上顯示的“hello 8888”
多環境配置
springboot使用Apollo配置中心的多環境配置時有些特殊
並不是通過指定某個env等於dev或者test來確定,而是指定apollo.meta=http://1111111:8080,這個地址為apollo配置中心對應環境的eurka地址
比如以上篇文章的環境為例,要使用dev環境就配置apollo.meta=http://localhost:8081,要使用uat環境就配置apollo.meta=http://localhost:8083
這里我們使用sit環境
apollo.meta=http://localhost:8082
springboot中配置好后,再在apollo的sit環境中添加相應配置並發布,然后重啟springboot即可看到配置已生效
多namespace配置
在apollo配置中心里多namespace配置在項目配置界面左下角點擊添加namespace按鈕,然后在添加頁面選擇創建namespace,然后輸入名稱確定即可在項目配置頁面看到新建的namespace空間
在這個空間里添加自己的配置
在springboot中指定項目所使用的命名空間稍微有點不同,這里支持同時配置多個namespace,多個用英文逗號隔開
apollo.bootstrap.namespaces=application,datasources,pay.yml
PS1:這里需要注意的是,如果這多個namespace中包含相同的配置,那么以配置靠前的namespace中的配置為准
PS2:如果apollo中添加的namespace配置格式為yml等非properties的時候,springboot中配置應該帶上.后綴名,比如我的pay.yml
然后在各個環境中添加好相應的配置並發布,再重啟springboot即可看到多namespace的配置已生效
幾點個人建議
首先對於四個維度app,env,cluster,namespace的應用
application,即項目,每個springboot項目都要設置自己的名稱spring.application,name,然后apollo配置中心中創建的項目名稱盡量要和springboot的項目名稱相同,這樣在配置中指定app.id=${spring.appcation.name}即可,人員排查配置問題的時候也方便檢查,其實重點就是人員肉眼觀察起來方便,可讀性強
env,環境,這個和springboot的env稍微有點差別,建議根據自己公司情況設置3-5個環境,自己公司有幾個運行環境,springboot就配置幾套配置文件(application-dev.yml,application-sit.yml....) apollo配置中心也相應的配置幾個不同的環境(dev、sit....),在application-dev.yml中配置apollo.meta=http://apollo.dev.meta:8080,在application-sit.yml中配置apollo.meta=http://apollo.sit.meta:8080,這樣來指定不同環境所讀取的apollo配置
cluster,集群,這個配置可以根據自己項目實際,進行添加配置,目前中小型公司用到的不多,個人覺得作用不是很大,幾乎可以忽略。但是在開發dev環境的時候倒是可以用一下,因為開發過程中,我們很多開發人員喜歡自己用自己單獨部署的數據庫或者其他配置信息,這樣在啟動參數中添加會很麻煩,改配置文件也涉及到代碼提交分支切換等會很麻煩,可以考慮開發人員根據自己實際,在dev環境下新建一個屬於自己專屬的cluster,啟動參數中專門指定自己dev模式下讀取的cluster為自己專屬的集群即可,-Dapollo.cluster=my-name,這樣可以避免啟動參數過於復雜以及配置文件有修改變動導致代碼提交不方便
namespace,命名空間,這個配置是區分項目中不同類型的配置進行歸類存放的,比如數據庫信息的配置可以創建一個namespace名稱為datasource在里面存放,緩存信息可以創建cache在里面存放,支付相關可以創建pay在里面存放等等。
另外,命名空間有區分共用還是私用,前面我們介紹的全部是私用的,關於共用的比如緩存信息配置,可能多個項目共用一個緩存服務器,這樣可以創建一個public的namespace,里面存放緩存相關配置,任何項目都可以在namespace中寫上這個cache以引入緩存配置,同時這個公共namespace已經不屬於某個項目了,而是整個環境(env)中全局唯一了,所以需要注意命名
另外還有配置的繼承玩法,個人覺得這個容易引起配置復雜混亂,所以沒有過多研究,這里就不作交流了
以上幾點是個人看法,如果有不同見解的還望在評論區中提出,大家共同學習,共同進步