SpringCloud(4) Eureka 如何主动下线服务节点

一共有三种从 Eureka 注册中心剔除服务的方式:

1.直接停掉客户端服务

执行如下命令,pid 表示客户端服务进程ID。

kill -9 pid

默认情况下,如果 Eureka Server90s 内没有收到 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}

注意:

1.{instanceId} 是和客户端服务的 eureka.instance.instance-id 配置对应的,格式可能有所不同,取 UP (1) - 后面的内容就好。

2.{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
  • 查询服务列表:
curl -s http://{eureka-ip}:{port}/eureka/apps

补充:根据官方文档,服务的状态有 UPDOWNSTARTINGOUT_OF_SERVICEUNKNOWN 共五种状态,其他状态所代表的具体含义可以自行了解下。

官方文档: 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 应用,可以通过调用一下代码通知注册中心下线。代码示例如下:

import com.demo.common.Result;
import com.netflix.discovery.DiscoveryManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * <p> @Title RegisterController
 * <p> @Description 注册客户端Controller
 *
 * @author ACGkaka
 * @date 2023/7/12 22:16
 */
@RestController
@RequestMapping("/register")
public class RegisterController {

    @Autowired
    private DiscoveryClient discoveryClient;

    /** 获取服务实例信息 */
    @GetMapping("/getInstance")
    public Result<Object> getInstance() {
        List<ServiceInstance> instances = discoveryClient.getInstances("springboot-eureka-client");
        return Result.succeed().setData(instances);
    }

    /** 获取服务列表 */
    @GetMapping("/getServices")
    public Result<Object> getServices() {
        List<String> services = discoveryClient.getServices();
        return Result.succeed().setData(services);
    }

    /** 服务下线 */
    @GetMapping("/offline")
    public Result<Object> offline() {
        DiscoveryManager.getInstance().shutdownComponent();
        return Result.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不愿放下技术的小赵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值