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獲取服務時間。