1. 程式人生 > >Spring Cloud Eureka——註冊中心叢集

Spring Cloud Eureka——註冊中心叢集

前面我們介紹了Spring Cloud Eureka的簡單使用。

但前面的例子中,這個服務註冊中心是單點的,顯然這並不適合應用於線上生產環境。服務註冊中心是服務的中心位置,如果服務註冊中心崩了,顯然是災難性的,不符合微服務架構的高可用性特點。

那麼如何搭建高可用的服務註冊中心叢集呢?

我們可以通過Eureka Server互相註冊的方式來實現高可用的部署。所以我們僅僅需要在配置檔案中配置defaultZone為其他的註冊中心即可。

服務註冊中心Eureka Server:

使用前面的示例。

建立配置檔案:application-peer1.properties

內容:

spring.application.name=eureka-server
server.port=1111
eureka.instance.hostname=peer1
eureka.client.serviceUrl.defaultZone=http://peer2:1112/eureka/
建立另外一個配置檔案:application-peer2.properties

內容:

spring.application.name=eureka-server
server.port=1112
eureka.instance.hostname=peer2
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/

顯然這裡的url中的peer1和peer2我們是無法訪問的,所以需要在hosts檔案中新增:

127.0.0.1 peer1
127.0.0.1 peer2

配置defaultZone相互註冊。注意:這裡的url需要使用對方的hostname,即http://peer1:1111/eureka/中,需要使用peer1,而不能使用localhost或者127.0.0.1,否則Eureka註冊中心會認為另外一個註冊中心是unavailable的。這裡的原因筆者認為是通過hostname來進行判斷的,並沒有深入瞭解。不過如果不這樣使用,的確會出現問題。

最後application.properties:

spring.profiles.active=peer2
通過profiles.active來分別使peer1和peer2生效。

兩個配置對應的服務註冊中心啟動之後,可以看到:


可以看到,在下面的Info中,另外一個註冊中心分片的資訊,是registered和available的。注:如果前面的defaultZone註冊的配置,不是用hostname,這裡就會變成unavailable,顯然這是不符合實際情況的,影響我們的判斷。

當其中一個服務註冊中心關閉之後,可以看到,資訊從available變成了unavailable。

服務Eureka Service:

還是使用前面的例項。

配置檔案:

spring.application.name=service-B
server.port=3333
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
注意,這裡我們只向其中一個註冊中心peer1中註冊服務,我們會看到什麼呢?


當我們訪問另外一個註冊中心peer2的時候,發現,在這個註冊中心中,也有這個服務的資訊!!

而當我們將peer1關閉了之後,我們發現,在peer2中仍然是可以訪問到這個服務的。這就實現了服務註冊中心的高可用。

不過這裡的缺點就是,如果peer1被關閉了,雖然peer2可以訪問到peer1上的服務,但是卻是不能實時監控的,因為這個畢竟不是向peer2中註冊的服務,所以當服務down之後,peer2中仍然會認為是up的。

深入:

在實際開發中,服務註冊中心旺旺不單單隻有2個節點,而是存在多個節點。但從上面的例子當中,我們可以知道:

Eureka Server的同步遵循著一個非常簡單的原則:只要有一條邊將節點連線,就可以進行資訊傳播與同步。

所以,如果存在多個節點,我們只需要將節點之間兩兩連線起來,形成通路,那麼他們之間的所有服務都可以共享。


我們的服務只需要向叢集中的任意一個註冊中心中註冊,即可被所有註冊中心所共享,任意一個註冊中心崩潰,都不會影響這個服務被呼叫。

實現了註冊中心叢集的高可用。