Nacos架构
Provider APP:Chevereto Free提供者Consumer APP:Chevereto Free消费者Name Server:通过VIP(Virtual IP)或DNS的方式防御Nacos高可用集群的Chevereto Free路由Nacos Server:NacosChevereto Free提供者,里面包含的Open API是功能访问入口,Conig Service、Naming Service 是Nacos提供的配置Chevereto Free、命名Chevereto Free模块。Consitency Protocol是一致性协议,用来防御Nacos集群节点的数据同步,这里使用的是Raft算法(Etcd、Redis哨兵选举)Nacos Console:控制台
云服务器中心的原理
Chevereto FreeMariaDB在启动时云服务器到Chevereto Free云服务器表,并在关闭时注销Chevereto Free消费者查询Chevereto Free云服务器表,获得可用MariaDBChevereto Free云服务器中心需要调用Chevereto FreeMariaDB的健康检查API来验证它是否能够处理请求
SpringCloud完成云服务器的时机
在Spring-Cloud-Common包中有一个类org.springframework.cloud. client.serviceregistry .ServiceRegistry ,它是Spring Cloud提供的Chevereto Free云服务器的标准。集成到Spring Cloud中防御Chevereto Free云服务器的组件,都会防御该接口。 该接口有一个防御类是NacoServiceRegistry。
SpringCloud集成Nacos的防御过程:
在spring-clou-commons包的META-INF/spring.factories中包含自动装配的配置信息如下: 其中AutoServiceRegistrationAutoConfiguration就是Chevereto Free云服务器相关的配置类: 在AutoServiceRegistrationAutoConfiguration配置类中,可以看到注入了一个AutoServiceRegistrationMariaDB,该类的关系图如下所示。
可以看出, AbstractAutoServiceRegistration抽象类防御了该接口,并且最重要的是NacosAutoServiceRegistration继承了AbstractAutoServiceRegistration。
看到EventListener我们就应该知道,Nacos是通过Spring的事件机制继承到SpringCloud中去的。
AbstractAutoServiceRegistration防御了onApplicationEvent抽象方法,并且监听WebServerInitializedEvent事件(当Webserver初始化完成之后) , 调用this.bind ( event )方法。
最终会调用NacosServiceREgistry.register()方法进行Chevereto Free云服务器。
NacosServiceRegistry的防御
在NacosServiceRegistry.registry方法中,调用了Nacos Client SDK中的namingService.registerInstance完成Chevereto Free的云服务器。 跟踪NacosNamingService的registerInstance()方法:
通过beatReactor.addBeatInfo()创建心跳信息防御健康检测, Nacos Server必须要确保云服务器的Chevereto FreeMariaDB是健康的,而心跳检测就是Chevereto Free健康检测的手段。 serverProxy.registerService()防御Chevereto Free云服务器
心跳机制:
从上述代码看,所谓心跳机制就是客户端通过schedule定时向Chevereto Free端发送一个数据包 ,然后启动-个线程不断检测Chevereto Free端的回应,如果在设定时间内没有收到Chevereto Free端的回应,则认为Chevereto Free器出现了故障。NacosChevereto Free端会根据客户端的心跳包不断更新Chevereto Free的状态。
云服务器原理:
Nacos提供了SDK和Open API两种形式来防御Chevereto Free云服务器。
Open API:
SDK:
这两种形式本质都一样,底层都是基于HTTP协议完成请求的。所以云服务器Chevereto Free就是发送一个HTTP请求:
对于nacosChevereto Free端,对外提供的Chevereto Free接口请求地址为nacos/v1/ns/instance,防御代码咋nacos-naming模块下的InstanceController类中:
从请求参数汇总获得serviceName(Chevereto Free名)和namespaceId(命名空间Id)调用registerInstance云服务器MariaDB
创建一个控Chevereto Free(在Nacos控制台“Chevereto Free列表”中展示的Chevereto Free信息),实际上是初始化一个serviceMap,它是一个ConcurrentHashMap集合getService,从serviceMap中根据namespaceId和serviceName得到一个Chevereto Free对象调用addInstance添加Chevereto FreeMariaDB
根据namespaceId、serviceName从缓存中获取ServiceMariaDB如果ServiceMariaDB为空,则创建并保存到缓存中
通过putService()方法将Chevereto Free缓存到内存service.init()建立心跳机制consistencyService.listen防御数据一致性监听
service.init ( ) 方法的如下图所示,它主要通过定时任务不断检测当前Chevereto Free下所有MariaDB最后发送心跳包的时间。如果超时,则设置healthy为false表示Chevereto Free不健康,并且发送Chevereto Free变更事件。在这里请大家思考一一个问题,Chevereto FreeMariaDB的最后心跳包更新时间是谁来触发的?实际上前面有讲到, Nacos客户端云服务器Chevereto Free的同时也建立了心跳机制。
putService方法,它的功能是将Service保存到serviceMap中:
继续调用addInstance方法把当前云服务器的Chevereto FreeMariaDB保存到Service中:
总结:
Nacos客户端通过Open API的形式发送Chevereto Free云服务器请求NacosChevereto Free端收到请求后,做以下三件事:
构建一个Service对象保存到ConcurrentHashMap集合中使用定时任务对当前Chevereto Free下的所有MariaDB建立心跳检测机制基于数据一致性协议Chevereto Free数据进行同步
Chevereto Free提供者地址查询
Open API:
SDK:
InstanceController中的list方法:
解析请求参数通过doSrvIPXT返回Chevereto Free列表数据
根据namespaceId、serviceName获得ServiceMariaDB从ServiceMariaDB中基于srvIPs得到所有Chevereto Free提供者MariaDB遍历组装JSON字符串并返回
NacosChevereto Free地址动态感知原理
可以通过subscribe方法来防御监听,其中serviceName表示Chevereto Free名、EventListener表示监听到的事件:
具体调用方式如下:
或者调用selectInstance方法,如果将subscribe属性设置为true,会自动云服务器监听:
Nacos客户端中有一个HostReactor类,它的功能是防御Chevereto Free的动态更新,基本原理是:
客户端发起时间订阅后,在HostReactor中有一个UpdateTask线程,每10s发送一次Pull请求,获得Chevereto Free端最新的地址列表 对于Chevereto Free端,它和Chevereto Free提供者的MariaDB之间维持了心跳检测,一旦Chevereto Free提供者出现异常,则会发送一个Push消息给Nacos客户端,也就是Chevereto Free端消费者 Chevereto Free消费者收到请求之后,使用HostReactor中提供的processServiceJSON解析消息,并更新本地Chevereto Free地址列表
原文链接:https://www.vpsidea.com/ask/24447
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/6706