在上一篇中分享了如何使用Eureka 進行服務治理,里面搭建的服務注冊中心是單體的,
但是在實際的應用中,分布式系統為了防止單體服務宕機帶來嚴重后果,一般都會采用服務器集群的形式,服務注冊中心也是一樣,需要多台服務一起工作,組成高可用的服務注冊中心。這樣,如果有其中一台宕機,系統也能正常運行。
那么如何來構建高可用的服務注冊中心呢?
由於eureka注冊中心既可以作為服務端(服務注冊中心),也可以作為客戶端(到別的注冊中心注冊自己),
我們可以通過在機器上部署peer1和peer2兩個服務,兩個服務相互注冊。
一、代碼實現
還是使用上篇文章中的eureka服務例子,在此基礎上我們進行修改:
- 新增/eureka/src/main/resources/application-peer1.properties
server.port=1111 spring.application.name=eureka-service #設定主機名為peer1 eureka.instance.hostname=peer1 #eureka.client.register-with-eureka=false #eureka.client.fetch-registry=false #設定eureka的serviceUrl為peer2 eureka.client.serviceUrl.defaultZone=http://peer2:1112/eureka
- 新增/eureka/src/main/resources/application-peer2.properties
server.port=1112 spring.application.name=eureka-service eureka.instance.hostname=peer2 #eureka.client.register-with-eureka=false #eureka.client.fetch-registry=false #設定eureka的serviceUrl為peer1 eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka
由於需要peer1和peer2相互注冊,因此第1和第2步中,eureka.client.register-with-eureka=false和eureka.client.fetch-registry=false這兩個配置就不能要了,需要注釋掉或刪掉。
- 設定host,在C:\Windows\System32\drivers\etc目錄下的hosts文件中添加
127.0.0.1 peer1 127.0.0.1 peer2
以將peer1和peer2進行解析。
- 配置兩個啟動服務
- )
- )
- )
- 啟動eureka1和eureka2
- 頁面訪問http://localhost:1111/
我們會發現,在DS Replicas(分片)中會有peer2; 在服務instance中會有2個,一個是1111,一個是1112; 在registered-replicas(注冊分片)和available-replicas(可用分片)中出現了peer2:1112。 同樣道理,我們訪問http://localhost:1112/也能看到相似效果。 如果將peer2停掉,那么在訪問http://localhost:1111/的時候就會發現peer2已經跑到unavailable-replicas(不可用分片)中,具體截圖略。
二、調試中遇到的問題
我在調試以上內容的時候遇到一個問題,就是在peer1和peer2一直不能彼此注冊成功,頁面表現就是服務instance為空並且available-replicas為空,對應的服務在unavailable-replicas中。后來經過多次實現和分析,終於發現,原來是在我的application.properties文件中還保留着下面兩個配置,服務在啟動的時候是會讀取到這個配置的,
雖然這兩個配置默認是true,但是卻被application.properties覆蓋了,這個時候講這兩個配置注釋掉就好了。
如果在application-{profiles}.properties中再配置一遍就又可以覆蓋application.properties里面的配置。
代碼讀取順序是這樣的:
先讀取默認配置-->然后讀取application.properties-->讀取application-{profiles}.properties。