「碼唄學(xué)院」史上最實(shí)用的SpringCloud九大組件第二招— 配置中心

「碼唄學(xué)院」史上最實(shí)用的SpringCloud九大組件第一招—注冊(cè)中心


接入說明

目前采用最新的1.xRelease版本:1.5.15.RELEASE

SpringCloud項(xiàng)目可以在start.spring.io下載,不過更方便的應(yīng)該是通過idea新建項(xiàng)目,建立Spring Initializr項(xiàng)目

我一般習(xí)慣將具體實(shí)現(xiàn)服務(wù)用具體的服務(wù)名,而公共組件用service-xxx來命名,當(dāng)然還有一些比較固定名字的公共組件

Config

1. 新建項(xiàng)目

新建artifactId為service-config的服務(wù)

2. 導(dǎo)入依賴

依賴說明

actuator用于暴露監(jiān)控的接口

config-server是Config服務(wù)器的依賴

eureka是Eureka客戶端,這里配置中心依賴于注冊(cè)中心


3. 編寫啟動(dòng)類

打開ServiceConfigApplication,在class上加入@EnableConfigServer注解并且加上@EnableEurekaClient,注冊(cè)到注冊(cè)中心

4. 修改配置

建立git倉(cāng)庫(kù)

可以是本地倉(cāng)庫(kù),也可以是遠(yuǎn)程倉(cāng)庫(kù),我們用本地倉(cāng)庫(kù)來模擬

找到一個(gè)目錄E:/config

git init 初始化倉(cāng)庫(kù)

新建文件application.properties

git add .

git commit -m ‘init’

git push origin master

server.port=8888

spring.application.name=service-config

spring.cloud.config.server.git.uri=E:/config

# public

spring.cloud.config.discovery.enabled=true

spring.cloud.config.discovery.service-id=service-config

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka

management.security.enabled=false

配置中心默認(rèn)端口8888

config.server.git.uri設(shè)置為git的本地地址

注意spring.cloud.config.server.git.uri必須配置在應(yīng)用本地,否則不知道遠(yuǎn)程配置的地址,而其他服務(wù)的配置都可以放到配置中心,這個(gè)是特別的discovery.enabled與discovery.service-id其實(shí)是客戶端的配置,配置中心自己是服務(wù)端也是客戶端,作為客戶端與其他服務(wù)一樣,都需要通過配置中心去發(fā)現(xiàn)配置服務(wù)啟動(dòng),讀取公共配置discovery.enabled設(shè)置為通過注冊(cè)中心暴露服務(wù)discovery.service-id是配置中心對(duì)在注冊(cè)中心外暴露的id一致,與server端配置的spring.application.name一致

defaultZone注冊(cè)中心地址

management.security.enabled用于關(guān)閉一些校驗(yàn)權(quán)限

抽出公共配置–其他微服務(wù)共享

application.properties文件添加以下配置,并去掉service-config配置中的配置

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka

management.security.enabled=false

spring.cloud.config.discovery.enabled=true

spring.cloud.config.discovery.service-id=service-config

5. 啟動(dòng)main

6. 驗(yàn)證

訪問 localhost:8761/ 看到service-config已經(jīng)注冊(cè)了一臺(tái)

訪問 localhost:8888/service-config/default 就可以訪問到配置中心加載的配置了,中間改其他服務(wù)名,default是指配置的profile

Config集群

1. 修改配置文件

配置2個(gè)server,server1使用端口8888,server2使用端口8889

server1

server.port=8888

spring.application.name=service-config

spring.cloud.config.server.git.uri=E:/IdeaProjects/springcloud-test/config

# public

spring.cloud.config.discovery.enabled=true

spring.cloud.config.discovery.service-id=service-config

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka

management.security.enabled=false

server2

server.port=8889

spring.application.name=service-config

spring.cloud.config.server.git.uri=E:/IdeaProjects/springcloud-test/config

# public

spring.cloud.config.discovery.enabled=true

spring.cloud.config.discovery.service-id=service-config

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka

management.security.enabled=false

除了端口號(hào)不一樣,其他都一樣,本質(zhì)上配置中心只要保證讀取的git地址一樣就可以了,客戶端只是過來拉配置,git相當(dāng)于數(shù)據(jù)庫(kù)

2. 啟動(dòng)

啟動(dòng)server1啟動(dòng)server2

3. 驗(yàn)證

訪問 localhost:8761/ 看到service-config已經(jīng)注冊(cè)了2臺(tái)訪問 localhost:8888/service-config/default 就可以訪問到配置中心加載的配置了訪問 localhost:8889/service-config/default 就可以訪問到配置中心加載的配置了

客戶端使用

1. 添加依賴

客戶端要通過注冊(cè)中心查找注冊(cè)中心服務(wù),所以需要依賴注冊(cè)中心


2. 開啟注解

開啟注冊(cè)中心的配置即可@EnableDiscoveryClient,配置中心不需要額外的注解

3. 修改配置

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka

spring.cloud.config.discovery.enabled=true

spring.cloud.config.discovery.service-id=service-config

config.discovery.enabled與config.discovery.service-id是依賴配置中心啟動(dòng)的核心配置,指定配置中心暴露的名稱

4. 編寫代碼

@RefreshScope

@RestController

classMessageController{

privatefinalString msg;

@Autowired

publicMessageController(@Value("${message}")String msg){

this.msg=msg;

? ? }

@RequestMapping("/msg")

publicStringread(){

returnmsg;

? ? }


}

@RefreshScope 注意這里如果想通過/refresh接口能實(shí)時(shí)刷新配置的話,需要加這個(gè)注解,沒有加的只是啟動(dòng)時(shí)加載的數(shù)據(jù)不會(huì)更新注意這里進(jìn)來保持好的使用習(xí)慣,使用final來保存數(shù)據(jù)

疑問

1. 為什么一定通過注冊(cè)中心暴露配置中心服務(wù)?

如果不通過注冊(cè)中心,客戶端的配置如下:

spring.cloud.config.uri=localhost:8888

如果修改修改了域名或者端口,增加減少機(jī)器都需要去修改此啟動(dòng)配置,則通過注冊(cè)中心就可以用其各種好處,減少依賴

2. 配置中心為什么依賴注冊(cè)中心?怎么我看有的是注冊(cè)中心依賴配置中心?

其實(shí)目前2種配置都有

注冊(cè)中心依賴配置中心的解釋:就是注冊(cè)中心也是一個(gè)服務(wù),啟動(dòng)所需要的配置從配置中心拉取,同時(shí)可以動(dòng)態(tài)變更,啟動(dòng)順序:先配置中心,再注冊(cè)中心,配置中心不能依賴注冊(cè)中心,否則無法啟動(dòng)。配置中心依賴注冊(cè)中心的解釋:配置中心如果注冊(cè)為集群模式那必然讓客戶端通過服務(wù)發(fā)現(xiàn)找到從注冊(cè)中心找到配置中心,所以配置中心一定要注冊(cè)到注冊(cè)中心啟動(dòng)服務(wù)發(fā)現(xiàn)。啟動(dòng)順序:注冊(cè)中心,再配置中心,這樣注冊(cè)中心的配置是不經(jīng)過配置中心的,而注冊(cè)中心的配置一般也是固定不變的針對(duì)第一種還有一種解:先啟動(dòng)配置中心,開啟注冊(cè)失敗仍然可以啟動(dòng)的配置,只是第一次注冊(cè)失敗依然可以啟動(dòng),然后再啟動(dòng)注冊(cè)中心,可以兩全總體來說第二種更加合理一點(diǎn),因?yàn)橐话阕?cè)中心的defaultZone與其他應(yīng)用不一樣,注冊(cè)中心的要排除掉自己的地址,而其他服務(wù)是全量,這樣我在做公共配置時(shí)比較統(tǒng)一,不用開啟注冊(cè)中心的本地配置優(yōu)先不過其他解決方案中注冊(cè)中心與配置中心一般都是一體的,所以也就沒有這種相互依賴的尷尬,不過領(lǐng)域上確實(shí)是2個(gè)東西

3. 為什么配置中心讀取的配置變量聲明為final的,但是調(diào)用/refresh后帶@RefreshScope的對(duì)象里的final值還會(huì)發(fā)生變化?

首先f(wàn)inal是不會(huì)變的,所以spring是把整個(gè)@RefreshScope標(biāo)注的bean重新創(chuàng)建了一遍final的好處是

控制只有配置中心才可以更改變量,在程序中是無法賦值替換的配置中心的數(shù)據(jù)都是很少去變化的,應(yīng)該當(dāng)做常量處理,final虛擬機(jī)有優(yōu)化可以保證線程安全,無狀態(tài)類與不可變類多線程安全

其他注冊(cè)中心

因?yàn)閏onsul與zookeeper本身具備配置存儲(chǔ)的能力,所以這2個(gè)注冊(cè)中心的配置中心一般用他們定制的,而非用SpringCloudConfig

快速接入

暫略…

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容