「碼唄學(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
快速接入
暫略…