「碼唄學院」史上最實用的SpringCloud九大組件第一招—注冊中心
接入說明
目前采用最新的1.xRelease版本:1.5.15.RELEASE
SpringCloud項目可以在start.spring.io下載各聘,不過更方便的應該是通過idea新建項目竞思,建立Spring Initializr項目
我一般習慣將具體實現(xiàn)服務用具體的服務名无宿,而公共組件用service-xxx來命名限嫌,當然還有一些比較固定名字的公共組件
Config
1. 新建項目
新建artifactId為service-config的服務
2. 導入依賴
依賴說明
actuator用于暴露監(jiān)控的接口
config-server是Config服務器的依賴
eureka是Eureka客戶端,這里配置中心依賴于注冊中心
3. 編寫啟動類
打開ServiceConfigApplication,在class上加入@EnableConfigServer注解并且加上@EnableEurekaClient,注冊到注冊中心
4. 修改配置
建立git倉庫
可以是本地倉庫,也可以是遠程倉庫册舞,我們用本地倉庫來模擬
找到一個目錄E:/config
git init 初始化倉庫
新建文件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
配置中心默認端口8888
config.server.git.uri設置為git的本地地址
注意spring.cloud.config.server.git.uri必須配置在應用本地,否則不知道遠程配置的地址障般,而其他服務的配置都可以放到配置中心调鲸,這個是特別的discovery.enabled與discovery.service-id其實是客戶端的配置,配置中心自己是服務端也是客戶端挽荡,作為客戶端與其他服務一樣藐石,都需要通過配置中心去發(fā)現(xiàn)配置服務啟動,讀取公共配置discovery.enabled設置為通過注冊中心暴露服務discovery.service-id是配置中心對在注冊中心外暴露的id一致定拟,與server端配置的spring.application.name一致
defaultZone注冊中心地址
management.security.enabled用于關閉一些校驗權(quán)限
抽出公共配置–其他微服務共享
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. 啟動main
6. 驗證
訪問 localhost:8761/ 看到service-config已經(jīng)注冊了一臺
訪問 localhost:8888/service-config/default 就可以訪問到配置中心加載的配置了,中間改其他服務名青自,default是指配置的profile
Config集群
1. 修改配置文件
配置2個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
除了端口號不一樣延窜,其他都一樣恋腕,本質(zhì)上配置中心只要保證讀取的git地址一樣就可以了,客戶端只是過來拉配置逆瑞,git相當于數(shù)據(jù)庫
2. 啟動
啟動server1啟動server2
3. 驗證
訪問 localhost:8761/ 看到service-config已經(jīng)注冊了2臺訪問 localhost:8888/service-config/default 就可以訪問到配置中心加載的配置了訪問 localhost:8889/service-config/default 就可以訪問到配置中心加載的配置了
客戶端使用
1. 添加依賴
客戶端要通過注冊中心查找注冊中心服務荠藤,所以需要依賴注冊中心
2. 開啟注解
開啟注冊中心的配置即可@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是依賴配置中心啟動的核心配置获高,指定配置中心暴露的名稱
4. 編寫代碼
@RefreshScope
@RestController
classMessageController{
privatefinalString msg;
@Autowired
publicMessageController(@Value("${message}")String msg){
this.msg=msg;
? ? }
@RequestMapping("/msg")
publicStringread(){
returnmsg;
? ? }
}
@RefreshScope 注意這里如果想通過/refresh接口能實時刷新配置的話哈肖,需要加這個注解,沒有加的只是啟動時加載的數(shù)據(jù)不會更新注意這里進來保持好的使用習慣念秧,使用final來保存數(shù)據(jù)
疑問
1. 為什么一定通過注冊中心暴露配置中心服務淤井?
如果不通過注冊中心,客戶端的配置如下:
spring.cloud.config.uri=localhost:8888
如果修改修改了域名或者端口出爹,增加減少機器都需要去修改此啟動配置庄吼,則通過注冊中心就可以用其各種好處缎除,減少依賴
2. 配置中心為什么依賴注冊中心严就?怎么我看有的是注冊中心依賴配置中心图甜?
其實目前2種配置都有
注冊中心依賴配置中心的解釋:就是注冊中心也是一個服務次员,啟動所需要的配置從配置中心拉取负芋,同時可以動態(tài)變更救赐,啟動順序:先配置中心吱晒,再注冊中心,配置中心不能依賴注冊中心灭贷,否則無法啟動削茁。配置中心依賴注冊中心的解釋:配置中心如果注冊為集群模式那必然讓客戶端通過服務發(fā)現(xiàn)找到從注冊中心找到配置中心,所以配置中心一定要注冊到注冊中心啟動服務發(fā)現(xiàn)粟害。啟動順序:注冊中心蕴忆,再配置中心,這樣注冊中心的配置是不經(jīng)過配置中心的悲幅,而注冊中心的配置一般也是固定不變的針對第一種還有一種解:先啟動配置中心套鹅,開啟注冊失敗仍然可以啟動的配置,只是第一次注冊失敗依然可以啟動汰具,然后再啟動注冊中心卓鹿,可以兩全總體來說第二種更加合理一點,因為一般注冊中心的defaultZone與其他應用不一樣留荔,注冊中心的要排除掉自己的地址吟孙,而其他服務是全量,這樣我在做公共配置時比較統(tǒng)一聚蝶,不用開啟注冊中心的本地配置優(yōu)先不過其他解決方案中注冊中心與配置中心一般都是一體的杰妓,所以也就沒有這種相互依賴的尷尬,不過領域上確實是2個東西
3. 為什么配置中心讀取的配置變量聲明為final的碘勉,但是調(diào)用/refresh后帶@RefreshScope的對象里的final值還會發(fā)生變化稚失?
首先final是不會變的,所以spring是把整個@RefreshScope標注的bean重新創(chuàng)建了一遍final的好處是
控制只有配置中心才可以更改變量恰聘,在程序中是無法賦值替換的配置中心的數(shù)據(jù)都是很少去變化的句各,應該當做常量處理,final虛擬機有優(yōu)化可以保證線程安全晴叨,無狀態(tài)類與不可變類多線程安全
其他注冊中心
因為consul與zookeeper本身具備配置存儲的能力凿宾,所以這2個注冊中心的配置中心一般用他們定制的,而非用SpringCloudConfig
快速接入
暫略…