目录
一共有三种从 Eureka 注册中心剔除服务的方式:
1.直接停掉客户端服务
执行如下命令,
pid
表示客户端服务进程ID。
kill-9 pid
默认情况下,如果
Eureka Server
在
90s
内没有收到 Eureka 客户端的续约,它会将实例从其注册表中删除。
这种做法的缺点在于,如果客户端已经停止了运行,但仍然在注册中心的列表中,那么当请求到已经停止运行的客户端时,就会发生错误。
2.发送HTTP请求
1)调用DELETE接口
为了让注册中心马上知道服务要下线,可以向 Eureka 注册中心发送
DELETE
请求,格式为:
- 配置了用户名密码:
curl-s-X DELETE http://{username}:{password}@{eureka-ip}:{port}/eureka/apps/{application}/{instanceId}
- 没有配置用户名密码:
curl-s-X DELETE http://{eureka-ip}:{port}/eureka/apps/{application}/{instanceId}
注意:
{instanceId}
是和客户端服务的
eureka.instance.instance-id
配置对应的,格式可能有所不同,取
UP (1) -
后面的内容就好。
{application}
大小写都可以。
举个例子:
我有一个 Eureka 注册中心和一个客户端服务(springboot-eureka-client):
- Eureka注册中心:http://localhost:1001
- 客户端服务(
springboot-eureka-client
):http://192.168.1.209:8081
如果我需要下线
springboot-eureka-client
服务,那么我可以请求如下地址:
curl-s-X DELETE "http://localhost:1001/eureka/apps/SPRINGBOOT-EUREKA-CLIENT/192.168.1.209:8081"
立即刷新页面,可以看到刚才注册的服务已经消失了。
由于 Eureka 客户端每隔一段时间(默认
30s
)会发送一次心跳到注册中心续约。如果通过这种方式下线了一个服务,而没有及时停掉的话,该服务很快又会回到服务列表中。
2)调用状态变更接口
为了让注册中心马上知道服务要下线,可以向 Eureka 注册中心发送
PUT
请求,传递想要变更的参数。当参数值为
OUT_OF_SERVICE
的时候,服务就不会再使用这个节点了。请求格式为:
- 配置了用户名密码:
curl-s-X PUT http://{username}:{password}@{eureka-ip}:{port}/eureka/apps/{application}/{instanceId}/status?value=OUT_OF_SERVICE
- 没有配置用户名密码:
curl-s-X PUT http://{eureka-ip}:{port}/eureka/apps/{application}/{instanceId}/status?value=OUT_OF_SERVICE
相应的,如果想上线也可以用这个接口,将
value
值改为
UP
即可。
- 配置了用户名密码:
curl-s-X PUT http://{username}:{password}@{eureka-ip}:{port}/eureka/apps/{application}/{instanceId}/status?value=OUT_OF_SERVICE
- 没有配置用户名密码:
curl-s-X PUT http://{eureka-ip}:{port}/eureka/apps/{application}/{instanceId}/status?value=OUT_OF_SERVICE
补充:根据官方文档,服务的状态有
UP
、
DOWN
、
STARTING
、
OUT_OF_SERVICE
、
UNKNOWN
共五种状态,其他状态所代表的具体含义可以自行了解下。
官方文档: https://github.com/Netflix/eureka/wiki/Eureka-REST-operations
举个例子:
我有一个 Eureka 注册中心和一个客户端服务(springboot-eureka-client):
- Eureka注册中心:http://localhost:1001
- 客户端服务(
springboot-eureka-client
):http://192.168.1.209:8081
如果我需要下线
springboot-eureka-client
服务,那么我可以请求如下地址:
curl-s-X PUT "http://localhost:1001/eureka/apps/SPRINGBOOT-EUREKA-CLIENT/192.168.1.209:8081/status?value=OUT_OF_SERVICE"
请求之后,我们可以看到服务节点被标上了红色的
OUT_OF_SERVICE
:
3.客户端主动通知注册中心下线
1)代码示例
如果 Eureka 客户端是一个 Spring Boot 应用,可以通过调用一下代码通知注册中心下线。代码示例如下:
importcom.demo.common.Result;importcom.netflix.discovery.DiscoveryManager;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.cloud.client.ServiceInstance;importorg.springframework.cloud.client.discovery.DiscoveryClient;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjava.util.List;/**
* <p> @Title RegisterController
* <p> @Description 注册客户端Controller
*
* @author ACGkaka
* @date 2023/7/12 22:16
*/@RestController@RequestMapping("/register")publicclassRegisterController{@AutowiredprivateDiscoveryClient discoveryClient;/** 获取服务实例信息 */@GetMapping("/getInstance")publicResult<Object>getInstance(){List<ServiceInstance> instances = discoveryClient.getInstances("springboot-eureka-client");returnResult.succeed().setData(instances);}/** 获取服务列表 */@GetMapping("/getServices")publicResult<Object>getServices(){List<String> services = discoveryClient.getServices();returnResult.succeed().setData(services);}/** 服务下线 */@GetMapping("/offline")publicResult<Object>offline(){DiscoveryManager.getInstance().shutdownComponent();returnResult.succeed();}}
2)补充
补充:如果提示
Could not autowire. No beans of 'DiscoveryClient' type found.
,如下图所示:
如果确保
Eureka Client
依赖已经正常导入,那么有可能是导入了错误的包:
3)测试
测试一: 获取服务实例信息,请求地址:http://localhost:8081/register/getInstance
测试二: 获取服务列表,请求地址:http://localhost:8081/register/getServices
测试三: 服务下线,请求地址:http://localhost:8081/register/offline
刷新 Eureka 页面,可以看到服务已经下线了。
整理完毕,完结撒花~ 🌻
参考地址:
1.细说Springcloudeureka的几种主动下线服务的方式,https://www.php1.cn/detail/XiShuo_Springclo_5a001b83.html
2.springCloud 之 Eureka 注册中心平滑下线客户端服务使用及原理,https://css.dandelioncloud.cn/article/details/1588695110810587137
3.eureka服务如何下线及启动,https://www.cnblogs.com/chenlifan/p/16191291.html
版权归原作者 ACGkaka_ 所有, 如有侵权,请联系我们删除。