
写点什么







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

作者:浩宇天尚
  • 2022 å¹´ 1 月 22 日
  • 本文字数:2827 字

    阅读完需:约 9 分钟

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

背景介绍

前几篇文章介绍了 Nacos 配置中心服务的能力机制,接下来,我们来介绍 Nacos 另一个非常重要的特性就是服务注册与发现,说到服务的注册与发现相信大家应该都不陌生,在微服务盛行的今天,服务是非常重要的,而在 Nacos 中服务更被称为他的一等公民。Nacos 支持几乎所有主流类型的 “服务” 的发现、配置和管理。

服务 (Service)

服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service。

nacos 的架构图所示

(dubbo) RPC 微服务的基础架构


图中的 6 个步骤的含义解释如下:


  1. 服务容器负责启动,加载,运行服务提供者。

  2. 服务提供者在启动时,向注册中心注册自己提供的服务。

  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。

  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

服务注册中心 (Service Registry)

上图中 Registry 就是注册中心,负责服务的注册与发现,Dubbo 服务体系之前使用 Zookeeper 或者自己的 Registry 实现,而 Nacos 则是另一种 Registry 的实现。


服务注册中心,它是服务,其实例及元数据的数据库(Dubbo3 已经将源数据中心、配置服务全部提取独立出来了),服务实例在启动时注册到服务注册表,并在关闭时注销。


服务和路由器的客户端查询服务注册表以查找服务的可用实例,服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。

服务元数据 (Service Metadata)

服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据。

逻辑架构及其组件介绍

  • 服务管理:实现服务 CRUD,域名 CRUD,服务健康状态检查,服务权重管理等功能

  • 配置管理:实现配置管 CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能

  • 元数据管理:提供元数据 CURD 和打标能力

  • 插件机制:实现三个模块可分可合能力,实现扩展点 SPI 机制

  • 事件机制:实现异步化事件通知,sdk 数据变化异步通知等逻辑

  • 日志模块:管理日志分类,日志级别,日志可移植性(尤其避免冲突),日志格式,异常码+帮助文档

  • 回调机制:sdk 通知数据,通过统一的模式回调用户处理。接口和数据结构需要具备可扩展性

  • 寻址模式:解决 ip,域名,nameserver、广播等多种寻址模式,需要可扩展

  • 推送通道:解决 server 与存储、server 间、server 与 sdk 间推送性能问题

  • 容量管理:管理每个租户,分组下的容量,防止存储被写爆,影响服务可用性

  • 流量管理:按照租户,分组等多个维度对请求频率,长链接个数,报文大小,请求流控进行控制

  • 缓存机制:容灾目录,本地缓存,server 缓存机制。容灾目录使用需要工具

  • 启动模式:按照单机模式,配置模式,服务模式,dns 模式,或者 all 模式,启动不同的程序+UI

  • 一致性协议:解决不同数据,不同一致性要求情况下,不同一致性机制

  • 存储模块:解决数据持久化、非持久化存储,解决数据分片问题

  • Nameserver:解决 namespace 到 clusterid 的路由问题,解决用户环境与 nacos 物理环境映射问题

  • CMDB:解决元数据存储,与三方 cmdb 系统对接问题,解决应用,人,资源关系

  • Metrics:暴露标准 metrics 数据,方便与三方监控系统打通

  • Trace:暴露标准 trace,方便与 SLA 系统打通,日志白平化,推送轨迹等能力,并且可以和计量计费系统打通

  • 接入管理:相当于阿里云开通服务,分配身份、容量、权限过程

  • 用户管理:解决用户管理,登录,sso 等问题

  • 权限管理:解决身份识别,访问控制,角色管理等问题

  • 审计系统:扩展接口方便与不同公司审计系统打通

  • 通知系统:核心数据变更,或者操作,方便通过 SMS 系统打通,通知到对应人数据变更

  • OpenAPI:暴露标准 Rest 风格 HTTP 接口,简单易用,方便多语言集成

  • Console:易用控制台,做服务管理、配置管理等操作

  • SDK:多语言 sdk

  • Agent:dns-f 类似模式,或者与 mesh 等方案集成

  • CLI:命令行对产品进行轻量化管理,像 git 一样好用


Nacos 的服务注册与发现

服务提供方 (Service Provider)

是指提供可复用和可调用服务的应用方。

模拟服务注册

服务注册最重要的就是将服务注册到哪里,在注册中心服务端,肯定有一个用来管理服务的容器,他保存着所有服务的实例。不需要知道该容器具体的实现细节,只需要知道有这样一个概念。



  • 将同一个服务的两个实例注册到 Nacos 中:



  • 双注册模式注入进入



  • 维持服务在线状态



demo 代码如下:



通过 NamingService 接口的 registerInstance 方法就可以将服务进行注册了,该方法有很多重载的方法,这里我们选择一个简单的来调用就好了。注册完成后,通过调用 getAllInstances 方法,立即获取所有可用的实例,然后让主线程等待,打印如下:



可以发现 naming 客户端成功获取到了两个实例。

服务消费方 (Service Consumer)

服务注册到注册中心后,服务的消费者就可以进行服务发现的流程了,消费者可以直接向注册中心发送获取某个服务实例的请求,这种情况下注册中心将返回所有可用的服务实例给消费者,但是一般不推荐这种情况。另一种方法就是服务的消费者向注册中心订阅某个服务,并提交一个监听器,当注册中心中服务发生变更时,监听器会收到通知,这时消费者更新本地的服务实例列表,以保证所有的服务均是可用的。

Nacos 消费服务机制

是指会发起对某个服务调用的应用方。服务注册之后,服务的消费者就可以向注册中心订阅自己所需要的服务了,注册中心会将所有服务的实例“推送”给消费者,实际上获取服务是客户端主动轮询的,跟客户端获取配置中心的配置项的原理一样。


现在我创建一个服务消费者,然后向注册中心订阅一个服务,当接收到注册中心返回的服务列表之后,执行 5 次 select 服务实例的操作,相当于进行一个模拟的服务请求,具体的代码如下图所示:



其中的 printInstances 方法主要是打印出所有服务的实例,将 ServiceConsumer 类启动之后,打印出如下的日志:


Nacos 机制负载均衡

负载均衡有很多中实现方式,包括轮询法,随机方法法,对请求 ip 做 hash 后取模等等,从负载的维度考虑又分为:服务端负载均衡和客户端负载均衡。Nacos 的客户端在获取到服务的完整实例列表后,会在客户端进行负载均衡算法来获取一个可用的实例,模式使用的是随机获取的方式。


Nacos 服务注册与订阅的完整流程

  • Nacos 客户端进行服务注册有两个部分组成,一个是将服务信息注册到服务端,另一个是像服务端发送心跳包,这两个操作都是通过 NamingProxy 和服务端进行数据交互的。

  • Nacos 客户端进行服务订阅时也有两部分组成,一个是不断从服务端查询可用服务实例的定时任务,另一个是不断从已变服务队列中取出服务并通知 EventListener 持有者的定时任务,更新服务订阅列表。


参考资料

https://nacos.io/zh-cn/docs/feature-list.html

发布于: 刚刚阅读数: 3
用户头像

浩宇天尚

关注

🏆InfoQ写作平台-签约作者🏆 2020.03.25 加入

【个人简介】酷爱计算机科学、醉心编程技术、喜爱健身运动、热衷悬疑推理的“极客达人” 【技术格言】任何足够先进的技术都与魔法无异 【技术范畴】Java领域、Spring生态、MySQL专项、微服务/分布式体系和算法设计等







评论

发布
暂无评论
🏆【Alibaba中间件技术系列】「Nacos技术专题」服务注册与发现相关的原理分析