宝剑锋从磨砺出,梅花香自苦寒来。这篇文章主要讲述Alibaba中间件技术系列「Nacos技术专题」服务注册与发现相关的原理分析相关的知识,希望能为你提供帮助。
背景介绍
前几篇文章介绍了Nacos配置中心服务的能力机制,接下来,我们来介绍Nacos另一个非常重要的特性就是服务注册与发现,说到服务的注册与发现相信大家应该都不陌生,在微服务盛行的今天,服务是非常重要的,而在 Nacos 中服务更被称为他的一等公民。Nacos 支持几乎所有主流类型的 “服务” 的发现、配置和管理。
服务 (Service)
服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service。
nacos的架构图所示
(dubbo) RPC微服务的基础架构
图中的6个步骤的含义解释如下:
服务注册中心 (Service Registry)上图中Registry就是注册中心,负责服务的注册与发现,Dubbo服务体系之前使用Zookeeper或者自己的Registry 实现,而 Nacos 则是另一种 Registry的实现。
服务注册中心,它是服务,其实例及元数据的数据库(Dubbo3已经将源数据中心、配置服务全部提取独立出来了),服务实例在启动时注册到服务注册表,并在关闭时注销。
服务和路由器的客户端查询服务注册表以查找服务的可用实例,服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。
服务元数据 (Service Metadata)服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据。
逻辑架构及其组件介绍
Nacos 的服务注册与发现
服务提供方 (Service Provider)【Alibaba中间件技术系列「Nacos技术专题」服务注册与发现相关的原理分析】是指提供可复用和可调用服务的应用方。
模拟服务注册服务注册最重要的就是将服务注册到哪里,在注册中心服务端,肯定有一个用来管理服务的容器,他保存着所有服务的实例。不需要知道该容器具体的实现细节,只需要知道有这样一个概念。
demo代码如下:
通过 NamingService 接口的 registerInstance 方法就可以将服务进行注册了,该方法有很多重载的方法,这里我们选择一个简单的来调用就好了。注册完成后,通过调用 getAllInstances 方法,立即获取所有可用的实例,然后让主线程等待,打印如下:
可以发现naming客户端成功获取到了两个实例。
服务消费方 (Service Consumer)服务注册到注册中心后,服务的消费者就可以进行服务发现的流程了,消费者可以直接向注册中心发送获取某个服务实例的请求,这种情况下注册中心将返回所有可用的服务实例给消费者,但是一般不推荐这种情况。另一种方法就是服务的消费者向注册中心订阅某个服务,并提交一个监听器,当注册中心中服务发生变更时,监听器会收到通知,这时消费者更新本地的服务实例列表,以保证所有的服务均是可用的。
Nacos消费服务机制是指会发起对某个服务调用的应用方。服务注册之后,服务的消费者就可以向注册中心订阅自己所需要的服务了,注册中心会将所有服务的实例“推送”给消费者,实际上获取服务是客户端主动轮询的,跟客户端获取配置中心的配置项的原理一样。
现在我创建一个服务消费者,然后向注册中心订阅一个服务,当接收到注册中心返回的服务列表之后,执行5次 select 服务实例的操作,相当于进行一个模拟的服务请求,具体的代码如下图所示:
其中的 printInstances 方法主要是打印出所有服务的实例,将 ServiceConsumer 类启动之后,打印出如下的日志:
Nacos机制负载均衡负载均衡有很多中实现方式,包括轮询法,随机方法法,对请求ip做hash后取模等等,从负载的维度考虑又分为:服务端负载均衡和客户端负载均衡。Nacos 的客户端在获取到服务的完整实例列表后,会在客户端进行负载均衡算法来获取一个可用的实例,模式使用的是随机获取的方式。
Nacos 服务注册与订阅的完整流程
参考资料
?https://nacos.io/zh-cn/docs/feature-list.html">
??https://nacos.io/zh-cn/docs/feature-list.html???
推荐阅读
- #yyds干货盘点#Python图像处理,cv2模块,OpenCV实现目标跟踪
- 开源远程终端神器Tabby安装设置
- 鸿蒙轻内核M核源码分析(LibC实现之Musl LibC)
- redis 操作zset 有序集合常用命令
- 第九周学习作业
- redis 集合 set操作命令
- WebAssembly环境解析
- redis 哈希 hash 常用操作
- docker-容器镜像(容器中的文件系统)