首页 > 其他分享 >Nacos的服务注册表结构是怎样的

Nacos的服务注册表结构是怎样的

时间:2023-06-30 17:45:01浏览次数:51  
标签:Map 服务 Nacos Instance 实例 集群 key 注册表 怎样

回答

Nacos采用了数据分级存储模型,最外层是 Namespace,用来隔离环境。然后是Group,用来对服务分组。接下来就是服务(Service)了,一个服务包含多个实例,但是可能处于不同的机房,因此Service下有多个集群(Cluster),Cluster下是不同的实例(Instance)。
对应到Java代码中,Nacos采用了多层的Map结构来表示。即Map<String, Map<String, Service>>, 其中最外层Map的key就是namespaceid,值是一个Map。这个Map也就是内层Map的key是group拼接serviceName,值是Service对象。Service对象内部又是一个Map,key是集群的名称,值是Cluster对象。而Cluster对象内部维护了一个Instance的Set集合

如图:

源码分析

首先打开nacos官网,打开Open API指南:https://nacos.io/zh-cn/docs/open-api.html

访问注册实例

可以看到一个请求的url,我们顺着这个url去找源码:
/nacos/v2/ns/instance
nacos是一个控制端模块:

所以我们要跟入到naming这个模块看下。可以发现controllers里面有大量的控制器,可以顺着url找到一个Instance有关的,就可以发现就是这个类,起到了服务注册的作用:


而且它还是一个post请求,找到postmapping就能找到它的具体哪个接口了:

这就是服务注册的入口。
跟着这个register源码。首先它会从request里面获取一些信息,比如namespaceId,接着获取服务名:serviceName,而且要对这个服务名称做格式校验checkServiceNameFormat,然后再将request解析成一个服务实例对象Instance

这个Instance又继承了com.alibaba.nacos.api.naming.pojo.Instance这个对象,跟进去:

会发现它的一些服务的属性,比如ip、端口、实例Id等等都是通过这个Instance进行封装的。
接下来通过serviceManager也就是服务管理器调用服务注册实例方法registerInstance,在这个服务管理器最上面有个Map(serviceMap)就是来维护整个nacos注册表的。

我们跟踪它内部的这个map的service再看看:

发现它里面还维护了一个Map,这个就是service集群Map,这个Map的key即使集群的名称,这个值就是集群本身。我们接着跟Cluster里面:

发现里面维护了两个集合,一个是persistentInstances,存放永久实例,一个是ephemeralInstances存放临时实例。
以上就是Nacos服务分级存储模型。

总结:

首先最外层是一个Map,结构为:Map<String, Map<String, Service>>

  • key:是namespace_id,起到环境隔离的作用。namespace下可以有多个group
  • value:又是一个Map<String, Service>,代表分组及组内的服务。一个组内可以有多个服务
    • key:代表group分组,不过作为key时格式是group_name:service_name
    • value:分组下的某一个服务,例如userservice,用户服务。类型为Service,内部也包含一个Map<String,Cluster>,一个服务下可以有多个集群
      • key:集群名称
      • value:Cluster类型,包含集群的具体信息。一个集群中可能包含多个实例,也就是具体的节点信息,其中包含一个Set<Instance>,就是该集群下的实例的集合
        • Instance:实例信息,包含实例的IP、Port、健康状态、权重等等信息

每一个服务去注册到Nacos时,就会把信息组织并存入这个Map中。

标签:Map,服务,Nacos,Instance,实例,集群,key,注册表,怎样
From: https://www.cnblogs.com/wekenyblog/p/17517450.html

相关文章

  • Nacos占用内存的大文件有哪些?
    1、log文件:nacos2.1.0-beta\logs;没啥可说的,定期清理2、如图所示:data下的文件,可以删除,删除后重启会重新自动生成新的文件;定期清理  end......
  • nacos源码分析
    下载Nacos源码访问GitHub官网地址:https://github.com/alibaba/nacos找到其release页面:https://github.com/alibaba/nacos/tags,找到其中的1.4.2.版本:点击进入后,下载Sourcecode(zip):导入Demo工程这里不做演示,可以自己建一个:结构说明:cloud-source-demo:项目父目录cloud-......
  • spring cloud nacos的负载均衡
    SpringCloudNacos提供了负载均衡的能力,以在服务调用时实现分布式系统中的负载均衡。下面是SpringCloudNacos负载均衡的详细说明:在SpringCloud中,负载均衡是通过Ribbon这个负载均衡器来实现的。而SpringCloudNacos使用了Ribbon作为默认的负载均......
  • 关于Nacos身份认证绕过漏洞默认密钥和JWT的研究
    前言由于本人的一个习惯,每次遇到漏洞并复现后都要编写poc,以便下一次的直接利用与复测使用。研究Nacos默认密钥和JWT的爱恨情仇的过程中遇到了莫名其妙的问题,在此做以记录,方便日后有大佬遇到相同的问题路过看到能够得以解决。研究过程在Nacos身份认证绕过漏洞复现文章中提到jwt.......
  • 记一次Nacos漏洞的复现 --> 身份认证绕过漏洞(QVD-2023-6271)
    前记端午前两天,遇到公司某客户的站点是Nacos,随后就是网上搜一波漏洞,搜到QVD-2023-6271,故做以下记录漏洞复现漏洞描述漏洞原理为开源服务管理平台Nacos在默认配置下未对token.secret.key进行修改,导致远程攻击者可以绕过密钥认证进入后台造成系统受控等后果。漏洞信息漏洞......
  • PostgreSQL插件那么多,怎样管理最高效?
    云服务环境下,如何让客户更方便地在各个PostgreSQL的版本下安装插件和扩展功能,成为云服务厂商的一个挑战。华为云RDSforPostgreSQL通过插件管理功能,很好地解决了PostgreSQL版本与插件耦合的问题,帮助用户更直观、更快速地安装管理数据库插件。关于PostgreSQL插件众所周知,PostgreSQL......
  • “800703fa 尝试对注册表项执行非法操作”错误
    “800703fa尝试对注册表项执行非法操作”错误原因管理员使用服务帐户登录到服务器进行交互式会话,然后注销后,通常会发生此问题。例如,管理员可以使用服务器场帐户登录到Web前端(WFE)服务器,然后注销。此活动强制在该帐户的配置文件中卸载注册表项。这种情况使密钥无法供将来使......
  • 2.nacos-client源码及查看
    nacos-client.2.2.1-RC.SDK查看源码官网JAVASDK链接主要内容<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>${version}</version></dependency>问题:1.获取配置api是获取快照......
  • nacos 基础使用
    依赖<!--配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--服务注册/发现--><dependency><groupId......
  • SpringCloud Alibaba入门3之nacos服务搭建
    我们继续在上一章的基础上学习。https://blog.51cto.com/u_13312531/6539601一、下载nacos-server从https://github.com/alibaba/nacos/releasesopeninnewwindow 下载nacos-server发行版。我们使用1.4.2版本二、启动nacos进入%path%\nacos\bin文件夹,执行cmd命令startup.cmd-m......