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

news2024/10/6 4:09:59

目录

      • 1.直接停掉客户端服务
      • 2.发送HTTP请求
        • 1)调用DELETE接口
        • 2)调用状态变更接口
      • 3.客户端主动通知注册中心下线
        • 1)代码示例
        • 2)补充
        • 3)测试

一共有三种从 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

补充:根据官方文档,服务的状态有 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/748219.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多个input相加计算结果为NaN的处理

为什么会出现NaN?&#xff08;复现一下&#xff09; NaN的出现&#xff1a;是因为input框绑定的都是同一个方法导致的。 因为我的需求&#xff1a;购买数量*优惠价(单价)-平台补贴-店铺补贴实付金额 的实时计算 原因&#xff1a;第一个input输入的时候&#xff0c;相应的其…

货币政策和汇率波动——使用Python进行量化分析

货币政策和汇率波动是国际贸易和投资中的重要问题&#xff0c;对于投资者来说具有重要的影响。本文将介绍如何使用Python进行量化分析&#xff0c;以揭示货币政策和汇率波动之间的关系。 一、货币政策与汇率波动 货币政策作为国家宏观调控的一种手段&#xff0c;对汇率波动具…

选读SQL经典实例笔记06_日期处理(上)

1. 计算一年有多少天 1.1. 方案 1.1.1. 找到当前年份的第一天 1.1.2. 加上1年以得到下一年的第一天 1.1.3. 得到的结果减去第一步得到的结果 1.2. DB2 1.2.1. sql select days((curr_year 1 year)) - days(curr_year)from (select (current_date -dayofyear(current_d…

数字电路设计——流水线处理器

数字电路设计——流水线处理器 从内存或是寄存器组读写、操作ALU是处理器中最耗时的操作。我们将一个指令拆成五个流水线阶段&#xff0c;每个阶段同时执行耗时的组合逻辑。这五个阶段分别是取指令、解码、执行、访存和写回。 在取指令阶段&#xff0c;处理器从指令存储器中读…

python -m 是什么命令

python -m 命令是什么意思 首先python --help 可以看到-m的含义&#xff1a;意思是将库中的python模块用作脚本去运行。 python --help 命令显示结果 python -m xxx.py 和python xxx.py 有什么区别 这是两种加载py文件的方式: 叫做直接运行&#xff08;python xxx.py&#xf…

Android 音频可视化:频谱特效的探索与实践

音频可视化&#xff0c;一言以蔽之&#xff0c;就是声音到图像的转换。 随着视觉工业时代的到来&#xff0c;用户逐渐重视产品的极致体验&#xff0c;在市场上诸多优秀的音乐类APP中&#xff0c;频谱动效 是一个经典的应用场景&#xff1a; 图片来源&#xff1a;咪咕音乐 本文…

【C++】C++的IO流

目录 一、C语言的输入与输出 二、流的概念 三、CIO流 1、C标准IO流 2、C文件IO流 四、stringstream的简单介绍 一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量…

项目管理:如何减少项目中的信息差

在项目管理中&#xff0c;信息差的存在是难以避免的。 一方面&#xff0c;由于项目干系人各自的角色不同&#xff0c;项目经理不可能让每个人都知道所有的事情&#xff0c;以免在信息的海洋中产生更多的干扰。 另一方面&#xff0c;项目干系人需要了解项目的情况&#xff0c…

华为OD机试真题 Java 实现【数字序列比大小】【2023 B卷 100分】,田忌赛马,永远比你大,你服不服?

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 大家好&#xff0c;我是哪吒。 做技术&#xff0c;我是认真的&#xff0c;立志于打造最权威的华为OD机试真题专栏&#xff0c;帮助那些与我有同样需求的人&#xff…

ES6——Promise

promise 含义&#xff1a;异步编程解决方案 特点&#xff1a;1、状态不受外界影响&#xff0c;状态有三种&#xff1a;pending、fulfilled、rejected 2、状态不可逆&#xff0c;只能pending -> fulfilled、pending -> rejected 缺点&#xff1a;无法取消、不设置回调函…

常见的人体静电消除器的工作原理

人体静电消除器是一种用于消除人体带有静电的装置。静电是指物体表面具有电荷的现象&#xff0c;当人体带有静电时&#xff0c;会导致一些不舒适的感觉&#xff0c;同时也容易引起电击事故。 人体静电消除器的工作原理主要通过以下几个方面来实现&#xff1a; 1.接地&#xf…

深入篇【Linux】学习必备:认识冯诺依曼系统+理解操作系统(‘‘管理‘‘)

深入篇【Linux】学习必备&#xff1a;认识冯诺依曼系统理解操作系统(管理&#xff09; Ⅰ.冯诺依曼系统结构1.特点(what)2.理解(why)3.案例(how) Ⅱ.操作系统概念与定位1.概念(what)2.设计OS目的(why)3.管理(how) Ⅰ.冯诺依曼系统结构 1.特点(what) 我们认识的计算机&#xff…

ETHERCAT转ETHERCAT网关三菱plc支持ethercat吗

大家好&#xff0c;今天要和大家分享一款神器——远创智控YC-ECAT-ECAT通讯网关&#xff01;这款网关有什么厉害的呢&#xff1f;且听我慢慢道来。 首先&#xff0c;YC-ECAT-ECAT是一款自主研发的ETHERCAT从站功能的通讯网关。那什么是ETHERCAT呢&#xff1f;简单来说&#xff…

揭秘ChatGPT的流式返回

107. 揭秘ChatGPT的流式返回 ChatGPT是一种强大的语言模型&#xff0c;可以生成自然语言响应。在传统的请求/响应模型中&#xff0c;客户端发送请求&#xff0c;服务器处理请求后返回响应。但是&#xff0c;使用流式返回可以实现持续的数据流&#xff0c;使得客户端能够实时接…

水文水动力模型在城市内涝、城市排水、海绵城市规划设计中深度应用

随着计算机的广泛应用和各类模型软件的发展&#xff0c;将排水系统模型作为城市洪灾评价与防治的技术手段已经成为防洪防灾的重要技术途径。将聚焦于综合利用GIS及CAD等工具高效地进行大规模城市排水系统水力模型的建立&#xff0c;利用SWMM实现排水系统水力模拟。讲解SWMM深度…

rabbitmq使用springboot实现fanout模式

一、fanout模式 类型&#xff1a;fanout特点&#xff1a;Fanout—发布与订阅模式&#xff0c;是一种广播机制&#xff0c;它是没有路由key的模式。 二、实现 1、引入相应的pom文件 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project x…

左神算法 重要技巧:递归的加速技巧(斐波那契数列套路)以及推广

目录 【案例1】【十分重要 &#xff1a; 斐波那契递归套路&#xff0c;只要像斐波那契这种严格递归都可以进行类似的优化】 【有严格的递归项后&#xff0c;通过线性代数的知识进行优化】 【代码实现】 【技巧推广】 【实例1 使用这个技巧】 【题目描述】 【思路解析】 …

求两个数的最大值max

函数实现 int max(int a, int b); 函数接收两个整数参数&#xff0c;在内部用if语句判断哪个大&#xff0c;返回大的即可。 完整代码 #include <iostream> using namespace std;int max(int a, int b) {if (a > b){return a;}else{return b;} }int main() {int n1…

开发工具篇第25讲:阿里云MFA绑定Chrome浏览器Authenticator插件

开发工具篇第25讲&#xff1a;阿里云MFA绑定Chrome浏览器Authenticator插件 本文是开发工具篇第25讲&#xff0c;登录阿里云旗下产品时&#xff0c;需要使用mfa登录&#xff0c;每次如果要用手机看mfa码很麻烦&#xff0c; Chrome浏览器提供了一个快捷的登录方法&#xff0c;可…

软件工程师,学习下JavaScript ES6新特性吧

概述 作为一名软件工程师&#xff0c;不管你是不是前端开发的岗位&#xff0c;工作中或多或少都会用到一点JavaScript。JavaScript是大家所了解的语言名称&#xff0c;但是这个语言名称是Oracle公司注册的商标。JavaScript的正式名称是ECMAScript。1996年11月&#xff0c;JavaS…