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

news/2024/3/4 9:25:52

文章目录

      • 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"));// 使用获取到的属性值装配一个instanceInstance 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 {// 从注册表获取当前serviceService 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为instancecurrentInstances.put(instance.toIpAddr(), instance);// 将当前遍历的instanceId写入到一个setcurrentInstanceIds.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.ppmy.cn/news/90556.html

相关文章

C/C++开发重点知识总结-1

1、C/C 基础 - 基础 https://blog.csdn.net/qq_40873718/article/details/107899042 - c面试总结&#xff1a; https://blog.csdn.net/wsq_zqfl/article/details/104429090?spm1001.2014.3001.5502https://blog.csdn.net/xu_fu_yong/article/details/122948379 2、重点知…

C# 队列(Queue)

目录 一、概述 二、基本的用法 1.添加元素 2.取出元素 1&#xff09;Dequeue 方法 2&#xff09;Peek 方法 3.判断元素是否存在 4.获取队列的长度 5.遍历队列 6.清空容器 7.Queue 泛型类 三、结束 一、概述 表示对象的先进先出集合。 队列和其他的数据结构一样&a…

听劝,不要什么都不懂就自学网络安全【黑客】

一、网络安全学习的误区 1.不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;且过渡到网络安全用到编程的用到的编程的关键点不多。一般人如果想要把编程学好再开始学习网络安全往…

百度历年笔试面试150题

百度历年笔试面试150题 1、用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。 2、用C语言实现函数void * memmove(void *dest, const void *src, size_t n)。memmove 函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。 分析:由于可以…

jvm之对象大小分析

写在前面 本文看下计算对象大小相关内容。 1&#xff1a;基础内容 1.1&#xff1a;对象的结构 一个对象由对象头和对象体组成&#xff0c;其中对象头包含如下内容&#xff1a; 标记字&#xff08;mark word&#xff09;&#xff1a;存放GC年龄信息&#xff0c;对象锁信息等…

八、Spring Cloud Alibaba-seata分布式事务

一、引言 1、事务简介 事务(Transaction)是访问并可能更新数据中各种数据项的一个程序执行单元(unit&#xff09;。在关系数据库中&#xff0c;一个事务由一组SQL语向组成。事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 原子性(atomic…

数据库提权

数据库提权的前提就是得到数据库的账号密码。在webshell或本地进行提权。 数据库提权分为四步&#xff1a; 1.服务探针&#xff0c;探测出数据库的类型&#xff08;端口扫描等&#xff09; 2.信息搜集&#xff0c;就是获取到数据库的账号密码。权限要高。 读取数据库密码的…

基于ROS2的costmap中Obstacle Layer中对障碍物信息的增加与删除机制的方案调研。

文章目录 1.背景2.目标3. 障碍物信息添加方式发送数据的数据结构与接收数据的数据结构 4. 障碍物清理机制4.1 参数过滤障碍物4.2 时间过滤障碍物4.3 优化光追算法过滤障碍物4.4 障碍物跟踪过滤障碍物4.4.1 无语义动态障碍物跟踪4.4.2 语义障碍物分层4.4.3 障碍物实例分割与类别…

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

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

C++ Primer第五版_第十八章习题答案(11~20)

文章目录 练习18.11练习18.12练习18.13练习18.14练习18.15练习18.16练习18.17练习18.18练习18.19练习18.20 练习18.11 为什么 what 函数不应该抛出异常&#xff1f; what中如果抛出异常&#xff0c;需要try catch捕获&#xff0c;再调用what&#xff0c;一直循环&#xff0c;直…

霍尔电流传感器的注意事项及其在直流列头柜中的应用

安科瑞虞佳豪 霍尔电流传感器​注意事项 &#xff08;1&#xff09;电流传感器必须根据被测电流的额定有效值适当选用不同的规格的产品。被测电流长时间超额&#xff0c;会损坏末极功放管&#xff08;指磁补偿式&#xff09;&#xff0c;一般情况下&#xff0c;2倍的过载电流…

“多杆合一”降本增效——数字孪生智慧灯杆

随着智慧城市建设的不断深入&#xff0c;智慧灯杆作为城市基础设施的重要组成部分&#xff0c;正在成为城市智能化和绿色化的重要手段之一。 图扑智慧灯杆系统在城市道路照明领域引入信息化手段&#xff0c;通过构建路灯物联网&#xff0c;实现了现代化的路灯按需维修和按需照…

【操作系统真象还原】第4章:保护模式入门(4.4~4.5节)

目录 4.4 处理器微架构简介 4.4.1 流水线 4.4.2 乱序执行 4.4.3 缓存 4.4.4 分支预测 4.5 使用远跳转指令清空流水线&#xff0c;更新段描述符缓冲寄存器 4.6 保护模式之内存段的保护 4.6.1 向段寄存器加载选择子时的保护 4.6.2 代码段和数据段的保护 4.6.3 栈段的保…

Rust 入门教程

文章目录 前言1. 使用cargo创建项目2. 编程语言类型1. 整数2. 浮点数3. 字符 3. 常量与不可变变量的区别4. 重影&#xff08;Shadowing&#xff09;5. 两个重要的泛型类型6. 常见的内存管理方式7. 如何理解生命周期&#xff1f;8. 条件语句1. if实例2. while循环实例3. for循环…

【Linux】关于OOM(Out of Memory)相关的介绍及处理方法

关于OOM(Out of Memory)相关的介绍及处理方法 OOM&#xff08;Out-of-Memory&#xff09;机制是内核的一部分&#xff0c;用于处理内存消耗过度的情况。OOM机制的责任是选择一个或多个高内存消耗的进程&#xff0c;并终止它们以释放内存。 在Linux中&#xff0c;进程的OOM Sc…

数据高效转储,生产轻松支撑

在使用WINDOWS或智能手机的时候&#xff0c;经常会遇到存储空间不足的问题&#xff0c;鲜有人会打开文件管理系统自己逐个清理&#xff0c;不仅因为底层的系统文件繁多操作耗时&#xff0c;更有其操作专业度高、风险高的问题。这时我们往往会求助各种各样的清理大师&#xff0c…

组合总和-回溯

1题目 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输出: [[1,2,…

QT软件开发: 获取CPU序列号、硬盘序列号、主板序列号 (采用wmic命令)

一、环境介绍 QT版本: 5.12.6 环境: win10 64位 编译器: MinGW 32 二、功能介绍 通过wmic 命令获取CPU序列号、硬盘序列号、主板序列号、CPU名称等信息。 做软件加密、数据加密、软件1机1码绑定的场合比较实用。 WMIC扩展WMI&#xff08;Windows Management Instrument…

CSDN平台如何获得优质铁粉建议?

目录 1. 精心写作 2. 互动交流 3. 不断更新 4. 探索博客广场 CSDN是全球最大的中国IT社区&#xff0c;涵盖了广泛的技术资源和众多IT从业者。而想要在这个平台上获得铁粉或关注自己的优质文章&#xff0c;则需要一定的策略与技巧。 以下是一些有用的建议&#xff1a; 1. …

算法|4.归并排序及应用

算法|4.归并排序及应用 1.归并排序算法 题意&#xff1a;归并排序的递归和非递归实现 解题思路&#xff1a; ​ 递归实现&#xff1a; 预处理&#xff1a;数组为空或者长度小于2的直接返回调用子过程子过程终止条件LR分解成[L,mid]&#xff0c;[mid1,R] &#xff0c;子数组…
最新文章