[Nacos] Nacos Server处理注销请求 (七)

news2024/11/27 20:34:35

文章目录

      • 1.InstanceController.deregister()
        • 1.1 从请求中获取要操作的instance
        • 1.2 删除instance

1.InstanceController.deregister()

在这里插入图片描述

  1. 从请求中获取要操作的instance
  2. 从注册表中获取service
  3. 从获取的service中删除instance

1.1 从请求中获取要操作的instance

    private Instance getIpAddress(HttpServletRequest request) {
        // 从请求中获取各种属性
        final String ip = WebUtils.required(request, "ip");
        final String port = WebUtils.required(request, "port");
        String cluster = WebUtils.optional(request, CommonParams.CLUSTER_NAME, StringUtils.EMPTY);
        if (StringUtils.isBlank(cluster)) {
            cluster = WebUtils.optional(request, "cluster", UtilsAndCommons.DEFAULT_CLUSTER_NAME);
        }
        String enabledString = WebUtils.optional(request, "enabled", StringUtils.EMPTY);
        boolean enabled;
        if (StringUtils.isBlank(enabledString)) {
            enabled = BooleanUtils.toBoolean(WebUtils.optional(request, "enable", "true"));
        } else {
            enabled = BooleanUtils.toBoolean(enabledString);
        }

        boolean ephemeral = BooleanUtils.toBoolean(
                WebUtils.optional(request, "ephemeral", String.valueOf(switchDomain.isDefaultInstanceEphemeral())));

        String weight = WebUtils.optional(request, "weight", "1");
        boolean healthy = BooleanUtils.toBoolean(WebUtils.optional(request, "healthy", "true"));

        // 使用获取到的属性值装配一个instance
        Instance instance = new Instance();
        instance.setPort(Integer.parseInt(port));
        instance.setIp(ip);
        instance.setWeight(Double.parseDouble(weight));
        instance.setClusterName(cluster);
        instance.setHealthy(healthy);
        instance.setEnabled(enabled);
        instance.setEphemeral(ephemeral);

        return instance;
    }
  1. 从请求中获取各种属性, ip, port, cluster, ephemeral是否为临时实例, weight权重
  2. 使用获取到的属性值装配一个instance
    在这里插入图片描述

1.2 删除instance

ServiceManager#removeInstance()

    public void removeInstance(String namespaceId, String serviceName, boolean ephemeral, Instance... ips)
            throws NacosException {
        // 从注册表获取当前service
        Service service = getService(namespaceId, serviceName);

        synchronized (service) {
            // 删除
            removeInstance(namespaceId, serviceName, ephemeral, service, ips);
        }
    }

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

ServiceManager#substractIpAddresses() -> Service#updateIpAddresses(): 用于修改当前instance列表, 修改分为添加和删除操作, 之前的Nacos Server处理注册请求的时候, 有这个添加的操作分析, 而现在是删除操作。

在这里插入图片描述

    public List<Instance> updateIpAddresses(Service service, String action, boolean ephemeral, Instance... ips)
            throws NacosException {

        // 从其它nacos获取当前服务数据(临时实例数据)
        Datum datum = consistencyService
                .get(KeyBuilder.buildInstanceListKey(service.getNamespaceId(), service.getName(), ephemeral));

        // 获取本地注册表中当前服务的所有临时实例
        List<Instance> currentIPs = service.allIPs(ephemeral);
        Map<String, Instance> currentInstances = new HashMap<>(currentIPs.size());
        Set<String> currentInstanceIds = Sets.newHashSet();

        // 遍历注册表中获取到的实例
        for (Instance instance : currentIPs) {
            // 将当前遍历的instance写入到map,key为ip:port,value为instance
            currentInstances.put(instance.toIpAddr(), instance);
            // 将当前遍历的instanceId写入到一个set
            currentInstanceIds.add(instance.getInstanceId());
        }

        Map<String, Instance> instanceMap;
        if (datum != null) {
            // 将注册表中主机的instance数据替换掉外来的相同主机的instance数据
            instanceMap = setValid(((Instances) datum.value).getInstanceList(), currentInstances);
        } else {
            instanceMap = new HashMap<>(ips.length);
        }

        for (Instance instance : ips) {
            // 若当前service中不包含当前要注册的instance所属cluster,则创建一个
            if (!service.getClusterMap().containsKey(instance.getClusterName())) {
                Cluster cluster = new Cluster(instance.getClusterName(), service);
                // 初始化cluster的健康检测任务
                cluster.init();
                service.getClusterMap().put(instance.getClusterName(), cluster);
                Loggers.SRV_LOG
                        .warn("cluster: {} not found, ip: {}, will create new cluster with default configuration.",
                                instance.getClusterName(), instance.toJson());
            }

            // 若当前操作为清除操作,则将当前instance从instanceMap中清除,
            // 否则就是添加操作,即将当前instance添加到instanceMap中
            if (UtilsAndCommons.UPDATE_INSTANCE_ACTION_REMOVE.equals(action)) {
                instanceMap.remove(instance.getDatumKey());
            } else {
                instance.setInstanceId(instance.generateInstanceId(currentInstanceIds));
                instanceMap.put(instance.getDatumKey(), instance);
            }

        }

        if (instanceMap.size() <= 0 && UtilsAndCommons.UPDATE_INSTANCE_ACTION_ADD.equals(action)) {
            throw new IllegalArgumentException(
                    "ip list can not be empty, service: " + service.getName() + ", ip list: " + JacksonUtils
                            .toJson(instanceMap.values()));
        }

        return new ArrayList<>(instanceMap.values());
    }
  1. 从其它nacos获取当前服务数据(临时实例数据)
  2. 获取本地注册表中当前服务的所有临时实例
  3. 遍历注册表中获取到的实例, 将当前遍历的instance写入到map, 将当前遍历的instanceId写入到一个set
  4. 将注册表中主机的instance数据替换掉外来的相同主机的instance数据
  5. 若当前service中不包含当前要注册的instance所属cluster,则创建一个, 初始化cluster的健康检查任务
  6. 若当前操作为清除操作,则将当前instance从instanceMap中清除
  7. 返回修改后的instance列表

ServiceManager#setValid(): 将注册表中主机的instance数据替换掉外来的相同主机的instance数据

在这里插入图片描述

  1. 遍历外来的instance集合
  2. 从注册表包含的instance中若可以找到当前遍历的instance, 则将注册表中该主机的instance数据替换掉外来的数据
  3. 返回列表

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

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

相关文章

什么是SOAP

什么是SOAP 什么是SOAP? SOAP (Simple Object Access Protocol) 是一种基于XML的通信协议&#xff0c;用于在网络上交换结构化的信息。它被广泛用于分布式系统中的应用程序间通信。 SOAP定义了一组规范&#xff0c;描述了消息的格式、通信的方式和处理消息的过程。它允许应…

23种设计模式之解释器模式(Interpreter Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的解释器模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬…

C语言打印九九乘法表的多种方式多种形式(完整,左上,左下,右上,右下)

&#x1f4e2;博客主页&#xff1a;肩匣与橘&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由肩匣与橘编写&#xff0c;首发于CSDN&#x1f649;&#x1f4e2;生活依旧是美好而又温柔的&#xff0c;你也是✨ …

机器学习_Lasso回归_ElasticNet回归_PolynomialFeatures算法介绍_02---人工智能工作笔记0037

Lasso回归用的是L1正则化可以看到,这里的alpha就是这里的alpha对吧,就是 L1的权重 然后对于ElasticNet回归来说,这里的alpha可以看到是L1权重的超参数对吧,然后这里的p,表示的是 L2正则里面的(1-p)这里 这里要提一下: L1和L2为什么能防止过拟合,它们有什么区别?通过添加…

使用CNN-LSTM来预测锂离子电池健康状态SOH(附代码)

对于电动汽车而言&#xff0c;动力锂电池的健康状态(State of Health,SOH)估算方法是电池管理系统中非常重要的一个方面。准确估计锂电池老化状态并预测电池剩余寿命对于电动汽车稳定安全运行有着重要的意义。借助数据驱动方法的思想&#xff0c;本文对锂离子电池寿命历史数据进…

【案例实战】SpringBoot整合EasyExcel实现列表导出功能

这篇文章会给大家实操一个关于列表导出成excel表格的功能&#xff0c;相信大家在日常工作中也会遇到列表导出的需求&#xff0c;看完本篇文章那么你就可以轻松的去整合列表导出的功能。 本次使用的导出工具是阿里巴巴开源的EasyExcel&#xff0c;关于EasyExcel我这里简单的介绍…

Nacos使用详解

一、部署nacos 1、方式一&#xff08;一般的windows和linux部署&#xff09; 需要的nacos-server-1.4.1文件&#xff1a;https://download.csdn.net/download/yueyue763184/87822434?spm1001.2014.3001.5503 一般的nacos部署方式教程&#xff1a;https://blog.csdn.net/yue…

敲代码都两年半了,还不会用SDL、C语言rap一个推箱子?

前言 欢迎来到小K的SDL专栏第三小节&#xff0c;本节将为大家带来小项目~C语言SDL版坤坤推箱子详细讲解&#xff0c;这里也为大家上传了源码和图片资源&#xff0c;需要的自取看完以后&#xff0c;希望对你有所帮助 ✨效果如下 文章目录 前言一、推箱子思路讲解二、加SDL绘图代…

离散系统函数零积点分析

离散系统函数零积点分析 在 Matlab中&#xff0c;系统函数的零极点就可以通过函数 roots 得到。 函数的零极点也可以通过函数 tf2zp 获得&#xff0c;其调用格式为&#xff1a;[Z, P, K] tf2zp(B, A)&#xff0c;函数 tf2zp 可以将H(z)的有理分式转换为零极点增益形式&#…

WEB端唤起 百度|腾讯|高德 地图一键导航功能

WEB端唤起 百度|腾讯|高德 地图一键导航功能 目录 腾讯地图&#xff1a; 百度地图&#xff1a; 高德地图&#xff1a; 坐标拾取器&#xff1a; 腾讯地图&#xff1a; 极简写法&#xff1a; https://3gimg.qq.com/lightmap/v1/marker/index.html?markercoord:纬度,经度;t…

工业设备状态监测:振动常见原因分析

在工业生产中&#xff0c;设备的正常运行和可靠性对于保障生产效率和安全至关重要。然而&#xff0c;工业设备在运行过程中常常会出现振动现象&#xff0c;这可能是由于多种原因导致的。 根据设备劣化趋势P-F曲线我们可以知道&#xff0c;振动信号监测是状态监测过程中可以被快…

Markdown编辑器 测试

测试一下TOC 你好Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支…

MongoDB的应用

目录 一、MongoDb是什么 1.特点 2.功能 3.基本的指令 二、MongoDB的使用场景 1.适用场合 2.常见应用场景 三、可能遇到的问题 1.MongoDB是否支持事务&#xff1f; 2.MongoDB大数据迁移怎么做&#xff1f; 3.MongoDB的水平扩展是什么原理&#xff1f; 4.MongoDB出现负…

Jenkins UI与接口自动化测试持续集成实战

篇幅较长&#xff0c;要耐心阅读哦~ 基础知识简要回顾 持续集成、持续交付的好处与产生的必然性Jenkins服务的搭建方法Jenkins节点管理与用户权限Jenkins插件Jenkins父子多任务关联运行Jenkins报警机制 目录 SeleniumUI自动化测试持续集成演练接口自动化测试持续集成演练 …

采埃孚-4D毫米波雷达拆解分析

采埃孚4D毫米波雷达拆解分析 4D毫米波雷达具有4个维度的信息&#xff0c;分别是距离、速度、方向角和高度。下面分析采埃孚再飞凡汽车上的4D毫米波雷达。 4D毫米波雷达共由四部分组成&#xff0c;分别为&#xff1a;数字接口板及结构件、屏蔽罩、发射单元及PCB以及雷达天线罩…

如何在 Linux、Windows 和 Mac 上查找 WiFi 密码?

无线网络已成为我们日常生活中不可或缺的一部分&#xff0c;我们经常需要连接各种WiFi网络。但是&#xff0c;有时我们可能会忘记自己的WiFi密码&#xff0c;或者需要连接到一个以前连接过的网络。在这种情况下&#xff0c;我们可以使用一些方法来查找已连接网络的密码。 本文将…

研报精选230526

目录 【行业230526山西证券】有色金属行业周报&#xff1a;锂价强势反弹回30万元or吨 【行业230526开源证券】食品饮料行业投资策略&#xff1a;消费复苏贯穿全年&#xff0c;结构分化择机布局 【行业230526德邦证券】核电行业深度系列报告&#xff1a;积极安全有序发展核电&am…

8-JDBC 编程

目录 1.数据库编程的必备条件 PS&#xff1a;程序是怎么操作数据库的&#xff1f; 2.什么是JDBC&#xff1f; 2.1.JDBC定义 2.2.JDBC工作原理 3.JDBC使用 3.1.创建项目并添加MySQL驱动包 3.2.使用代码操作数据库 3.2.1.获得数据源 3.2.2.获得连接 3.2.3.获得执行器 …

软考A计划-2022年11月软件设计师下午真题及答案解析

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

【云原生|Kubernetes】06-Pod的生命周期和重启策略

【云原生|Kubernetes】06-Pod的生命周期和重启策略 文章目录 【云原生|Kubernetes】06-Pod的生命周期和重启策略Pod生命周期生命周期Pod的状态Pod子状态 Pod重启策略调试PodPod 停滞在 Pending 状态Pod 停滞在 Waiting 状态Pod 处于 Crashing 或别的不健康状态Pod 处于 Running…