Dubbo使用nacos作为注册中心原理剖析

2023-11-08

Nacos是阿里自研的,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台 。作为微服务注册中心,它的目标是淘汰目前流行的eureka,zookeeper,consul等组件。现在学习它真的很有必要。这里就还是从源码的角度出发,看一下Spring Boot是如何和它整合的。

详细教程官网已经写的非常明确,这里就不多说了。
Nacos中文官方文档
下载nacos

项目版本:

组件 版本
spring-boot 2.3.1.RELEASE
dubbo 2.7.7.RELEASE
nacos-server 1.3.0

下载好nacos-server运行包解压后启动(官方有详细文档),这里就不详细说明了。
它的默认端口号是8848 ,这是珠峰的高度,这也表明nacos的志向,要达到珠峰的高度,超高其他同类的产品

Nacos官方文档
架构图:
在这里插入图片描述

nacos既可以作为服务注册中心 (Service Registry)。也可以作为配置中心(Configuration Management),本文只讨论作为注册中心的实现原理。

既然作为注册中心,当然有必不可少的两个角色,service provider 和service consumer 。它们的主要的工作流程如下:
在这里插入图片描述
其实目前的微服务架构都是这样的工作,dubbo也是如此。

dubbo使用nacos作为注册中心,需要在原有dubbo项目基础上添加如下依赖:

<dependency>
   <groupId>org.apache.dubbo</groupId>
   <artifactId>dubbo-registry-nacos</artifactId>
   <version>${dubbo.version}</version>
</dependency>

然后将注册中心配置改为如下:

## 其他属性保持不变

## Nacos registry address
dubbo.registry.address = nacos://10.20.153.10:8848
##如果要使用自己创建的命名空间可以使用下面2种方式
#dubbo.registry.address = nacos://10.20.153.10:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932
#dubbo.registry.parameters.namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932
...

这里推荐注册时添加nacos的命名空间

这样配置后,重启服务,就能让dubbo的provider和consumer的信息都注册到nacos对应的命名空间下。
如下所示:
在这里插入图片描述
dubbo是支持多种注册中心的。对于注册中心。dubbo也同样提供了一个SPI接口:

org.apache.dubbo.registry.RegistryFactory

下面来看RegistryFactory :

@SPI("dubbo")
public interface RegistryFactory {

    /**
     * Connect to the registry
     * <p>
     * Connecting the registry needs to support the contract: <br>
     * 1. When the check=false is set, the connection is not checked, otherwise the exception is thrown when disconnection <br>
     * 2. Support username:password authority authentication on URL.<br>
     * 3. Support the backup=10.20.153.10 candidate registry cluster address.<br>
     * 4. Support file=registry.cache local disk file cache.<br>
     * 5. Support the timeout=1000 request timeout setting.<br>
     * 6. Support session=60000 session timeout or expiration settings.<br>
     *
     * @param url Registry address, is not allowed to be empty
     * @return Registry reference, never return empty value
     */
    @Adaptive({"protocol"})
    Registry getRegistry(URL url);

}

RegistryFactory是一个SPI接口,并且提供一个Adaptive接口。用于获取Registry实例。@SPI中指定了默认实现名是dubbo ,且getRegistry方法对于的自适应实现是protocol .用于创建一个Registry实例。

但是在使用nacos作为注册中心时。会将nacos作为RegistryFactory的默认实现。因此需要从SPI配置文件中去找nacos对应的RegistryFactory实现。

META-INF\dubbo\internal\org.apache.dubbo.registry.RegistryFactory配置文件:

service-discovery-registry=org.apache.dubbo.registry.client.ServiceDiscoveryRegistryFactory
wrapper=org.apache.dubbo.registry.RegistryFactoryWrapper
dubbo=org.apache.dubbo.registry.dubbo.DubboRegistryFactory
multicast=org.apache.dubbo.registry.multicast.MulticastRegistryFactory
zookeeper=org.apache.dubbo.registry.zookeeper.ZookeeperRegistryFactory
redis=org.apache.dubbo.registry.redis.RedisRegistryFactory
consul=org.apache.dubbo.registry.consul.ConsulRegistryFactory

etcd3=org.apache.dubbo.registry.etcd.EtcdRegistryFactory
nacos=org.apache.dubbo.registry.nacos.NacosRegistryFactory
sofa=org.apache.dubbo.registry.sofa.SofaRegistryFactory
multiple=org.apache.dubbo.registry.multiple.MultipleRegistryFactory

因此可以看到。org.apache.dubbo.registry.nacos.NacosRegistryFactory将作为RegistryFactory的实现。来看其源码:
在这里插入图片描述

public class NacosRegistryFactory extends AbstractRegistryFactory {

    @Override
    protected String createRegistryCacheKey(URL url) {
        return url.toFullString();
    }

    @Override
    protected Registry createRegistry(URL url) {
        return new NacosRegistry(url, createNamingService(url));
    }
}

从这里引出核心类NacosRegistry ,结构图如下:

在这里插入图片描述

顶层接口是dubbo的RegistryService,它定义了服务的注册到发现的5个基本接口:

public interface RegistryService { // Registry extends RegistryService 
    /**
     * 注册服务.
     * 
     * 注册需处理契约:<br>
     * 1. 当URL设置了check=false时,注册失败后不报错,在后台定时重试,否则抛出异常。<br>
     * 2. 当URL设置了dynamic=false参数,则需持久存储,否则,当注册者出现断电等情况异常退出时,需自动删除。<br>
     * 3. 当URL设置了category=overrides时,表示分类存储,缺省类别为providers,可按分类部分通知数据。<br>
     * 4. 当注册中心重启,网络抖动,不能丢失数据,包括断线自动删除数据。<br>
     * 5. 允许URI相同但参数不同的URL并存,不能覆盖。<br>
     * 
     * @param url 注册信息,不允许为空,如:dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     */
    void register(URL url);
 
    /**
     * 取消注册服务.
     * 
     * 取消注册需处理契约:<br>
     * 1. 如果是dynamic=false的持久存储数据,找不到注册数据,则抛IllegalStateException,否则忽略。<br>
     * 2. 按全URL匹配取消注册。<br>
     * 
     * @param url 注册信息,不允许为空,如:dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     */
    void unregister(URL url);
 
    /**
     * 订阅服务.
     * 
     * 订阅需处理契约:<br>
     * 1. 当URL设置了check=false时,订阅失败后不报错,在后台定时重试。<br>
     * 2. 当URL设置了category=overrides,只通知指定分类的数据,多个分类用逗号分隔,并允许星号通配,表示订阅所有分类数据。<br>
     * 3. 允许以interface,group,version,classifier作为条件查询,如:interface=com.alibaba.foo.BarService&version=1.0.0<br>
     * 4. 并且查询条件允许星号通配,订阅所有接口的所有分组的所有版本,或:interface=*&group=*&version=*&classifier=*<br>
     * 5. 当注册中心重启,网络抖动,需自动恢复订阅请求。<br>
     * 6. 允许URI相同但参数不同的URL并存,不能覆盖。<br>
     * 7. 必须阻塞订阅过程,等第一次通知完后再返回。<br>
     * 
     * @param url 订阅条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     * @param listener 变更事件监听器,不允许为空
     */
    void subscribe(URL url, NotifyListener listener);
 
    /**
     * 取消订阅服务.
     * 
     * 取消订阅需处理契约:<br>
     * 1. 如果没有订阅,直接忽略。<br>
     * 2. 按全URL匹配取消订阅。<br>
     * 
     * @param url 订阅条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     * @param listener 变更事件监听器,不允许为空
     */
    void unsubscribe(URL url, NotifyListener listener);
 
    /**
     * 查询注册列表,与订阅的推模式相对应,这里为拉模式,只返回一次结果。
     * 
     * @see org.apache.dubbo.registry.NotifyListener#notify(List)
     * @param url 查询条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     * @return 已注册信息列表,可能为空,含义同{@link org.apache.dubbo.registry.NotifyListener#notify(List<URL>)}的参数。
     */
    List<URL> lookup(URL url);
 
}

然后,构造NacosRegistryService时需要两个必须参数:
① dubbo中的URL对象
URL在我往期的dubbo文章中有介绍,这里就不在
② nacos中的名字服务 (Naming Service)
NacosNamingService是默认实现。它提供分布式系统中所有对象(Object)、实体(Entity)的“名字”到关联的元数据之间的映射管理服务。
例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服务发现和 DNS 就是名字服务的2大场景。

NacosRegistryService相当于一个适配器。dubbo服务的注册与发现的具体实现都是使用NacosNamingService来实现。

具体实现逻辑涉及到了ScheduledExecutorService,HashedWheelTimer,以及一些nacos对外的API接口操作(nacos官网有详细介绍)。服务注册的大致流程已经说清楚了。详细逻辑比较复杂。有兴趣的可以去研究源码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dubbo使用nacos作为注册中心原理剖析 的相关文章

  • 什么是分而治之?

    分而治之 从语文上来说 有两个意思 1 分别治理 2 利用手段使国家 民族或宗教等产生分裂 然后对其进行控制和统治 而从软件工程来看 是一种方法 是有效算法设计中普遍采用的一种技术 所谓 分而治之 就是把一个复杂的算法问题按一定的 分解 方
  • 动力节点Spring Boot3项目版实战教程,学练一体,轻松掌握

    Spring Boot 3是一个非常令人期待的版本 将进一步扩大Spring Boot框架在应用程序开发领域的影响力 并带来更加出色的开发体验 Spring Boot 3的推出 带来个更多的新特性和功能 也为开发人员提供更高效 更优秀的开发
  • 中医四诊之五音 --详解

    from 老中医 LaoZY cn 医家箴言 肝呼应角 心言应徵 脾歌应宫 肺哭应商 肾呻应羽 五脏五声 以合五音 素问 阴阳应象大论 曰 视喘息 听音声 而知所苦 盖病苦于中 声发于外 有不可诬者也 故 难经 六十一难 曰 闻其五音以别其
  • Django rest_framework开发一组RESTFUL标准接口[ModelSerializer+GenericAPIView]

    Django rest framework开发一组RESTFUL标准接口 ModelSerializer GenericAPIView 不管何等复杂的业务逻辑 不管何等高效的开发框架 对后端来说最终都要落到对具体的某一个关系模型的增删改查上
  • 各类文件对应Content-Type

    两种初始化Map常量 1 new HashMap 2 static 静态代码块 static Map
  • 微信小程序:心跳动画

    封装工具类 var app getApp module exports animationMiddleHeaderItem animationMiddleHeaderItem 心跳动画 平移动画 function animationMidd
  • linux部署jenkins报错:ModuleNotFoundError: No module named ‘XXX‘已解决

    项目场景 实现接口自动化python jenkins allure 部署环境 linux中部署jenkins容器 容器需安装jdk python环境 python脚本 放入jenkins容器中 allure 安装在容器中 jenkins配置
  • JS逆向 -- 开发者工具介绍

    一 打开方式 1 通过快捷键F12 2 通过浏览器设置打开 二 常用的功能 1 元素 显示前端的相关东西 2 控制台 可以动态获取某些变量的值 比如获取当前页面的cookie值 3 源代码 动态调试的时候用到 可以下断点查看堆栈等相关操作
  • Python3,19行代码,我把她的照片写入到Excel中,2022年伊始,她终于被我感动了。

    19行代码 把图片写到如excel 1 引言 2 代码实战 2 1 思路 2 2 文件准备 2 3 实战 2 3 1 安装 2 3 2 代码实战 3 总结 1 引言 小屌丝 鱼哥 新年快乐 小鱼 新年快乐 小屌丝 虽然是元旦 但是也算是迈入
  • Python 安装第三方库详解(含离线)

    文章目录 1 Python 在线安装第三方库 1 1 在 cmd 中运行 pip install xx 1 2 在 Pycharm 中安装 2 Python 离线安装第三方库 2 1 从官方库下载 1 Python 在线安装第三方库 1 1
  • 深度学习图像增强---python库imgaug

    图像增强python库imgaug landmark 增强 segmentation 增强 imgaug用来做图像增强的一个python库 1 图像增强是在小样本以及提高模型泛化能力的通常采用的措施 下面总结一下我之前用到过的一些内容 la
  • 虚拟机网卡不见了

    有的时候不知道为什么虚拟机就是不能上网 郁闷 排除了虚拟机网卡被禁用之类的原因的话 看下系统时间 如果没有跟物理机器时间一致 改成一样试试看
  • DBA典型的工作职责

    下面不是全部列表 但是包括了DBA的典型职责 把监视数据库实例当作每日必做工作以保证其可用性 解决不可用的问题 收集系统统计和性能信息以便定向和配置分析 配置和调整数据库实例以便在应用程序特定要求下达到最佳性能 分析和管理数据库安全性 控制
  • diff和patch使用指南

    diff和patch是一对工具 在数学上来说 diff是对两个集合的差运算 patch是对两个集合的和运算 diff比较两个文件或文件集合的差异 并记录下来 生成一个diff文件 这也是我们常说的patch文件 即补丁文件 patch能将d
  • 苹果手机忘记密码锁屏了怎么办,有什么处理方法可解

    我们平时用手机 不管什么牌子的手机 都会设置锁屏密码 是为更好的保护自己的隐私信息 但人有时候就是会犯这样的蠢事 蠢到自己都想哭 就是忘记锁屏密码 手机打不开 要是遇到什么急事 真的是快被自己气死 以苹果手机为例 那接下来由小编分享苹果手机
  • Prometheus(五)——PromQL介绍

    这里写自定义目录标题 PromQL介绍 基本用法 查询时间序列 完全匹配 正则匹配 范围查询 时间位移操作 使用聚合操作 标量和字符串 标量 Scaler 字符串 合法的PromQL表达式 合法规则 标签名称的表达 PromQL操作符 数学
  • tq210-uboot spl 和 stage 2 启动

    将OK210的代码稍微改了改 如下 1 mem初始化更改 因为ok210为512M 而tq210为1G内存 2 ok210使用串口0为debug 口 3 ok210的sd卡在通道0上 主要是利用SD卡启动 SOC首先读取SD的SPL部分到s
  • Mybatis中关于返回值的问题

    Mybatis中关于返回值的问题 结论 在Mybatis的xml中 可以使用resultType 来指定其返回值的类型 但如果sql语句执行的结果为空 则会返回null 问题描述 在写Mybatis中的select语句 因为查找的条件 很有
  • 11.全志H3-AD使用记录

    上面是我的微信和QQ群 欢迎新朋友的加入 修改PCB默认字体 网上大多数教程都是改这里 我的操作是这个default里面 从头找到尾 凡是丝印层的 全改成自己想要的字体 原理图选中之后 PCB没有变化
  • 华清 c++ day5 9月12

    ifndef HOMEWORK H define HOMEWORK H include

随机推荐

  • 分治法( Divide and Conquer)

    分治法也称为分解法 分治策略等 分治法算法思想如下 1 将一个问题划分为同一类型的若干子问题 子问题最好规模相同 2 对这些子问题求解 一般使用递归方法 但在问题规模足够小时 有时也会利用另一个算法 3 有必要的话 合并这些子问题的解 以得
  • 《算法零基础100讲》 最值算法

    题目1 题目链接 int findMaxConsecutiveOnes int nums int numsSize int cnt 0 int max 0 for int i 0 i
  • Java项目校园兼职平台(含代码)

    一 项目分析 1 本平台根据角色定位不同有不同的模块 首先系统有一个登录注册模块 属于兼职人员的模块有个人信息管理和兼职申请 属于管理员的模块有基本信息维护 兼职信息投放和系统管理 2 平台登录注册 用户可以通过账号密码登录平台 如果用户是
  • error: You have not concluded your merge (MERGE_HEAD exists).git拉取失败

    拉取git上的更新时出现错误如下 error You have not concluded your merge MERGE HEAD exists hint Please commit your changes before mergin
  • 何为PostgreSQL?

    PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES 版本 4 2为基础的对象关系型数据库管理系统 ORDBMS POSTGRES 领先的许多概念在很久以后才出现在一些商业数据库系统中 PostgreSQL是最初的伯克利
  • OculusRiftS与Unity.UI的交互(6)-播放视频

    1 在Hierarchy空白处点右键 gt CreateEmpty 创建出一个空节点 并命名为Video 2 在这个Video的Inspector中 点击AddComponent 添加组件 VideoPlayer 添加完成后 将视频素材拖入
  • npm构建脚本_NPM脚本简介

    npm构建脚本 by Mohammed Ajmal Siddiqui 由Mohammed Ajmal Siddiqui NPM脚本简介 Introduction to NPM Scripts NPM scripts are among my
  • 享元模式详解

    享元模式 即共享元素 主要用于减少创建对象的数量以减少系统的复杂度 应用实例有池技术如数据库连接池 线程池等 享元模式尝试重用现有的同类对象 如果未找到匹配的对象 则创建新对象 比如说你有通过单车出行的需求 正好有共享单车来满足你的需求 这
  • Linux磁盘空间占满,但搜不到大文件

    使用 df h 查看磁盘空间 使用 du sh 查看每个目录的大小 经过查看没有发现任何大的文件夹 继续下面的步骤 如果您的Linux磁盘已满 但是通过 du sh 找不到大文件 可能是因为有一些进程正在写入磁盘 但是这些文件已经被删除 但
  • JDK8 学习笔记

    JDK7 try catch 支持处理多异常 try catch Exc Exc 一个catch 捕获多个异常 字节码文件跟小 数字类型 支持下划线 int num 123 345 float num2 222 33F long num3
  • 根据三角形的三条边长(长、中、短三条边),来判断三角形类型

    根据三角形的三条边长 长 中 短三条边 来判断三角形类型 注意 1 一个三角形的边应该都为正数 2 一个三角形的边都应该满足三角形条件 两边之和大于第三边 如果有两边的平方和比第三边的平方小 它就是钝角三角形 比如 a a b b
  • nginx+tomcat配置集群

    下载nginx 下载稳定版 下载地址 解压 修改conf里的nginx conf user nobody worker processes 1 error log logs error log error log logs error lo
  • java启动参数,idea参数设置,环境变量参数,jdk选项,程序main函数参数的配置和获取方式

    Idea 开发java 项目中的各种启动参数配置和获取方式汇总 java启动命令的整体结构 如下4图涵盖了所有情况 本人亲自测试所得 欢迎提问 1 启动参数优先级 高优先级的配置 会覆盖低优先级的配置 2 按上图配置 启动测试 可见优先级最
  • 成功利用arthas解决一个cpu占用100%的问题

    最近在项目中 发现一个程序的cpu瞬间会占用100 经验来说应该是某个方法死循环了或者迭代次数过多 利用arthas可以查看问题的症结所在 arthas用户手册 1 首先启动arthas java jar arthas boot jar 2
  • springboot实现用户统一认证、管理(单点登录)

    大家好 我是雄雄 欢迎关注微信公众号 雄雄的小课堂 前言 现在是 2022年5月25日13 44 16 最近和模拟登录杠上了 这不 又来了个需求 还是以这个技术点入手的 需求大概是这样的 为了统一管理系统的用户 上游平台做了个统一认证平台
  • 1072: 青蛙爬井

    1072 青蛙爬井 题目描述 有一口深度为high米的水井 井底有一只青蛙 它每天白天能够沿井壁向上爬up米 夜里则顺井壁向下滑down米 若青蛙从某个早晨开始向外爬 对于任意指定的high up和down值 均为自然数 计算青蛙多少天能够
  • GPGGA校验计算方式

    GPGGA 092725 00 4717 11399 N 00833 91590 E 1 08 1 01 499 6 M 48 0 M 5B String str GPGGA 092725 00 4717 11399 N 00833 915
  • HiveSql一天一个小技巧:利用array_contains()函数进行容器存在性计数问题分析

    0 需求描述 文章被引用关系数据表如下 id oid 1 0 2 0 3 1 4 1 5 2 6 0 7 3 其中id表示文章id oid引用的文章 当oid为0时表示当前文章为原创文章 求原创文章被引用的次数 注意本题不能用关联的形式求解
  • 【Web基础入门】一文搞懂HTML + CSS + JavaScript 简单了解

    html html是什么 超文本标记语言 运行在浏览器上 超文本 超级文本 如流媒体 声音 视频 标记语言 由大量的标签组成 标签 任何一个标签都有开始标签和结束标签 html不是编程语言 没有变量 数据类型 控制语句等 只能算一种浏览器的
  • Dubbo使用nacos作为注册中心原理剖析

    Nacos是阿里自研的 一个更易于构建云原生应用的动态服务发现 配置管理和服务管理平台 作为微服务注册中心 它的目标是淘汰目前流行的eureka zookeeper consul等组件 现在学习它真的很有必要 这里就还是从源码的角度出发 看