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

2023-12-12 21:15:00 浏览数 (2)

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()处理注册请求。

0 人点赞