当前问题:服务A调用服务B,下线服务B,由于更新本地服务列表需要时间,服务A继续使用服务列表中的B的地址,就会无法访问。
由于下线、发布的过程涉及服务状态同步,先提交状态到eureka server,其他eurekaClient从eureka server拉取此服务状态,无论如何调整服务注册、更新间隔时长,所以总会有有几十s时间服务不可用的情况。
所以可以利用service-registry特性,先把服务状态置为down,等60s其他客户端eurekaClient更新完服务列表,再把服务下线。
一、actuator暴露service-registry接口
management.endpoint.service-registry.enabled=true
management.endpoints.web.exposure.include=service-registry,health,info
二、调用接口将服务status置为down(正常是up)同步到eurekaServer,服务下线
curl -X POST 'http://localhost:8068/actuator/service-registry?status=DOWN' -H 'content-type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8'
三、sleep60s等待其他eurekaClient同步服务状态,以及处理完已经进入服务的请求
四、kill端口或者调用shutdown接口
最后服务上线
注:
查看服务状态接口:
健康检查状态
curl http://localhost:8068/actuator/health
查看所有服务状态:
curl http://eurekaIp:eurekaPort/eureka/apps/servicename
如果想取消下线状态为up
curl -X POST 'http://localhost:8068/actuator/service-registry?status=UP' -H 'content-type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8'