前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何理解Nacos的CP和AP架构模型?

如何理解Nacos的CP和AP架构模型?

作者头像
35岁程序员那些事
发布2023-12-12 21:15:00
2490
发布2023-12-12 21:15:00
举报

Nacos是阿里巴巴开源的注册中心和配置中心,它既可以替应用服务管理服务相关的元数据,也可以管理服务相关的配置信息。

Nacos既支持单机部署,也支持集群部署,为了保证数据的一致性,在集群模式下,Nacos既支持CP架构模型,也支持AP架构模型。

理解CP和AP架构模型

关于CP或者AP,这里就不多做解释,但是一定要理解CP和AP架构模型。

所谓CP架构模型,主要是指利用实现CP数据一致性的技术去管理分布式架构中的数据,从而确保数据的强一致性的架构模型。

所谓AP架构模型,主要是指利用AP数据一致性的技术去管理分布式架构中的数据,从而确保数据的最终一致性的架构模型。

应用服务发起一次注册请求

在理解Nacos的CP或者AP模型之前,开发人员一定要搞清楚应用服务是如何发起一次注册请求的。

第1步,应用服务依赖nacos-client,并使用NacosFactory类的方法createNamingService()创建一个Nacos与注册中心相关的实例NacosNamingService。

代码语言:javascript
复制
import static com.alibaba.nacos.api.NacosFactory.createNamingService;
private NamingService createNewNamingService(Properties properties) {
    try {
      return createNamingService(properties);
    }
    catch (NacosException e) {
      throw new RuntimeException(e);
    }
  }
代码语言:javascript
复制

当在应用服务中创建实例NacosNamingService时,会初始化一个应用服务连接Nacos注册中心的RPC代理对象NamingClientProxyDelegate,并在这个对象中建立通信渠道NamingHttpClientProxy和NamingGrpcClientProxy,前者是基于HTTP的通信渠道,后者是基于gRPC的通信渠道。

因此Nacos会在应用服务启动时,建立应用服务和Nacos注册中心的以上两种类型的通信渠道。

但是在发起注册请求的时候,如果待注册的instance类型为ephemeral类型(临时实例),则采用gRPC通信渠道,如果如果待注册的instance类型为非ephemeral类型(持久化实例),则采用HTTP通信渠道。

待注册的instance类型默认为临时实例,因此Nacos默认采用gRPC通信渠道。

第2步,调用NacosNamingService实例类的方法registerInstance()发起注册请求,其中serviceId为服务ID,group为服务组,instance为需要注册的实例信息。

代码语言:javascript
复制
namingService.registerInstance(serviceId, group, instance);

第3步,如果采用HTTP通信渠道,则调用NamingHttpClientProxy类的方法registerService()去注册服务,并向Nacos注册中心发起HTTP请求“/nacos//v1/ns/instance”。

如果Nacos是集群部署,则应用服务会利用HTTP通信渠道向Nacos集群中所有的节点发起以上HTTP请求,比如“127.0.0.1:8848/nacos//v1/ns/instance”、“127.0.0.1:8847/nacos//v1/ns/instance”和“127.0.0.1:8846/nacos//v1/ns/instance”。

Nacos注册中心启动成功之后,会启动Restful API InstanceController,并启动接口“/nacos//v1/ns/instance”。这样Nacos注册中心就会处理应用服务中基于HTTP通信渠道的注册实例请求。

第4步,如果采用gRPC通信渠道,则调用NamingGrpcClientProxy类的方法registerService()去注册服务,并向Nacos注册中心发起RPC请求InstanceRequest(gRPC请求类型为NamingRemoteConstants.registerInstance,Nacos用常量类NamingRemoteConstants封装了支持的所有类型的gRPC请求对象)。

Nacos注册中心启动成功之后,会启动一个gRPC服务端,并在gRPC服务端对应的处理器InstanceRequestHandler的方法handle()中处理RPC请求InstanceRequest。

代码语言:javascript
复制
 case NamingRemoteConstants.REGISTER_INSTANCE:
                return registerInstance(service, request, meta);

完成第1-4步之后,Nacos注册中心就收到了应用服务的注册请求了,剩下的就会走两套注册逻辑,第1个是Nacos注册中处理HTTP注册请求,第2个是Nacos注册中心处理gRPC注册请求。

Nacos注册中处理HTTP注册请求

Nacos注册中心利用Restful API InstanceController的方法register()处理注册请求。

Nacos注册中处理gRPC注册请求

Nacos注册中心利用gRPC处理器InstanceRequestHandler的方法registerInstance()处理注册请求。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构随笔录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档