起源:blog.csdn.net/cold___play/article/details/108032204

Nacos架构

  • Provider APP:服务提供者
  • Consumer APP:服务消费者
  • Name Server:通过VIP(Virtual IP)或DNS的形式实现Nacos高可用集群的服务路由
  • Nacos Server:Nacos服务提供者,外面蕴含的Open API是性能拜访入口,Conig Service、Naming Service 是Nacos提供的配置服务、命名服务模块。Consitency Protocol是一致性协定,用来实现Nacos集群节点的数据同步,这里应用的是Raft算法(Etcd、Redis哨兵选举)
  • Nacos Console:控制台

注册核心的原理

  • 服务实例在启动时注册到服务注册表,并在敞开时登记
  • 服务消费者查问服务注册表,取得可用实例
  • 服务注册核心须要调用服务实例的健康检查API来验证它是否可能解决申请

SpringCloud实现注册的机会

在Spring-Cloud-Common包中有一个类org.springframework.cloud. client.serviceregistry .ServiceRegistry ,它是Spring Cloud提供的服务注册的规范。集成到Spring Cloud中实现服务注册的组件,都会实现该接口。

该接口有一个实现类是NacoServiceRegistry。

SpringCloud集成Nacos的实现过程:

spring-clou-commons包的META-INF/spring.factories中蕴含主动拆卸的配置信息如下:

其中AutoServiceRegistrationAutoConfiguration就是服务注册相干的配置类:

AutoServiceRegistrationAutoConfiguration配置类中,能够看到注入了一个AutoServiceRegistration实例,该类的关系图如下所示。

能够看出, AbstractAutoServiceRegistration抽象类实现了该接口,并且最重要的是NacosAutoServiceRegistration继承了AbstractAutoServiceRegistration

看到EventListener咱们就应该晓得,Nacos是通过Spring的事件机制继承到SpringCloud中去的。

AbstractAutoServiceRegistration实现了onApplicationEvent形象办法,并且监听WebServerInitializedEvent事件(当Webserver初始化实现之后) , 调用this.bind ( event )办法。

最终会调用NacosServiceREgistry.register()办法进行服务注册。

NacosServiceRegistry的实现

NacosServiceRegistry.registry办法中,调用了Nacos Client SDK中的namingService.registerInstance实现服务的注册。

跟踪NacosNamingService的registerInstance()办法:

  • 通过beatReactor.addBeatInfo()创立心跳信息实现衰弱检测, Nacos Server必须要确保注册的服务实例是衰弱的,而心跳检测就是服务衰弱检测的伎俩。
  • serverProxy.registerService()实现服务注册

心跳机制:

从上述代码看,所谓心跳机制就是客户端通过schedule定时向服务端发送一个数据包 ,而后启动-个线程一直检测服务端的回应,如果在设定工夫内没有收到服务端的回应,则认为服务器呈现了故障。Nacos服务端会依据客户端的心跳包不断更新服务的状态。

注册原理:

Nacos提供了SDK和Open API两种模式来实现服务注册。

Open API:

SDK:

这两种模式实质都一样,底层都是基于HTTP协定实现申请的。所以注册服务就是发送一个HTTP申请:

对于nacos服务端,对外提供的服务接口申请地址为nacos/v1/ns/instance,实现代码咋nacos-naming模块下的InstanceController类中:

  • 从申请参数汇总取得serviceName(服务名)和namespaceId(命名空间Id)
  • 调用registerInstance注册实例

  • 创立一个控服务(在Nacos控制台“服务列表”中展现的服务信息),实际上是初始化一个serviceMap,它是一个ConcurrentHashMap汇合
  • getService,从serviceMap中依据namespaceId和serviceName失去一个服务对象
  • 调用addInstance增加服务实例

  • 依据namespaceId、serviceName从缓存中获取Service实例
  • 如果Service实例为空,则创立并保留到缓存中

  • 通过putService()办法将服务缓存到内存
  • service.init()建设心跳机制
  • consistencyService.listen实现数据一致性监听

service.init ( )办法的如下图所示,它次要通过定时工作一直检测以后服务下所有实例最初发送心跳包的工夫。如果超时,则设置healthy为false示意服务不衰弱,并且发送服务变更事件。

在这里请大家思考一一个问题,服务实例的最初心跳包更新工夫是谁来触发的?实际上后面有讲到, Nacos客户端注册服务的同时也建设了心跳机制。

putService办法,它的性能是将Service保留到serviceMap中:

持续调用addInstance办法把以后注册的服务实例保留到Service中:

总结:

  • Nacos客户端通过Open API的模式发送服务注册申请
  • Nacos服务端收到申请后,做以下三件事:
    • 构建一个Service对象保留到ConcurrentHashMap汇合中
    • 应用定时工作对以后服务下的所有实例建设心跳检测机制
    • 基于数据一致性协定服务数据进行同步

服务提供者地址查问

Open API:

SDK:

InstanceController中的list办法:

  • 解析申请参数
  • 通过doSrvIPXT返回服务列表数据

  • 依据namespaceId、serviceName取得Service实例
  • 从Service实例中基于srvIPs失去所有服务提供者实例
  • 遍历组装JSON字符串并返回

Nacos服务地址动静感知原理

能够通过subscribe办法来实现监听,其中serviceName示意服务名、EventListener示意监听到的事件:

具体调用形式如下:

或者调用selectInstance办法,如果将subscribe属性设置为true,会主动注册监听:

Nacos客户端中有一个HostReactor类,它的性能是实现服务的动静更新,基本原理是:

  • 客户端发动工夫订阅后,在HostReactor中有一个UpdateTask线程,每10s发送一次Pull申请,取得服务端最新的地址列表
  • 对于服务端,它和服务提供者的实例之间维持了心跳检测,一旦服务提供者出现异常,则会发送一个Push音讯给Nacos客户端,也就是服务端消费者
  • 服务消费者收到申请之后,应用HostReactor中提供的processServiceJSON解析音讯,并更新本地服务地址列表

近期热文举荐:

1.1,000+ 道 Java面试题及答案整顿(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!