Eureka單機房和雙機房集群部署


 

本文概覽:介紹了eureka的集群搭建:單機房和雙機房

1 Eureka單機房集群搭建

相對於單點部署這里需要修改配置文件。比如存在3個機器 host1,host2,host3。配置如下:

host1的配置如下:

 

 

host2的配置

 

 

host3的配置

 

 

這里有個偷懶的地方就是,就是三台機器的eureka.client.serviceUrl.defaultZone配置都指定三台機器,可能啟動時候會報錯,但是沒影響。

 

 

當Eureka-Server由單點變為集群時,對於Eureka-Client的變更,就是在配置中增加如下配置

 

 

 Eureka雙機房集群搭建

為了保證服務穩定性,我們經常將服務划分為2個邏輯機房。通過Region和zone實現划分多機房和同機房訪問。比如服務A調用服務B,可以實現A服務優先訪問同機房的服務B,避免跨機房影響訪問時間。如下涉及到6個服務,每個機房各有三個服務:注冊中心eureka、網關gateway、客戶端服務client。

83712797

2.1 配置信息

1、server配置

(1)server-zone1

 

 

(2)server-zon2

 

 

2、clinet配置

(1)client-zone1

 

(2) client-zone2

 

3、gateway

(1)gateway-zone1

(2)gateway-zone2

 

4、運行服務之后

發現在一個機房注冊中心頁面上可以看到所有服務的實例,不僅僅是同機房的。如下:

(1) zone1的注冊中心

2

(2) zone2的注冊中心

3

2.2 測試代碼

通過網關訪問一個服務時,需要驗證下網關否可以訪問同機房的服務,而不會跨機房。

client中增加如下代碼

 

 

通過zone1的網關服務訪問provider服務,此時調用的provider服務也是zone1

11

通過zone2的網關服務訪問provider服務,此時調用的provider服務也是zone2

11

2.3 多機房總結

1一定要注意 availability-zones 的順序,當前實例所屬zone 寫在最前面

 

 

2、在使用邏輯機房時,已經配置了eureka.client.service-url.zon1、eureka.client.service-url.zone2。是否還需要eureka.client.service-url.default

(1)結論:只有在根據zone查找服務實例為空時,才會使用eureka.client.service-url.default

有這種場景會用到,我們配置了這兩個屬性

 

但是並沒有配置eureka.client.service-url.zone1和eureka.client.service-url.zone2,

只有一個defalut配置

 

(2)分析:只有在根據zone查找服務實例為空時,才會使用eureka.client.service-url.default

根據配文件加載注冊中心地址的地址信息,會根據zone生成一個map。如下:

 

 

getEurekaServerServiceUrls負責根據一個zone查找一實例地址,在如下代碼中可以看到:當根據zone查找服務實例為空時,才會使用eureka.client.service-url.default

 

 

3、啟動多個注冊中心后,節點均出現在unavailable-replicas

dd

問題原因是:因為注冊中心都在一台機器部署,分別部署到2台機器上就沒有問題了

3 Eureka集群多機房屬性

總結:

介紹了基於Eureka的微服務划分機房的兩類屬性,即 customer/注冊中心同機房調用屬性  和   customer/server同機房調用屬性。通過這兩種屬性可以實現兩種雙機房策略。

3.1 划分機房的兩類屬性

1、配置客戶端/注冊中心同機房屬性

獲取eureka地址用到的屬性。保證eureka注冊中心區分機房,實現客戶端和注冊中心同機房即保證客戶方服務可以在服務注冊、服務查詢時,獲取到同機房的eurka實例。如果不區分,一個機房網A絡有問題了,機房B通過機房A的注冊中心獲取一個server的地址時,就報錯了,所以同機房策略,可以保證客戶端訪問注冊中心在同一個機房。

  • 對於服務注冊時,可以保證客戶端服務調用到同一個zone的eureka注冊中心實例來進行注冊。
  • 對於服務查詢時,可以獲取到同一個zone的eureka注冊中心實例。

(1)availability-zones

為了保證服務注冊到同一個 zone 的注冊中心,一定要注意 availability-zones 的順序,必須把同一 zone 寫在最前面

(2) prefer-same-zone-eureka

如果 prefer-same-zone-eureka 為true,先通過 region 取 availability-zones 內的第一個zone,然后通過這個zone取 service-url 下的list,並向list內的第一個注冊中心進行注冊和維持心跳,不再向list內的其它的注冊中心注冊和維持心跳。

(3)service-url

 

 

2、customer/server同機房調用屬性

customer查詢server的路由策略的屬性。 保證customer和Server區分機房實現customer和server同機房訪問

(1)eureka.instance.metadata-map.zone

可以保證customer和server屬於同一個機房。

3.2 使用上面屬性配置雙機房策略

1、策略1只使用eureka.instance.metadata-map.zone 。使用默認的 service-url.default  屬性

eureka地址不需要再划分機房了,只需要customer查詢server的划分機房。這樣可能存在問題是,如果一個機房網A絡有問題了,可能調用A獲取server的地址時,就報錯了。

1

2、策略2  同時使用兩種屬性。使用eureka.instance.metadata-map.zone  和  service-url.zone1、eureka.client.availability-zones.xxx  屬性

2

3.3  查詢服務的划分機房流程

服務查詢流程如下,其中划分邏輯機房會發生在“Customer查詢EurekaServer”   和   “路由策略:選取一個實例”的兩個過程中。

3

無論是zuul還是feign都是通過spring cloud ribbon來實現路由策略的。spring cloud ribbon 的策略使用了eureka.instance.metadataMap.zone這個屬性,默認策略是customer獲取到同機房的server實例。

(1)微服務通過feign來訪問

4

(2)mvc老服務需要自定義路由策略

5

3.4 服務注冊的划分機房流程流程

需要根據配置文件獲取到一個注冊中心的地址,然后向注冊中心進行注冊。

7876891

參考

比較好的參考如下

Eureka 中的 region 和 Zone  : https://juejin.im/post/5d68b73af265da03b12061be

一個實例:https://blog.marcosbarbero.com/ha-and-zone-affinity-spring-cloud-eureka/

 

 

 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM