我是靠谱客的博主 背后钢笔,最近开发中收集的这篇文章主要介绍Nacos实现原理(一)——注册原理官网简介架构源码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-commonsMETA-INFspring.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-INFspring.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

最后

以上就是背后钢笔为你收集整理的Nacos实现原理(一)——注册原理官网简介架构源码Nacos服务注册的原理的全部内容,希望文章能够帮你解决Nacos实现原理(一)——注册原理官网简介架构源码Nacos服务注册的原理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部