中间件 | 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, 请自行修改 # 再次注销,开…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...