Nacos实现原理(一)——注册原理

官网

https://nacos.io/zh-cn/docs/what-is-nacos.html

简介

服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理,Nacos关键的特性包括服务发现和服务家门康监测、动态配置服务、动态DNS服务、服务及其元数据管理。

本文主要介绍Nacos的某些原理,希望通过架构一步一步逐层分析,来了解其原理。需要在阅读本文之前对Nacos有一定的认识。

架构

本文主要通过Nacos的架构以及实现注册中心的原理来进一步进行了解。

架构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l1YIZ4ho-1599182142543)(./images/1599101606799.png)]

  • Provider APP:服务提供者
  • Consumer APP:服务消费者
  • Name Server:通过DNS、vip(Vritual IP)、地址服务器的方式实现Nacos高可用集群的服务路由。
  • Nacos Server: Nacos服务提供者,里面包含的Open API是功能访问入口,Config Service、Name Service是Nacos提供的配置服务、名字服务模块。Consistency Protocol是一致性协议,用来实现Nacos集群节点的数据同步,这里使用的是Raft算法(使用类似算法的还有Etcd、Redis哨兵选举)。
  • Nacos Console:Nacos控制台

Nacos概念

  • 服务 (Service)
    服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service.

  • 服务注册中心 (Service Registry)
    服务注册中心,它是服务,其实例及元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。

  • 服务元数据 (Service Metadata)
    服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据

  • 服务提供方 (Service Provider)
    是指提供可复用和可调用服务的应用方

  • 服务消费方 (Service Consumer)
    是指会发起对某个服务调用的应用方

  • 配置 (Configuration)
    在系统开发过程中通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成这个步骤。配置变更是调整系统运行时的行为的有效手段之一。

  • 配置管理 (Configuration Management)
    在数据中心中,系统中所有配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动统称为配置管理。

  • 名字服务 (Naming Service)
    提供分布式系统中所有对象(Object)、实体(Entity)的“名字”到关联的元数据之间的映射管理服务,例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服务发现和 DNS 就是名字服务的2大场景。

  • 配置服务 (Configuration Service)
    在服务或者应用运行过程中,提供动态配置或者元数据以及配置管理的服务提供者。

源码

源码部分,从三部分看:

  • 服务注册
  • 服务地址的获取
  • 服务地址变化的感知

客户端注册

Spring Cloud服务注册规范

有一个类叫做org.springframework.cloud.client.serviceregistry.ServiceRegistry,源码如下:

package org.springframework.cloud.client.serviceregistry;

/**
 * Contract to register and deregister instances with a Service Registry.
 *
 * @param <R> registration meta data
 * @author Spencer Gibb
 * @since 1.2.0
 */
public interface ServiceRegistry<R extends Registration> {

	/**
	 * Registers the registration. A registration typically has information about an
	 * instance, such as its hostname and port.
	 * @param registration registration meta data
	 */
	void register(R registration);

	/**
	 * Deregisters the registration.
	 * @param registration registration meta data
	 */
	void deregister(R registration);

	/**
	 * Closes the ServiceRegistry. This is a lifecycle method.
	 */
	void close();

	/**
	 * Sets the status of the registration. The status values are determined by the
	 * individual implementations.
	 * @param registration The registration to update.
	 * @param status The status to set.
	 * @see org.springframework.cloud.client.serviceregistry.endpoint.ServiceRegistryEndpoint
	 */
	void setStatus(R registration, String status);

	/**
	 * Gets the status of a particular registration.
	 * @param registration The registration to query.
	 * @param <T> The type of the status.
	 * @return The status of the registration.
	 * @see org.springframework.cloud.client.serviceregistry.endpoint.ServiceRegistryEndpoint
	 */
	<T> T getStatus(R registration);

}

如果工程中引入了Nacos,应该能找到Nacos实现com.alibaba.cloud.nacos.registry.NacosServiceRegistry

Spring Cloud通过
spring-cloud-commons\META-INF\spring.factories文件中配置的org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration类来自动化服务注册。

AutoServiceRegistrationAutoConfiguration中,可以看到注入了一个autoServiceRegistration示例,该类被com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration实现。该类主要实现了一个ApplicationListener接口,其中监听了WebServerInitializedEvent类型的事件。在深入跟踪后,发现其最终会调用到com.alibaba.cloud.nacos.registry.NacosServiceRegistry#register完成注册操作。

Spring Cloud Alibaba Dubbo服务注册规范

同样是通过spring-cloud-alibaba-dubbo下的META-INF\spring.factories文件中自动装配了和服务注册相关的配置类DubboLoadBlanceRestTemplateAutoConfiguration.

在该类中,有一个@EventListener的声明,它会监听ApplicationStartedEvent类型的事件(Spring Boot 2.0的新增时间),改时间是在刷新上下文之后、调用application命令之前触发。
收到时间通知后,调用this.register,其最终会调用到com.alibaba.cloud.nacos.registry.NacosServiceRegistry#register完成注册操作。

NacosServiceRegistry实现

register()中,调用了Nacos Client SDK中的this.namingService.registerInstance()完成服务的注册。

registerInstance()实现的主要逻辑是:

  • 通过this.beatReactor.addBeatInfo()创建心跳信息实现健康检测,Nacos Server必须要确保注册的服务实例是健康的,而心跳检测就是服务健康监测的手段。
  • 通过this.serverProxy.registerService()实现服务注册。

先重点来看看心跳逻辑,源码如下:

public void addBeatInfo(String serviceName, BeatInfo beatInfo) {
	LogUtils.NAMING_LOGGER.info("[BEAT] adding beat: {} to beat map.", beatInfo);
	String key = this.buildKey(serviceName, beatInfo.getIp(), beatInfo.getPort());
	BeatInfo existBeat = null;
	if ((existBeat = (BeatInfo)this.dom2Beat.remove(key)) != null) {
		existBeat.setStopped(true);
	}

	this.dom2Beat.put(key, beatInfo);
	//利用定时调度发送心跳包
	this.executorService.schedule(new BeatReactor.BeatTask(beatInfo), beatInfo.getPeriod(), TimeUnit.MILLISECONDS);
	MetricsMonitor.getDom2BeatSizeMonitor().set((double)this.dom2Beat.size());
}

从源码看,所谓的心跳机制就是客户端通过定制任务向服务端发送一个数据包,然后启动一个线程不断地检测服务端的回应,如果在设定时间内没有收到服务端的回应,则认为服务器出现了故障。Nacos服务端会根据客户端的心跳包不断更新服务的信息。

Nacos服务注册的原理

Nacos提供了多种API

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Nacos是一个开源的动态服务发现、配置管理和服务管理平台。它提供了注册中心、配置中心和命名空间等功能。其中,Nacos注册中心的实现原理如下: Nacos注册中心采用了Raft算法来保证数据的一致性和可靠性。Raft算法是一种分布式一致性算法,它将整个集群划分为多个节点,每个节点都有自己的状态和角色。在Nacos中,每个节点都可以成为Leader、Follower或Candidate。Leader节点负责处理客户端请求,Follower节点负责接收Leader节点的同步请求,Candidate节点则是准备竞选Leader的节点。 当一个服务实例启动时,它会向Nacos注册中心发送注册请求,注册中心会将该服务实例的信息存储在内存中,并将该信息同步给其他节点。当一个服务实例下线时,它会向Nacos注册中心发送注销请求,注册中心会将该服务实例的信息从内存中删除,并将该信息同步给其他节点。 除了服务实例的注册和注销,Nacos注册中心还支持服务实例的心跳检测和服务实例的元数据管理等功能。服务实例的心跳检测可以保证注册中心能够及时发现服务实例的故障,而服务实例的元数据管理可以帮助用户更好地管理服务实例的信息。 总之,Nacos注册中心采用了Raft算法来保证数据的一致性和可靠性,同时支持服务实例的注册、注销、心跳检测和元数据管理等功能,从而实现了一个高可用、高可靠的服务注册中心。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值