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

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

时间:2022-11-27 15:02:09浏览次数:69  
标签:服务 Service 中间件 Nacos Alibaba 实例 注册 客户端

Nacos的概览

  • Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
  • Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
  • Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

背景介绍

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

​https://nacos.io/zh-cn/docs/what-is-nacos.html​

服务 (Service)

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

nacos的架构图所示

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

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

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

图中的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一样好用

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

Nacos 的服务注册与发现

服务提供方 (Service Provider)

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

模拟服务注册

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

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

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

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

  • 双注册模式注入进入

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

  • 维持服务在线状态

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

demo代码如下:

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

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

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

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

服务消费方 (Service Consumer)

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

Nacos消费服务机制

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

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

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

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

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

Nacos机制负载均衡

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

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

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

  • Nacos客户端进行服务注册有两个部分组成,一个是将服务信息注册到服务端,另一个是像服务端发送心跳包,这两个操作都是通过NamingProxy 和服务端进行数据交互的。
  • Nacos客户端进行服务订阅时也有两部分组成,一个是不断从服务端查询可用服务实例的定时任务,另一个是不断从已变服务队列中取出服务并通知 EventListener 持有者的定时任务,更新服务订阅列表。

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

标签:服务,Service,中间件,Nacos,Alibaba,实例,注册,客户端
From: https://blog.51cto.com/alex4dream/5890050

相关文章

  • 如何设计一个消息中间件? 消息中间件的总体架构
    MQ概念1.消息(Message)消息是MQ中最小的概念,本质上就是一段数据,它能被一个或者多个应用程序所理解,是应用程序之间传递的信息载体。2.队列(Queue)2.1本地队列本地队列按照功......
  • 【Spring Cloud实战】Spring Cloud Alibaba入门
    gitee地址:https://gitee.com/javaxiaobear/spring-cloud_study.git在线阅读地址:https://javaxiaobear.gitee.io/1、为什么会出现​​SpringCloudnetflix​​进入维护模式......
  • SpringBoot整合Alibaba-Dubbo和Apache-Dubbo
    目录1Alibaba整合Dubbo1.1服务提供者1.1.1服务提供者接口1.1.2服务提供者实现类1.1.2.1项目结构图1.1.2.2pom.xml1.1.2.3服务实现类1.1.2.4配置文件1.1.2.5启动类......
  • mac系统如何安装nacos
    一:安装步骤1、先到nacos官网nacos.iohttp://nacos.io/2、点击开源版(进去下拉文档,找到lateststablerelease点进去) 3、点击下载zip文件到本地  4、终端进入下......
  • SpringCloud Alibaba(一) - Nacos 服务注册与发现,OpenFeign远程调用
    1、基础项目过目介绍1.1数据库创建1.2项目模块分布1.3测试http接口调用1.3.1http接口调用配置类//http接口调用配置类@ConfigurationpublicclassRestTempla......
  • 【Java】java | springcloud-alibaba版本说明 | springboot对应版本
     ......
  • 【Java】 java | nacos | nacos使用注意事项
    一、说明        1、本文档总结nacos使用心得及日常遇到的问题        2、不涉及技术配置二、关于本地调试1、场景1:本地调试多个模块1)建议使用本地nacos2)......
  • 微服务之注册中心nacos
    Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。下载nacos压缩包,详情请见于nacos官方网站  https://nacos.io/zh......
  • 微服务+eureka+ribbon+nacos
     跨服务远程调用:配置Restemplate eureka注册中心:第一步引入依赖,第二步启动类加注解@EnableEurekaServer,第三步配置yml文件配置客户端添加依赖client客户端配置......
  • RabbitMQ中间件
    RabbitMQ导入依赖<!--集成RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></de......