背景
SpringCloud分布式項目,部署在多個節點上。一般的發版方式是,使用Kill -15 pid
,逐一地關閉、部署、重啟。
但中間涉及到一個問題,當執行kill命令時,服務雖然關閉,但Eureka那里依然保存着這台服務器的IP,請求依然會跑到這台服務器上。
直到持續數十秒后,Eureka將該服務的IP剔除掉。
如果請求量大,會導致大量請求在發版的過程中出現異常。所以要想到一個更優雅的方式來部署服務。
方案一:
調用Eureka的接口,讓Eureka自動剔除該服務IP。
獲取服務的AppID和InstanceID,分別對應響應中的<app>
和instanceId
curl -X GET \
http://IP:port/eureka/apps/
從可用服務列表中剔除該服務
curl -X PUT \
'http://IP:port/eureka/apps/AppID/InstanceID/status?value=DOWN' \
將該服務加到可用服務列表中
curl -X PUT \
'http://IP:port/eureka/apps/AppID/InstanceID/status?value=UP' \
方案二 :
調用服務接口,服務向Eureka報告為不可用狀態
項目中增加配置,重點是service-registry
management.endpoints.web.exposure.include=health,info,service-registry
部署前執行命令
curl -X POST \
'http://IP:port/actuator/service-registry?status=DOWN' \
-H 'content-type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8' \
部署后執行命令
curl -X POST \
'http://IP:port/actuator/service-registry?status=UP' \
-H 'content-type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8' \
參考文檔
[1]: Eureka REST operations
[2]: SpringCloud微服務如何優雅停機及源碼分析
[3]: 實用技巧:Spring Cloud中,如何優雅下線微服務?
[4]: 服務如何做到優雅下線
[5]: Eureka優雅關閉服務
[6]: SpringCloud微服務如何優雅停機及源碼分析