概述
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比烏審網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式烏審網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋烏審地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。
假設(shè)現(xiàn)在有個(gè)需求:
我們的應(yīng)用部署在10臺(tái)機(jī)器上,當(dāng)我們調(diào)整完某個(gè)配置參數(shù)時(shí),無(wú)需重啟機(jī)器,10臺(tái)機(jī)器自動(dòng)能獲取到最新的配置。
如何來(lái)實(shí)現(xiàn)呢?有很多種,比如:
1、將配置放置到一個(gè)數(shù)據(jù)庫(kù)里面,應(yīng)用每次讀取配置都是直接從DB讀取。這樣的話,我們只需要做一個(gè)DB變更,把最新的配置信息更新到數(shù)據(jù)庫(kù)即可。這樣無(wú)論多少臺(tái)應(yīng)用,由于都從同一個(gè)DB獲取配置信息,自然都能拿到最新的配置。
2、每臺(tái)機(jī)器提供一個(gè)更新配置信息的updateConfig接口,當(dāng)需要修改配置時(shí),挨個(gè)調(diào)用服務(wù)器的updateConfig接口。
3、借助redis來(lái)實(shí)現(xiàn),把配置信息放置到redis上,但是這樣子,就每次都得去redis讀取,多了一些網(wǎng)絡(luò)請(qǐng)求。
上面這三種方法是最容易想到的,也很容易做,但是缺點(diǎn)當(dāng)然也非常的多。雖說(shuō)缺點(diǎn)很多,但是某些傳統(tǒng)企業(yè)還真是這么干的。
在互聯(lián)網(wǎng)企業(yè)里,基本沒(méi)見(jiàn)過(guò)這么玩的,都是會(huì)使用分布式配置中心。用開(kāi)源的或者自己實(shí)現(xiàn),目前開(kāi)源的分布式配置中心有很多,而spring cloud config就是其中的佼佼者。下面我們就用spring cloud config來(lái)實(shí)現(xiàn)一個(gè)分布式配置中心。
是否使用最新的Spring Boot 2.0 版本
我曾經(jīng)使用最新的spring cloud 2.0做了一個(gè)分布式是配置中心的demo。原本以為很簡(jiǎn)單,但是居然足足花了一天才搞定。有以下幾個(gè)原因:
1、spring cloud對(duì)應(yīng)的文檔沒(méi)有完全更新,出了問(wèn)題,在文檔里找不著;
2、目前使用2.0版本的公司很少,網(wǎng)上也沒(méi)什么具體實(shí)戰(zhàn)文章介紹。出了問(wèn)題后,百度是找不到解決方案的。而google也基本很難找到方案,都是一些零星的知識(shí)碎片;
3、2.0這個(gè)版本,config和bus這塊有些小變動(dòng),如果還按照1.5.x的版本來(lái)弄的話,是行不通的。
基于上面幾個(gè)原因,建議使用1.5.x的版本靠譜些。下面這篇文章會(huì)以下面的版本來(lái)介紹的:
spring boot:
1.5.2.RELEASE
對(duì)應(yīng)的spring cloud使用:
Dalston.RELEASE
搭建spring cloud config server
如果你只是想把配置統(tǒng)一由spring cloud config來(lái)管理,而暫時(shí)不想做配置中心的高可用的話,則只需要config和bus兩個(gè)組件就夠了。但是如果要保證高可用,還得使用spring cloud的注冊(cè)發(fā)現(xiàn)組件。
除了config和bus之外,我們還需要使用git。因?yàn)閟pring cloud config是使用git來(lái)做版本管理的。
基于spring cloud config做一個(gè)配置中心,很簡(jiǎn)單,只要幾個(gè)小步驟就搞定了。
【1】引入config和bus組件
org.springframework.cloud spring-cloud-config-server org.springframework.cloud spring-cloud-starter-bus-amqp
【2】啟動(dòng)類使用@EnableConfigServer注解
package spring.cloud.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; @EnableConfigServer @SpringBootApplication public class ConfigApplication { public static void main(String[] args) { SpringApplication.run(ConfigApplication.class, args); } }
【3】application.yml文件配置rabbitmq和git倉(cāng)庫(kù)
server: port: 8040 spring: application: name: spring-cloud-config-server cloud: config: server: git: uri: https://gitlab.xxxxxx.com/config/xxxxxxx.git search-paths: username: xxxxx password: xxxxxx activemq: host: 127.0.0.1 port: 5672 username: guest password: guest management: security: enabled: false
配置RabbitMQ是因?yàn)閎us組件需要使用它來(lái)通知客戶端,配置有變動(dòng)。另外,記得使用
management: security: enabled: false
將驗(yàn)證關(guān)閉掉,不然后面的操作,老是報(bào)授權(quán)錯(cuò)誤。
到此服務(wù)端配置中心已經(jīng)搞定了?,F(xiàn)在你就可以在服務(wù)端先做個(gè)小實(shí)驗(yàn),提交一個(gè)demo-dev.properties文件,文件的內(nèi)容如下:
address=hello
然后使用
http://localhost:8040/demo/dev
如果能輸出
{“address”:”hello”}
就說(shuō)明spring cloud config跟git的交互是ok的。
客戶端接入配置中心
我們的目標(biāo):
當(dāng)把配置信息修改完提交到git上后,所有接入到spring cloud config的客戶端馬上能收到通知,并且拿到最新的配置信息。
下面介紹如何實(shí)現(xiàn)這個(gè)目標(biāo)。
客戶端只需要做幾個(gè)小步驟即可完成接入動(dòng)作。
【1】引入依賴
org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-config org.springframework.cloud spring-cloud-starter-bus-amqp
引入spring-boot-starter-web只是為了做實(shí)驗(yàn)而已。
【2】配置RabbitMQ和引入配置中心的url
application.properties
spring.application.name=spring-cloud-config-client1 server.port=8042 management.security.enabled=false spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
bootstrap.properties
spring.cloud.config.name=demo spring.cloud.config.profile=dev spring.cloud.config.label=master spring.cloud.config.uri=http://localhost:8040/
有三個(gè)注意點(diǎn):
1、關(guān)閉驗(yàn)證:management.security.enabled=false
2、spring cloud config相關(guān)的配置一定一定要放到bootstrap.properties里
3、使用spring.cloud.config.uri指定配置中心的地址
另外,對(duì)于客戶端來(lái)說(shuō),啟動(dòng)類是不用加上任何跟config和bus有關(guān)的注解的。
到此客戶端搞定了,我們可以使用一個(gè)controller來(lái)開(kāi)始做實(shí)驗(yàn)了。
package springcloudconfig.client; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope public class HelloController { @Value("${address}") private String address; @RequestMapping("/address") public String getAddress() { return this.address; } }
假設(shè)上面的HelloController需要用到address這個(gè)配置,只需要使用@RefreshScope和@value注解就可以了
@RefreshScope public class HelloController {}
@Value("${address}") private String address;
為了驗(yàn)證客戶端是否能拿到最新的配置信息,提供一個(gè)
@RequestMapping("/address") public String getAddress() { return this.address; }
方法。
我們修改一下demo-dev.properties文件,將值改成
address=hello update
并提交到git上。這個(gè)時(shí)候我們調(diào)用getAddress接口
http://localhost:8041/address
發(fā)現(xiàn)并沒(méi)有拿到最新的值。那是因?yàn)閜ush到git的這個(gè)動(dòng)作做完后,我們沒(méi)有通知到spring cloud bus??梢允褂胮ostman來(lái)做一個(gè)post請(qǐng)求,調(diào)用如下接口,來(lái)通知bus。
http://localhost:8040/bus/refresh
這個(gè)接口一旦調(diào)用成功,bus會(huì)利用RabbitMQ通知所有的客戶端,配置已經(jīng)更新。
特別注意:
我們是調(diào)用服務(wù)端的/bus/refresh接口,不是去調(diào)用客戶端的/bus/refresh接口。
如果每次提交,都要去調(diào)用服務(wù)端的/bus/refresh接口,那這個(gè)也太麻煩了??梢允褂脀ebhook來(lái)幫一下忙。
如果你們用的是新的gitlab,那么只需要在工程里面,點(diǎn)擊【Settings】,再點(diǎn)擊【Integrations】,就可以設(shè)置webhook了,如下圖:
url里面填入配置中心服務(wù)端的/bus/refresh接口地址,然后點(diǎn)擊【添加Webhook】就可以了。
與攜程的阿波羅對(duì)比
Spring Cloud Config的精妙之處在于它的配置存儲(chǔ)于Git,這就天然的把配置的修改、權(quán)限、版本等問(wèn)題隔離在外。通過(guò)這個(gè)設(shè)計(jì)使得Spring Cloud Config整體很簡(jiǎn)單,不過(guò)也帶來(lái)了一些不便之處。
下面嘗試做一個(gè)簡(jiǎn)單的小結(jié):
功能點(diǎn) | Apollo | Spring Cloud Config | 備注 |
---|---|---|---|
配置界面 | 一個(gè)界面管理不同環(huán)境、不同集群配置 | 無(wú),需要通過(guò)git操作 | |
配置生效時(shí)間 | 實(shí)時(shí) | 重啟生效,或手動(dòng)refresh生效 | Spring Cloud Config需要通過(guò)Git webhook,加上額外的消息隊(duì)列才能支持實(shí)時(shí)生效 |
版本管理 | 界面上直接提供發(fā)布?xì)v史和回滾按鈕 | 無(wú),需要通過(guò)git操作 | |
灰度發(fā)布 | 支持 | 不支持 | |
授權(quán)、審核、審計(jì) | 界面上直接支持,而且支持修改、發(fā)布權(quán)限分離 | 需要通過(guò)git倉(cāng)庫(kù)設(shè)置,且不支持修改、發(fā)布權(quán)限分離 | |
實(shí)例配置監(jiān)控 | 可以方便的看到當(dāng)前哪些客戶端在使用哪些配置 | 不支持 | |
配置獲取性能 | 快,通過(guò)數(shù)據(jù)庫(kù)訪問(wèn),還有緩存支持 | 較慢,需要從git clone repository,然后從文件系統(tǒng)讀取 | |
客戶端支持 | 原生支持所有Java和.Net應(yīng)用,提供API支持其它語(yǔ)言應(yīng)用,同時(shí)也支持Spring annotation獲取配置 | 支持Spring應(yīng)用,提供annotation獲取配置 | Apollo的適用范圍更廣一些 |
我個(gè)人還是推薦使用Spring Cloud Config,很輕量級(jí)、且社區(qū)活躍,遇到問(wèn)題很好找到解決方案。另外呢,我個(gè)人認(rèn)為阿波羅和Spring Cloud Config的區(qū)別就只是有木有界面而已。界面做得到的,我們通過(guò)git也可以的,只是用戶體驗(yàn)沒(méi)那么好而已。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。