[轉]Eureka高可用集羣服務端和客戶端配置

        微服務應用中,生產環境一般都需要保障服務註冊中心的高可用!高可用也分好幾個等級,例如:同數據中心(可用Zone區)高可用——》同地域(Region)跨數據中心(可用Zone區)高可用——》全國跨地域(Region)跨數據中心(可用Zone區)高可用——全球跨地域(Region)跨數據中心(可用Zone區)高可用,常規應用基本上中間兩種就能滿足了!當然也會有國際型應用要進行全球部署。不同部署要求,如果是自己搭建部署環境,那麼服務器的選購就要做好規劃。下面的截圖是阿里雲ECS的選購界面,切它出來不是爲了打廣告,是借用它的數據中心分佈來說明本文的主角Eureka的高可用集羣部署(我們這裏演示Eureka的 同地域(Region)跨數據中心(可用Zone區)高可用 部署;全國版也是類似的,只是將全國範圍看成一個region,再在華北、華東、華南等各選一個zone,然後每個zone內部再做多一層 同數據中心(可用Zone區)高可用 部署即可,全國版需要考慮成本和遠距離服務註冊列表數據同步延遲的問題!),截圖可以放大來看

  從阿里雲的服務器選購界面我們可以看到:有點實力的服務器供應商一般都會從全球範圍內建設數據中心(機房)。但打包這些服務器供用戶選擇購買時,使用兩級標籤就能唯一確定服務器的位置——地域(region)和可用區(zone),這個分配標準是與國際接軌的!

  我們在Spring官網Eureka主題下高可用一節也看到了region和zone的概念,另外,在Eureka的Github倉庫Eureka架構圖上也看到區(zone)的概念,爲了防止連接失效,我把相關內容截圖過來了:

  Eureka的高可用部署架構圖官方已經給出來了,而且跟阿里雲上可用區(zone)的劃分是一樣的,那麼該怎麼來配置和使用呢?接下來我們就來實操一下!

  首先用IDEA創建好Eureka工程,我這裏採用Maven多模塊(module)的結構,將Eureka Server和Eureka Client端放在一個主工程下了:

  這裏要用到IDEA多實例運行的功能來模擬多區(zone)部署的情況(用端口的不同來模擬分區),該功能默認是關閉的,按下面截圖方法打開它:

  然後我們在相應應用的主配置文件application.yml裏修改 spring:profiles:active: <目標配置> 並啓動應用就可以了,每個目標配置裏的端口不一樣,用於模擬多機器的情況(真實環境是端口一樣,IP不一樣),先看一下效果截圖,然後我會在後面貼出所有配置文件,配置文件裏會有詳細的說明,就不在正文說怎麼配置了:

 

  以下是重點內容,Eureka Server端的配置文件

複製代碼
#Eureka Server的application.yml內容
spring:
  application:
    name: EurekaServer
  profiles:
  #多實例啓動就改下這裏(分別切換爲eureka1、eureka2、eureka3)
    active: eureka1
複製代碼
複製代碼
#Eureka Server的application-eureka1.yml內容
server:
  port: 8761
#Eureka專用配置Begin
eureka:
  instance:
    metadata-map:
      #聲明自己所屬的區
      zone: zoneA
    #自己是zoneA區的Eureka Server節點(取個容易識別的hostname)
    hostname: eureka1.zonea.cn-shenzhen
    #自己的IP,多塊網卡時最好指定,多網卡自動綁定很容易出錯(例如裝了VMWare虛擬機的情況)
    ip-address: 127.0.0.1
    #優先使用IP
    prefer-ip-address: true
  client:
    #聲明自己所屬的地區Region
    region: cn-shenzhen
    #列明可用的區Zone(注意順序,優先將自己的區排前面)
    availability-zones:
      cn-shenzhen: zoneA,zoneB,zoneC
    service-url:
      #設置可用區Zone地址
      zoneA: http://eureka1.zonea.cn-shenzhen:8761/eureka/
      zoneB: http://eureka1.zoneb.cn-shenzhen:8762/eureka/
      zoneC: http://eureka1.zonec.cn-shenzhen:8763/eureka/
    #顯示設置優先考慮請求同區Zone註冊中心
    prefer-same-zone-eureka: true
    #自己作爲服務端的客戶端不需要像普通客戶端一樣去fetch服務列表,也不需要向任何服務端註冊自己
    fetch-registry: false
    register-with-eureka: false
複製代碼
複製代碼
#Eureka Server的application-eureka2.yml內容
server:
  port: 8762
#Eureka專用配置Begin
eureka:
  instance:
    metadata-map:
      #聲明自己所屬的區
      zone: zoneB
    #自己是zoneB區的Eureka Server節點(取個容易識別的hostname)
    hostname: eureka1.zoneb.cn-shenzhen
    #自己的IP,多塊網卡時最好指定,多網卡自動綁定很容易出錯(例如裝了VMWare虛擬機的情況)
    ip-address: 127.0.0.1
    #優先使用IP
    prefer-ip-address: true
  client:
    #聲明自己所屬的地區Region
    region: cn-shenzhen
    #列明可用的區Zone(注意順序,優先將自己的區排前面)
    availability-zones:
      cn-shenzhen: zoneB,zoneA,zoneC
    service-url:
      #設置可用區Zone地址
      zoneA: http://eureka1.zonea.cn-shenzhen:8761/eureka/
      zoneB: http://eureka1.zoneb.cn-shenzhen:8762/eureka/
      zoneC: http://eureka1.zonec.cn-shenzhen:8763/eureka/
    #顯示設置優先考慮請求同區Zone註冊中心
    prefer-same-zone-eureka: true
    #自己作爲服務端的客戶端不需要像普通客戶端一樣去fetch服務列表,也不需要向任何服務端註冊自己
    fetch-registry: false
    register-with-eureka: false
複製代碼
複製代碼
#Eureka Server的application-eureka3.yml內容
server:
  port: 8763
#Eureka專用配置Begin
eureka:
  instance:
    metadata-map:
      #聲明自己所屬的區
      zone: zoneC
    #自己是zoneC區的Eureka Server節點(取個容易識別的hostname)
    hostname: eureka1.zonec.cn-shenzhen
    #自己的IP,多塊網卡時最好指定,多網卡自動綁定很容易出錯(例如裝了VMWare虛擬機的情況)
    ip-address: 127.0.0.1
    #優先使用IP
    prefer-ip-address: true
  client:
    #聲明自己所屬的地區Region
    region: cn-shenzhen
    #列明可用的區Zone(注意順序,優先將自己的區排前面)
    availability-zones:
      cn-shenzhen: zoneC,zoneA,zoneB
    service-url:
      #設置可用區Zone地址
      zoneA: http://eureka1.zonea.cn-shenzhen:8761/eureka/
      zoneB: http://eureka1.zoneb.cn-shenzhen:8762/eureka/
      zoneC: http://eureka1.zonec.cn-shenzhen:8763/eureka/
    #顯示設置優先考慮請求同區Zone註冊中心
    prefer-same-zone-eureka: true
    #自己作爲服務端的客戶端不需要像普通客戶端一樣去fetch服務列表,也不需要向任何服務端註冊自己
    fetch-registry: false
    register-with-eureka: false  
複製代碼

  以下是重點內容,Eureka Client端的配置文件

複製代碼
#Eureka Client的application.yml內容
spring:
  application:
    name: EurekaClient
  profiles:
    #多實例啓動就改下這裏(分別切換爲clientA、client2、client3)
    active: clientA
  main:
    banner-mode: console

#配置SpringBoot Actuator,開啓服務信息和健康彙報接口(方便從Eureka Server界面直接點進相應服務查看服務信息)
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always
    shutdown:
      enabled: true
複製代碼
複製代碼
#Eureka Client的application-clientA.yml內容
server:
  port: 8081

#Eureka專用配置Begin
eureka:
  instance:
    metadata-map:
      #聲明自己所屬的區Zone
      zone: zoneA
  client:
    #聲明自己所屬的地區Region
    region: cn-shenzhen
    #列明可用的區Zone(注意順序)
    availability-zones:
      cn-shenzhen: zoneA,zoneB,zoneC
    service-url:
      #設置可用區Zone地址
      zoneA: http://eureka1.zonea.cn-shenzhen:8761/eureka/
      zoneB: http://eureka1.zoneb.cn-shenzhen:8762/eureka/
      zoneC: http://eureka1.zonec.cn-shenzhen:8763/eureka/
    #顯示設置優先考慮請求同區Zone註冊中心
    prefer-same-zone-eureka: true
複製代碼
複製代碼
#Eureka Client的application-clientB.yml內容
server:
  port: 8082

#Eureka專用配置Begin
eureka:
  instance:
    metadata-map:
      #聲明自己所屬的區Zone
      zone: zoneB
  client:
    #聲明自己所屬的地區Region
    region: cn-shenzhen
    #列明可用的區Zone(注意順序)
    availability-zones:
      cn-shenzhen: zoneB,zoneA,zoneC
    service-url:
      #設置可用區Zone地址
      zoneA: http://eureka1.zonea.cn-shenzhen:8761/eureka/
      zoneB: http://eureka1.zoneb.cn-shenzhen:8762/eureka/
      zoneC: http://eureka1.zonec.cn-shenzhen:8763/eureka/
    #顯示設置優先考慮請求同區Zone註冊中心
    prefer-same-zone-eureka: true
複製代碼
複製代碼
#Eureka Client的application-clientC.yml內容
server:
  port: 8083

#Eureka專用配置Begin
eureka:
  instance:
    metadata-map:
      #聲明自己所屬的區Zone
      zone: zoneC
  client:
    #聲明自己所屬的地區Region
    region: cn-shenzhen
    #列明可用的區Zone(注意順序)
    availability-zones:
      cn-shenzhen: zoneC,zoneA,zoneB
    service-url:
      #設置可用區Zone地址
      zoneA: http://eureka1.zonea.cn-shenzhen:8761/eureka/
      zoneB: http://eureka1.zoneb.cn-shenzhen:8762/eureka/
      zoneC: http://eureka1.zonec.cn-shenzhen:8763/eureka/
    #顯示設置優先考慮請求同區Zone註冊中心
    prefer-same-zone-eureka: true
複製代碼

客戶端配置 availability-zones 時一定要注意順序,要優先將自己所屬的區(zone)排在前面,這樣Eureka Client在發起續約(Renew)請求時,從所有可用區(zone)裏第一個拿到的就是自己所在區(zone)的目標Eureka Server,否則就變成在其他服務器上續約,會導至自己區(zone)裏的Eureka Server的Renews (last min)值永遠達不到要求而報出以下錯誤(這個錯誤是由於前來本Eureka Server續約的服務低於指定的自我保證閾值(默認85%)了,觸發了Eureka自我保護機制,Eureka Server不再剔除服務註冊表裏的條目):

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

  附上幾張我自己畫的Eureka Server常用部署架構圖:

  最後一張是針對官方的改進版,自己想一下這幾張圖服務端和客戶端要怎麼配!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章