中间件 | RPC - [Dubbo]
INDEX
- §1 Dubbo 与 web 容器的关系
- §2 注册发现流程
- §3 服务配置
- §3.1 注册方式 & 订阅方式
- §3.2 服务导出
- §3.3 配置参数
- §4 底层技术
- §4.1 Dubbo 的 spi 机制
- §4.2 Dubbo 的线程池
- §4.3 Dubbo 的负载均衡策略
- §4.3 Dubbo 的协议
§1 Dubbo 与 web 容器的关系
- dubbo 本质上是一个 RPC 框架,常用于服务间调用
- web 容器是服务的容器,主要用来响应 http 请求
- dubbo 和 web 没有直接联系,dubbo 也不依赖于 web 容器
§2 注册发现流程

无论 provider 还是 consumer
- 都被容器代理
- 都通过协议与注册中心交互
工作流程
- provider 向注册中心注册自己
- consumer 向注册中心订阅服务
- Dubbo 默认在启动时开启服务可用性检查
若 provider 无可用节点会启动失败,报No provider available for the service ...
也可以通过配置@DubboReference(check=false)关闭这个特性
- Dubbo 默认在启动时开启服务可用性检查
- 注册中心定时通知 consumer 服务变更
- comsumer 通过订阅到的信息调用服务
- Dubbo 启动后,若注册中心宕机,不影响 consumer 调用 provider
因为调用是依赖 consumer 订阅的服务信息,consumer 会有本地缓存
- Dubbo 启动后,若注册中心宕机,不影响 consumer 调用 provider
- privider/comsumer 统计自己的调用次数、调用时间,每分钟通知 monitor
§3 服务配置
§3.1 注册方式 & 订阅方式
| 版本 | 注册中心 | 配置方式 |
|---|---|---|
| < 2.7 | zk | 接口注册 |
| > 2.7 | zk / nacos | 接口注册 |
| >= 2.7.6 | zk / nacos | 接口注册/应用注册 |
| > 3 | zk / nacos2.0 | 接口注册/应用注册 |
Dubbo 2.7.6 开始,支持 3 种注册方式
- interface,经典配置方式,接口级注册
- instance,新配置方式,应用级注册,可以有效减少注册信息
- all,即 interface + instance,默认,便于服务迁移
与之相对的,Dubbo 的订阅方式也有 3 种
- FORCE_INTERFACE:只按接口级注册消费
- FORCE_INSTANCE:只按应用级注册消费
- APPLICATION_FIRST:默认,优先按应用级注册消费
§3.2 服务导出
Dubbo 的服务导出机制,其实就是从服务启动到注册到注册中心的过程,在官网有详细解释(放心看,中文的)
Dubbo 3.0
Spring 启动后发送的 ContextRefreshEvent 事件,
Dubbo 会通过 DubboDeployApplicationListener 监听这个事件,
并通过 DefaultModuleDeploy.startSync() 开始同步
Dubbo 2.7
入口在 ServiceBean.onApplicationEvent(ContextRefreshEvent event),分为如下几步
- 前置准备
- 配置检查
- 检查
<dubbo:service interface>属性 ProviderConfig、ApplicationConfig等配置对象- 检查泛化服务与普通服务
- 检查本地存根配置
ApplicationConfig、RegistryConfig等配置对象
- 检查
- 多协议多配置中心导出支持
- URL 装配:主要是找到、适配各种参数
- 配置检查
- 导出服务
- 创建
Invoker,这是 Dubbo 的核心模块,所有组件都是以此为核心的 - 根据配置
scope参数决定是导出到本地还是远端- 导出到本地时,仅通过
InjvmProtocol.export创建InjvmExporter - 导出到远端时
- 调用
doLocalExport导出服务 - 向注册中心注册
- 向注册中心订阅 override 数据
- 创建并返回
DestroyableExporter
- 调用
- 导出到本地时,仅通过
- 创建
- 服务注册
- 根据 url 从缓存获取注册器,如果没有就创建并加入缓存
- 连接注册中心服务,创建注册中心客户端对象
- 通过注册中心客户端对象向注册中心创建节点(写入节点数据)
§3.3 配置参数
@DubboReference(check=false)
关闭 consumer 启动时检查 provider 是否可用
当不配置时,若 provider 无可用节点会报 No provider available for the service ... 启动失败
@DubboServide(group="xx")
@DubboReference(group="xx")
同接口多实现配置,消费者只会调用同组提供者
@DubboServide(version="xx")
@DubboReference(version="xx")
同接口有多个版本需要兼容,消费者只会调用同组提供者
§4 底层技术
§4.1 Dubbo 的 spi 机制
spi 是 JDK 已经实现了的规范,Dubbo 独立实现了一套
其目的在于在多实现接口中仅实例化需要的实现
§4.2 Dubbo 的线程池
线程池位置

线程池类型
- fixed:固定大小线程池,启动时建立线程,不关闭,一直持有,默认
- cached:缓存线程池,空闲一分钟自动删除,需要时重建。
任务数量超过maximumPoolSize时直接抛出异常而不是将任务放入阻塞队列 - limited:可伸缩线程池,但池中的线程数只会增长不会收缩。
只增长不收缩的目的是为了避免收缩时突然来了大流量引起的性能问题。 - eager:优先创建Worker线程池。
在任务数量大于corePoolSize但是小于maximumPoolSize时,优先创建Worker来处理任务。
当任务数量大于maximumPoolSize时,将任务放入阻塞队列中。阻塞队列充满时抛出RejectedExecutionException
线程池满载
dubbo 的线程池是在服务节点上全服务共享的,默认最大线程数 200,超出后会拒绝请求并提示类似如下信息:
Server side(ip,port) thread pool is exhausted, detail msg: Thread pool is EXHAUSTED! Thread name: xx-ip:port, Pool Size: 200(active: 200,core: 200, max: 200,largest:200), Task 207(completed: 7), Executor status: (isShutdown: false, isTerminated:false, isTerminating:false), in dubbo:ip:port
解决方式:
- 优化逻辑链路,降低处理时间
- 增加服务节点
- 服务拆分,剥离专享节点给流量极大服务
- 服务限流,配合链路限流模式
§4.3 Dubbo 的负载均衡策略
官网原文在此,中文的,随便看
- random:加权随机,默认
- round-robin:加权轮询,按服务节点新能进行加权
- least-active:最小活跃数,活跃调用数越小,表明该服务提供者效率越高,单位时间内可处理更多的请求
- consistent-hash:一致性 hash,直接确定了 provider 和 consumer 的对应关系
- shortest-response:加权最短响应
- P2C:随机挑选两个节点,然后选择连接数小的
- adaptive:随机挑选两个节点,然后选择负载小的
§4.3 Dubbo 的协议
基于 http 的
- dubbo
- hessian
- http
基于缓存的
- redis
- memcached
基于二进制序列化的(快)
- thrift
- gRPC
基于 java 规范的
- rest
- rmi
- webservice
相关文章:
中间件 | RPC - [Dubbo]
INDEX 1 Dubbo 与 web 容器的关系2 注册发现流程3 服务配置3.1 注册方式 & 订阅方式3.2 服务导出3.3 配置参数 4 底层技术4.1 Dubbo 的 spi 机制4.2 Dubbo 的线程池4.3 Dubbo 的负载均衡策略4.3 Dubbo 的协议 1 Dubbo 与 web 容器的关系 dubbo 本质上是一个 RPC 框架&…...
【中等】保研/考研408机试-二叉树相关
目录 一、基本二叉树 1.1结构 1.2前序遍历(注意三种遍历中Visit所在的位置) 1.2中序遍历 1.3后序遍历 二、真题实战 2.1KY11 二叉树遍历(清华大学复试上机题)【较难】 2.2KY212 二叉树遍历二叉树遍历(华中科技大…...
自动驾驶---Motion Planning之构建SLT Driving Corridor
1 背景 在上篇博客《自动驾驶---Motion Planning之Speed Boundary》中,主要介绍了Apollo中Speed Boundary的一些内容,可以构造ST图得到边界信息,最后结合粗糙的速度曲线和路径曲线,即可使用优化的方法求解得到最终的轨迹信息(s,s,s,l,l,l)。 本篇博客笔者主要介绍近…...
本地文件包含漏洞利用
目录 前期信息收集获取网站权限获取服务器权限纵向提权 前期信息收集 拿到目标的资产,先试一下IP能不能访问 探测一下目标的端口运行的是什么服务 nmap -sC -sV xx.xx9.95.185 -Pn获取网站权限 我们可以知道目标的80端口上运行着http服务,服务器是u…...
【docker】docker的常用命令
📝个人主页:五敷有你 🔥系列专栏:中间件 ⛺️稳中求进,晒太阳 常规命令 docker version #查看docker 版本信息docker info #显示docker 的系统信息,包括镜像和容器数量docker --help #查看所有的命…...
jmeter实战
jmeter学习 1,接口在定义时,post请求参数尽量放在body里面,get请求参数尽量放在parameters里面,否则会导致jmeter请求接口报错的问题(jmeter底层有较为严格的请求格式) 2,定义全局变量使用:Config Elemen…...
面试官常问问题
1、请你简单的自我介绍一下? 【Tips】① 口述内容不可与简历内容冲突;②阐述方式避免过度官方 且语速较快;③言简意赅,直击要害,抓重点突出项;④面试前应自己模拟练习几次,避免过度紧张导致的口…...
外包就干了2个月,技术退步明显....
先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...
面向对象 汇总(详细内容见Day12—16)
面向对象 汇总(详细内容见Day12—16) 文章目录 面向对象 汇总(详细内容见Day12—16)一、概念二、类三、对象四、成员属性/成员变量五、成员方法六、构造方法七、private - 私有化八、封装九、this - 本对象十、分包十一、static -…...
结构体联合体枚举和位段
文章目录 结构体结构体类型的声明特殊的声明 结构的自引用结构体变量的定义和初始化结构体内存对齐为什么要内存对齐结构体传参结构体实现位段(位段的填充&可移植性)位段位段的内存分配空间如何开辟位段的跨平台问题位段的应用 枚举枚举类型的定义枚…...
人类程序员真要失业?首位“AI软件工程师”亮相引爆科技圈
初创公司Cognition成立不到两个月,但已经拥有十名天才工程师。他们推出了一款名为Devin的人工智能(AI)助手,可以协助人类软件工程师完成各种开发任务。Devin与现有的其他AI编码者不同,它能够从头开始构建网站、自动部署…...
redis的过期策略以及内存淘汰机制
redis采用的是定期删除惰性删除策略。 为什么不用定时删除策略? 定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要 将时间应用在处理请求,而不是删除key,因此没有采用这一策…...
华为数通方向HCIP-DataCom H12-821题库(多选题:161-180)
第161题 以下关于IPv6优势的描述,正确的是哪些项? A、底层自身携带安全特性 B、加入了对自动配置地址的支持,能够无状态自动配置地址 C、路由表相比IPv4会更大,寻址更加精确 D、头部格式灵活,具有多个扩展头 【参考答案】ABD 【答案解析】 第162题 在OSPF视图下使用Filt…...
网络通信与网络协议
网络编程是指利用计算机网络实现程序之间通信的一种编程方式。在网络编程中,程序需要通过网络协议(如 TCP/IP)来进行通信,以实现不同计算机之间的数据传输和共享。在网络编程中,通常有三个基本要素 IP 地址:定位网络中某台计算机端口号port:定…...
【矩阵】240. 搜索二维矩阵 II【中等】
搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22…...
详解uniapp的生命周期
这篇文章主要介绍了 uniapp 的生命周期, 应用生命周期是指应用程序从启动到关闭的整个过程,包括应用程序的启动、前后台切换、退出等, 需要的朋友可以参考下 Uniapp 作为一款跨平台应用开发框架,具有丰富的生命周期,以下是 Uniapp 的生命周期…...
鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:PluginComponent)
提供外部应用组件嵌入式显示功能,即外部应用提供的UI可在本应用内显示。 说明: 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。本组件为系统接口。 子组件 无 接口 PluginComponent(value:…...
mysql笔记:15. 事务和锁
文章目录 一、事务概述二、事务基本操作三、事务保存点四、事务的隔离级别1. READ UNCOMMITTED设置事务的隔离级别 2. READ COMMITTED3. REPEATABLE READ4. SERIALIZABLE 五、MySQL的锁InnoDB的锁类型1. InnoDB的行级锁2. InnoDB的表级锁 死锁 在开发过程中,我们经常…...
Learn OpenGL 15 面剔除
面剔除 尝试在脑子中想象一个3D立方体,数数你从任意方向最多能同时看到几个面。如果你的想象力不是过于丰富了,你应该能得出最大的面数是3。你可以从任意位置和任意方向看向这个球体,但你永远不能看到3个以上的面。所以我们为什么要浪费时间…...
EndeavourOs(arch系)安装sunpinyin输入法(ibus) + 迅雷(xunlei-bin)
输入法 yay -S ibus yay -S ibus-libpinyin yay -S ibus-sunpinyin yay -Q ibus ibus-libpinyin ibus-sunpinyin #验证 # 注销然后打开ibus config... # 在Input Method 添加Chinese->SunPinYin # 使用Ctrl Space, 默认Super Space, 请自行修改 # 再次注销,开…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...
CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx
“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网(IIoT)场景中,结合 DDS(Data Distribution Service) 和 Rx(Reactive Extensions) 技术,实现 …...
