当前问题:服务A调用服务B,下线服务B,由于更新本地服务列表需要时间,服务A继续使用服务列表中的B的地址,就会无法访问。

由于下线、发布的过程涉及服务状态同步,先提交状态到eureka server,其他eurekaClient从eureka server拉取此服务状态,无论如何调整服务注册、更新间隔时长,所以总会有有几十s时间服务不可用的情况。

所以可以利用service-registry特性,先把服务状态置为down,等60s其他客户端eurekaClient更新完服务列表,再把服务下线。
image.png

一、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'