• 🏆【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

  • 相关阅读:
    bzoj1379 [Baltic2001]Postman
    bzoj1116 [POI2008]CLO
    bzoj1734 [Usaco2005 feb]Aggressive cows 愤怒的牛
    tyvj1086 Elevator
    2014.7.8模拟赛【聪明的打字员】
    2014.7.8模拟赛【笨笨当粉刷匠】|bzoj1296 [SCOI]粉刷匠
    2014.7.8模拟赛【笨笨的电话网络】
    2014.7.8模拟赛【词编码】
    bzoj1854 [Scoi2010]游戏
    2014.7.7 模拟赛【小K的农场】
  • 原文地址:https://www.cnblogs.com/liboware/p/15834127.html
Copyright © 2020-2023  润新知