Nacos技术与理论

Posted 健身小哒人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nacos技术与理论相关的知识,希望对你有一定的参考价值。


1.NamingService

registerInstance:注册实例。deregisterInstance:注销实例。getAllInstances:获取某一服务的所有实例。selectInstances:获取某一服务健康或不健康的实例。selectOneHealthyInstance:根据权重选择一个健康的实例。getServerStatus:检测服务端健康状态。subscribe:注册对某个服务的监听。unsubscribe:注销对某个服务的监听。getSubscribeServices:获取被监听的服务。getServicesOfServer:获取命名空间(namespace)下的所有服务名。【注:此方法有个小坑,参pageNo要从1开始】

2. NacosNamingService

NacosNamingServiceNamingService接口的实现类。实现了上面提到的那些方法。此外,NacosNamingService还起到了初始化其他核心类的作用,因为对外提供的方法都是委托给其他核心类处理的。按顺序将依次初始化EventDispatcherNamingProxyBeatReactorHostReactorNacosNamingService的构造函数我们也可以了解到,可以进行一些参数的自定义,总结如下(部分概念的含义可参考官方文档

3.EventDispatcher

EventDispatcher与其他事件分发的组件没什么不同,用于处理subscribeunsubscribe等等与服务监听相关的方法,并分发NamingEvent到各Listener成员变量ConcurrentMap<String, List> observerMap保存了注册的Listenerkey{服务名}@@{集群}value为各个EventListener的列表。EventDispatcher会启动1个名为com.alibaba.nacos.naming.client.listener的线程用于处理事件的分发。注意点:分发NamingEvent时,按照subscribe(…)方法的调用顺序串行依次调用EventListeneronEvent(…)方法。调用subscribe(…)方法会引起对应Service的事件分发。

4. NamingProxy

5. BeatReactor

BeatReactor用于向Nacos服务端发送已注册服务的心跳。成员变量Map<String, BeatInfo> dom2Beat中保存了需要发送的BeatInfokey{serviceName}#{ip}#{port}value为对应的BeatInfoBeatReactor会启动名为com.alibaba.nacos.naming.beat.sender的线程来发送心跳,默认线程数为1~CPU核心数的一半,可由namingClientBeatThreadCount参数指定。默认情况下每5发送一次心跳,可根据Nacos服务端返回的clientBeatInterval的值调整心跳间隔。注意点:0.8版本有一个小bug,客户端心跳间隔并不受服务端返回值的控制。我已提交PR,预计将在0.9版本修复。

6. HostReactor

Method URI 含义POST /nacos/v1/ns/instance 注册实例DELETE /nacos/v1/ns/instance 注销实例GET /nacos/v1/ns/instance/list 获取实例列表PUT /nacos/v1/ns/instance/beat 发送心跳GET /nacos/v1/ns/api/hello Nacos服务端状态GET /nacos/v1/ns/service/list 获取所有服务名HostReactor用于获取、保存、更新各Service实例信息。成员变量Map<String, ServiceInfo> serviceInfoMap中保存了已获取到的服务的信息,key{服务}@@{集群名}HostReactor会启动名为com.alibaba.nacos.client.naming.updater的线程来更新服务信息,默认线程数为1~CPU核心数的一半,可由namingPollingThreadCount参数指定。定时任务UpdateTask会根据服务的cacheMillis值定时更新服务信息,默认值为10。该定时任务会在获取某一服务信息时创建,保存在成员变量Map<String, ScheduledFuture<?>> futureMap中。

7. 其他

7.1 PushReceiver

PushReceiver用于接收Nacos服务端的推送,初始化时会创建DatagramSocket使用UDP的方式接收推送。会启动1个名为com.alibaba.nacos.naming.push.receiver的线程。

7.2 FailoverReactor

用于故障转移,会启动1个名为com.alibaba.nacos.naming.failover的线程并定时读取名为00-00—000-VIPSRV_FAILOVER_SWITCH-000—00-00的文件,内容为1时表示开启,此时获取服务信息时会返FailoverReactor缓存的服务信息。

7.3 Balancer

根据服务实例的权重挑选一个实例,实现简单的负载均衡。

7.4 DiskCache

用于服务信息的持久化。

8. Naming API

API汇总如下:


参数列表及示例

注册实例

注销实例

请求示例:http://localhost:8848/nacos/v1/ns/instance?cluster=DEFAULT&serviceName=nacos.test.3&encoding=UTF-8&namespaceId=public&port=9999&ip=2.2.2.2&返回示例:ok

获取实例列表

发送心跳

BeatInfo对象结构如下,与Instance对象类似:key 含义 备注namespaceId 命名空间 默认为publickey 含义 备注namespaceId 命名空间 默认为publicpageNo 页码 注意从1开始pageSize 返回数量selector 过滤器请求示例:http://localhost:8848/nacos/v1/ns/instance/beat?beat=%7B%22cluster%22%3A%22DEFAULT%22%2C%22ip%22%3A%222.2.2.2%22%2C%22metadata%22%3A%7B%7D%2C%22port%22%3A9999%2C%22scheduled%22%3Atrue%2C%22serviceName%22%3A%22nacos.test.3%22%2C%22weight%22%3A1.0%7D&serviceName=nacos.test.3&encoding=UTF-8&namespaceId=public&返回示例:{“clientBeatInterval”:5000}

Nacos服务端状态

请求示例:http://localhost:8848/nacos/v1/ns/api/hello?encoding=UTF-8&namespaceId=public&返回示例:{“msg”:”Hello! I am Nacos-Naming and healthy! total services: raft 2, local port:8848”}

获取所有服务名

请求示例:http://localhost:8848/nacos/v1/ns/service/list?pageSize=100&encoding=UTF-8&namespaceId=public&pageNo=0&返回示例:{“count”:1,”doms”:[“nacos.test.3”]}优雅停止服务

curl -X POST -u http://IP:Port/actuator/shutdown

以上是关于Nacos技术与理论的主要内容,如果未能解决你的问题,请参考以下文章

Alibaba中间件技术系列「Nacos技术专题」服务注册与发现相关的原理分析

Nacos,Eureka与ZooKeeper的比较

nacos的一致性协议distro介绍

SpringBoot使用Nacos进行服务注册发现与配置管理

3.Nacos服务整合SpringBoot框架技术

zk与eureka比较