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
:控制台在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.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类中:
putService()
方法将服务缓存到内存service.init()
建立心跳机制consistencyService.listen
实现数据一致性监听service.init ( )
方法的如下图所示,它主要通过定时任务不断检测当前服务下所有实例最后发送心跳包的时间。如果超时,则设置healthy为false表示服务不健康,并且发送服务变更事件。
在这里请大家思考一一个问题,服务实例的最后心跳包更新时间是谁来触发的?实际上前面有讲到, Nacos客户端注册服务的同时也建立了心跳机制。
putService方法,它的功能是将Service保存到serviceMap中:
继续调用addInstance方法把当前注册的服务实例保存到Service中:
总结:
Open API:
SDK:
InstanceController中的list方法:
可以通过subscribe方法来实现监听,其中serviceName表示服务名、EventListener表示监听到的事件:
具体调用方式如下:
或者调用selectInstance方法,如果将subscribe属性设置为true,会自动注册监听:
Nacos客户端中有一个HostReactor类,它的功能是实现服务的动态更新,基本原理是:
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8