当前位置: 首页 > news >正文

nacos1.4.2

一、注册表结构

// com.alibaba.nacos.naming.core.ServiceManager
/**
 * Map(namespace, Map(group::serviceName, Service)).
 */
private final Map<String, Map<String, Service>> serviceMap = new ConcurrentHashMap<>();

  nacos1.X的注册表存于ServiceManager的一个ConcurrentHashMap中,key为命名空间,值又是一个ConcurrentHashMap,内层的ConcurrentHashMapkey为组名+服务名。值为Service服务对象。

  这个Service内部又存放了一个hashMap,key为集群名,值为集群对象Cluster。Cluster内部存放两个Set集合,一个存放持久化实例,一个存放临时实例。

// com.alibaba.nacos.naming.core.Service
// 这就是serve内部具体存放集群信息位置 
private Map<String, Cluster> clusterMap = new HashMap<>();
// com.alibaba.nacos.naming.core.Cluster   

// 持久化实例集合 
@JsonIgnore
private Set<Instance> persistentInstances = new HashSet<>();
    
// 临时实例集合
@JsonIgnore
private Set<Instance> ephemeralInstances = new HashSet<>();

   实例里面存放了IP、端口、集群名称等信息。

    public Instance(String ip, int port) {
        this.setIp(ip);
        this.setPort(port);
        this.setClusterName(UtilsAndCommons.DEFAULT_CLUSTER_NAME);
    }
    
    public Instance(String ip, int port, String clusterName) {
        this.setIp(ip.trim());
        this.setPort(port);
        this.setClusterName(clusterName);
    }
    
    public Instance(String ip, int port, String clusterName, String tenant, String app) {
        this.setIp(ip.trim());
        this.setPort(port);
        this.setClusterName(clusterName);
        this.tenant = tenant;
        this.app = app;
    }

   以上所有结构组成了nacos1.X的实例注册表。

二、客户端服务注册核心源码

     客户端注册实例主要做两件事情,定时发送服务健康状态心跳、发送服务注册请求。

// 在服务启动的时候调用 注册实例
public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {
    
   NamingUtils.checkInstanceIsLegal(instance);
   String groupedServiceName = NamingUtils.getGroupedName(serviceName, groupName);
   
   //  如果是临时实例就服务端发心跳,内部是每隔5秒循环调用
   if (instance.isEphemeral()) {
       BeatInfo beatInfo = this.beatReactor.buildBeatInfo(groupedServiceName, instance);
       this.beatReactor.addBeatInfo(groupedServiceName, beatInfo);
   }
  
   //  注册实例
   this.serverProxy.registerService(groupedServiceName, groupName, instance);
}

定时发送服务健康状态心跳

     如果注册实例是临时实例,则建立心跳机制,原理是发起一个延时5秒的的异步任务向服务端发送健康状态,在这个任务的末尾又调用本身,实现每隔5秒的循环调用,发送心跳。

 发送服务注册请求

 三、服务端服务注册核心源码

     服务端是一个restful风格的HTTP接口 

这个接口内会做以下几步;

  1.  如果service是第一次创建,则在初始化时创建一个针对该service 的健康检查定时任务,延迟5秒并且每隔5秒执行一次。这个定时任务遍历service下的所有实例,如果发现服务端超过15秒没收到客户端的心跳,则将该实例健康状态标记为false,如果超过30秒没发送心跳过来,则将该实例从注册中心剔除。

 

  2. 将注册的实例信息放到一个ArrayBlockingQueue阻塞队列中,等待消费。所以这里是一个异常操作。

 这个队列的消费逻辑是在nacos启动时开启了一个死循环。

  在实际的消费注册服务操作时,用到了写时复制的设计避免读写冲突。 

 实例权重范围是0.01-10000。

 

相关文章:

  • 绝了,Gooey:一行代码将 Python 程序转换为图形界面应用
  • matlab系统辨识工具箱原理,matlab常用工具箱介绍
  • 深度学习目标跟踪相关细节-毕设
  • JVM基础:什么是STW?
  • Teams Bot App 初探
  • 3d卷积神经网络应用,3d可视动态神经检测
  • Hive on Tez 的安装配置
  • 05 关于局部变量名字的存储
  • java毕业设计教程SSM框架实现的车位租赁管理系统|停车场计费系统[包运行成功]
  • 微雪树莓派PICO笔记——7. SPI(串行外设接口)
  • 真正理解Java中的异步
  • 《Unity3D脚本编程与游戏开发》学习Day one
  • JavaScript:JavaScript编程语言学习之前端框架(VUE)架构(MVVM)的简介、案例应用之详细攻略
  • [Python]闭包
  • 《C++程序设计原理与实践》笔记 第5章 错误
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • ES6系统学习----从Apollo Client看解构赋值
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JS变量作用域
  • Laravel核心解读--Facades
  • 初探 Vue 生命周期和钩子函数
  • 当SetTimeout遇到了字符串
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 离散点最小(凸)包围边界查找
  • 前嗅ForeSpider采集配置界面介绍
  • 如何在 Tornado 中实现 Middleware
  • 通过几道题目学习二叉搜索树
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 学习JavaScript数据结构与算法 — 树
  • const的用法,特别是用在函数前面与后面的区别
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (LeetCode) T14. Longest Common Prefix
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (五)c52学习之旅-静态数码管
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net CHARTING图表控件下载地址
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET命令行(CLI)常用命令
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .net专家(张羿专栏)
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ NOI 2001 ] 食物链
  • [Android] Implementation vs API dependency
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [C++]C++基础知识概述
  • [CakePHP] 在Controller中使用Helper
  • [CISCN2019 华东北赛区]Web2