服务如何注册
服务注册最重要的就是将服务注册到哪里,在注册中心服务端,肯定有一个用来管理服务的容器,他保存着所有服务的实例。
我们暂时不需要知道该容器具体的实现细节,只需要知道有这样一个概念。
nacos-registry-princple-1.jpg
nacos-registry-princple-2.jpg
nacos-registry-princple-3.jpg
核心接口NameService,实现为NacosNamingService
1.服务提供者与注册中心维持心跳
2.调用reqAPI进行注册,继续调用callServer
3.本质上还是发送http的请求完成注册
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
服务如何发现
服务注册到注册中心后,服务的消费者就可以进行服务发现的流程了,消费者可以直接向注册中心发送获取某个服务实例的请求,这种情况下注册中心将返回所有可用的服务实例给消费者,但是一般不推荐这种情况。另一种方法就是服务的消费者向注册中心订阅某个服务,并提交一个监听器,当注册中心中服务发生变更时,监听器会收到通知,这时消费者更新本地的服务实例列表,以保证所有的服务均是可用的。
负载均衡
负载均衡有很多中实现方式,包括轮询法,随机方法法,对请求ip做hash后取模等等,从负载的维度考虑又分为:服务端负载均衡和客户端负载均衡。
Nacos 的客户端在获取到服务的完整实例列表后,会在客户端进行负载均衡算法来获取一个可用的实例,模式使用的是随机获取的方式。
Nacos 服务注册与订阅的完整流程
Nacos 客户端进行服务注册有两个部分组成,一个是将服务信息注册到服务端,另一个是向服务端发送心跳包,这两个操作都是通过 NamingProxy 和服务端进行数据交互的。
Nacos 客户端进行服务订阅时也有两部分组成,一个是不断从服务端查询可用服务实例的定时任务,另一个是不断从已变服务队列中取出服务并通知 EventListener 持有者的定时任务。
订阅者管理SubscribeManager,核心方法getSubscribers
从远程server同步数据,使用httpGet获取