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

news/2024/11/2 16:15:49/

文章目录

      • 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 障碍物实例分割与类别…