Nacos服务注册与发现原理分析
Nacos 另⼀个⾮常重要的特性就是服务注册与发现,说到服务的注册与发现相信⼤家应该都不陌⽣,在微服务盛⾏的今天,服务是⾮常重要的,⽽在 Nacos 中服务更被称为他的⼀等公民。
Nacos ⽀持⼏乎所有主流类型的 “服务” 的发现、配置和管理。
了解过 Dubbo 的同学,应该对 Dubbo 的架构⾮常熟悉,最经典的⼀张架构图如下所⽰:
dubbo-arch.jpg
图中的6个步骤的含义解释如下:
0、服务容器负责启动,加载,运⾏服务提供者。
1、服务提供者在启动时,向注册中⼼注册⾃⼰提供的服务。
2、服务消费者在启动时,向注册中⼼订阅⾃⼰所需的服务。
3、注册中⼼返回服务提供者地址列表给消费者,如果有变更,注册中⼼将基于长连接推送变更数据给消费者。
4、服务消费者,从提供者地址列表中,基于软负载均衡算法,选⼀台提供者进⾏调⽤,如果调⽤失败,再选另⼀台调⽤。
5、服务消费者和提供者,在内存中累计调⽤次数和调⽤时间,定时每分钟发送⼀次统计数据到监控中⼼。
其中图中最上⽅的 Registry 就是注册中⼼,负责服务的注册与发现。Dubbo 有⾃⼰的 Registry 实现,⽽ Nacos 则是另⼀种 Registry 的实现。
现在我们来了解下 Nacos 的服务注册与发现,⾸先在本地将 Nacos 服务端启动起来,具体怎么操作这⾥不在赘述,不清楚的同学可以参考我的其他⽂章。
模拟服务注册
我们模拟将同⼀个服务的两个实例注册到 Nacos 中,代码如下图所⽰:
service-provider.jpg
通过 NamingService 接⼝的 registerInstance ⽅法就可以将服务进⾏注册了,该⽅法有很多重载的⽅法,这⾥我们选择⼀个简单的来调⽤就好了。
注册完成后,通过调⽤ getAllInstances ⽅法,⽴即获取所有可⽤的实例,然后让主线程等待,打印如下:
service-provider-effect.jpg
从打印结果中可以发现 naming 客户端成功获取到了两个实例。
模拟服务发现
服务注册之后,服务的消费者就可以向注册中⼼订阅⾃⼰所需要的服务了,注册中⼼会将所有服务的实例“推送”给消费者,这⾥我在推送上打了引号,原因是实际上获取服务是客户端主动轮询的,跟客户端获取配置中⼼的配置项的原理⼀样。这⾥不进⾏具体的描述,有兴趣的可以跟⼀下代码就知道了。
现在我创建⼀个服务消费者,然后向注册中⼼订阅⼀个服务,当接收到注册中⼼返回的服务列表之后,执⾏5次 select 服务实例的操作,相当于进⾏⼀个模拟的服务请求,具体的代码如下图所⽰:
service-consumer.jpg
其中的 printInstances ⽅法主要是打印出所有服务的实例,为了节省篇幅就不写出来了,将 ServiceConsumer 类启动之后,打印出如下的⽇志:
微服务注册中心有哪些service-consumer-effect.jpg
消费者每次获取⼀个健康的实例进⾏调⽤,接下来我就来分析下整个服务注册与发现的过程和⼤致的设计原理和思路。
服务如何注册
服务注册最重要的就是将服务注册到哪⾥,在注册中⼼服务端,肯定有⼀个⽤来管理服务的容器,他保存着所有服务的实例。
我们暂时不需要知道该容器具体的实现细节,只需要知道有这样⼀个概念。
nacos-registry-princple-1.jpg
nacos-registry-princple-2.jpg
nacos-registry-princple-3.jpg
nacos-registry-princple-4.jpg
服务如何发现
服务注册到注册中⼼后,服务的消费者就可以进⾏服务发现的流程了,消费者可以直接向注册中⼼发送获取某个服务实例的请求,这种情况下注册中⼼将返回所有可⽤的服务实例给消费者,但是⼀般不推荐这种情况。另⼀种⽅法就是服务的消费者向注册中⼼订阅某个服务,并提交⼀个,当注册中⼼中服务发⽣变更时,会收到通知,这时消费者更新本地的服务实例列表,以保证所有的服务均是可⽤的。
nacos-registry-princple-5.jpg
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论