spring cloud高可用註冊中心+平滑上下線

spring cloud高可用註冊中心

機器配置

準備兩臺+機器,此處以兩臺機器做爲例子:10.10.10.100,10.10.10.101。
修改系統host,若是用docker發佈則在docker-compose.yml文件中配置host。
10.10.10.100 docker host配置:spring

extra_hosts:
 - "eurekapeer:10.10.10.101"

10.10.10.101 docker host配置:docker

extra_hosts:
 - "eurekapeer:10.10.10.100"

eureka配置

主要是將defaultZone中地址指向host中配置的機器,實現註冊中心的相互註冊已達到高可用。api

eureka:
  client:
    serviceUrl:
      defaultZone: http://eurekapeer:${server.port}/eureka/

按照以上配置啓動,打開任意一個註冊中心界面:緩存

  • 會在DS Replicas欄中看到另外一臺機器的信息,
  • 會在Instances currently registered with Eureka欄中看到兩個註冊中心的信息

client配置

主要是配置defaultZone指向兩個註冊中心便可負載均衡

eureka:
  client:
    serviceUrl:
      defaultZone: http://10.10.10.100:8181/eureka/,http://10.10.10.101:8181/eureka/

spring cloud平滑上下線

關注點

  • eureka快速剔除已下線服務
  • zuul網關快速拉取服務列表
  • 服務不可達時進行重試

eureka快速剔除已下線服務

  • client端加快對eureka的心跳頻率,並縮短續期時間
  • 端加快情侶無效服務間隔

這樣一來,理論上最長剔除不可用服務時間=client心跳頻率+client續期時間+服務端剔除無效服務間隔時間。fetch

eureka服務端配置:code

eureka:
  server:
    eviction-interval-timer-in-ms: 5000 #清理無效服務間隔(單位毫秒,默認是1分鐘)

eureka客戶端配置:server

eureka:
  instance:
    lease-renewal-interval-in-seconds: 5 #eureka client發送心跳給server端的頻率(默認30秒)
    lease-expiration-duration-in-seconds: 10 #eureka client發送心跳給server端後,續約到期時間(默認90秒)

zuul網關快速拉取服務列表

zuul網關會去eureka拉取服務列表並進行緩存,咱們儘可能縮短拉取時間:接口

eureka:
  client:
    registry-fetch-interval-seconds: 3 #client間隔多久去拉取服務註冊信息(默認30秒)對於api-gateway若是要迅速獲取服務註冊狀態,能夠縮小該值

當一個服務下線後,eureka並不會當即剔除,在此期間若是zuul使用緩存服務,或者獲取到了已下線服務,此時對請求進行轉發時會致使服務不可達返回500錯誤,這種狀況線下能夠配置zuul重試,注意此處的重試不是配置zuul對異常接口的重試;zuul配置以下:部署

#服務下線後,zuul重試
ribbon:
  OkToRetryOnAllOperations: true #是否全部操做都重試,若false則僅get請求重試
  MaxAutoRetriesNextServer: 1 #重試負載均衡其餘實例最大重試次數,不含首次實例
  MaxAutoRetries: 0   #(同一實例最大重試次數,不含首次調用)
  retryableStatusCodes: 404,500,503

zuul對異常接口的重試:
spring cloud中默認的熔斷時間是1000ms,若是單個服務接口響應時間超過此配置時長,此時若是須要zuul進行重試,則如此配置:

zuul:
  retryable: true

這種狀況下須要考慮接口的冪等性。

##關於發佈 集羣發佈時最好單個服務單臺進行部署,理論上單個服務之間部署時間間隔最少須要大於:client心跳+client續期+eureka剔除+zuul獲取服務時間。

相關文章
相關標籤/搜索