当前位置: 首页 > news >正文

中间件 | 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) 关闭这个特性
  • 注册中心定时通知 consumer 服务变更
  • comsumer 通过订阅到的信息调用服务
    • Dubbo 启动后,若注册中心宕机,不影响 consumer 调用 provider
      因为调用是依赖 consumer 订阅的服务信息,consumer 会有本地缓存
  • privider/comsumer 统计自己的调用次数、调用时间,每分钟通知 monitor

§3 服务配置

§3.1 注册方式 & 订阅方式
版本注册中心配置方式
< 2.7zk接口注册
> 2.7zk / nacos接口注册
>= 2.7.6zk / nacos接口注册/应用注册
> 3zk / 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> 属性
      • ProviderConfigApplicationConfig 等配置对象
      • 检查泛化服务与普通服务
      • 检查本地存根配置
      • ApplicationConfigRegistryConfig 等配置对象
    • 多协议多配置中心导出支持
    • 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前序遍历&#xff08;注意三种遍历中Visit所在的位置&#xff09; 1.2中序遍历 1.3后序遍历 二、真题实战 2.1KY11 二叉树遍历&#xff08;清华大学复试上机题&#xff09;【较难】 2.2KY212 二叉树遍历二叉树遍历&#xff08;华中科技大…...

自动驾驶---Motion Planning之构建SLT Driving Corridor

1 背景 在上篇博客《自动驾驶---Motion Planning之Speed Boundary》中,主要介绍了Apollo中Speed Boundary的一些内容,可以构造ST图得到边界信息,最后结合粗糙的速度曲线和路径曲线,即可使用优化的方法求解得到最终的轨迹信息(s,s,s,l,l,l)。 本篇博客笔者主要介绍近…...

本地文件包含漏洞利用

目录 前期信息收集获取网站权限获取服务器权限纵向提权 前期信息收集 拿到目标的资产&#xff0c;先试一下IP能不能访问 探测一下目标的端口运行的是什么服务 nmap -sC -sV xx.xx9.95.185 -Pn获取网站权限 我们可以知道目标的80端口上运行着http服务&#xff0c;服务器是u…...

【docker】docker的常用命令

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;中间件 ⛺️稳中求进&#xff0c;晒太阳 常规命令 docker version #查看docker 版本信息docker info #显示docker 的系统信息&#xff0c;包括镜像和容器数量docker --help #查看所有的命…...

jmeter实战

jmeter学习 1&#xff0c;接口在定义时&#xff0c;post请求参数尽量放在body里面&#xff0c;get请求参数尽量放在parameters里面&#xff0c;否则会导致jmeter请求接口报错的问题(jmeter底层有较为严格的请求格式) 2&#xff0c;定义全局变量使用&#xff1a;Config Elemen…...

面试官常问问题

1、请你简单的自我介绍一下&#xff1f; 【Tips】① 口述内容不可与简历内容冲突&#xff1b;②阐述方式避免过度官方 且语速较快&#xff1b;③言简意赅&#xff0c;直击要害&#xff0c;抓重点突出项&#xff1b;④面试前应自己模拟练习几次&#xff0c;避免过度紧张导致的口…...

外包就干了2个月,技术退步明显....

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…...

面向对象 汇总(详细内容见Day12—16)

面向对象 汇总&#xff08;详细内容见Day12—16&#xff09; 文章目录 面向对象 汇总&#xff08;详细内容见Day12—16&#xff09;一、概念二、类三、对象四、成员属性/成员变量五、成员方法六、构造方法七、private - 私有化八、封装九、this - 本对象十、分包十一、static -…...

结构体联合体枚举和位段

文章目录 结构体结构体类型的声明特殊的声明 结构的自引用结构体变量的定义和初始化结构体内存对齐为什么要内存对齐结构体传参结构体实现位段&#xff08;位段的填充&可移植性&#xff09;位段位段的内存分配空间如何开辟位段的跨平台问题位段的应用 枚举枚举类型的定义枚…...

人类程序员真要失业?首位“AI软件工程师”亮相引爆科技圈

初创公司Cognition成立不到两个月&#xff0c;但已经拥有十名天才工程师。他们推出了一款名为Devin的人工智能&#xff08;AI&#xff09;助手&#xff0c;可以协助人类软件工程师完成各种开发任务。Devin与现有的其他AI编码者不同&#xff0c;它能够从头开始构建网站、自动部署…...

redis的过期策略以及内存淘汰机制

redis采用的是定期删除惰性删除策略。 为什么不用定时删除策略? 定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放&#xff0c;但是十分消耗CPU资源。在大并发请求下&#xff0c;CPU要 将时间应用在处理请求&#xff0c;而不是删除key,因此没有采用这一策…...

华为数通方向HCIP-DataCom H12-821题库(多选题:161-180)

第161题 以下关于IPv6优势的描述,正确的是哪些项? A、底层自身携带安全特性 B、加入了对自动配置地址的支持,能够无状态自动配置地址 C、路由表相比IPv4会更大,寻址更加精确 D、头部格式灵活,具有多个扩展头 【参考答案】ABD 【答案解析】 第162题 在OSPF视图下使用Filt…...

网络通信与网络协议

网络编程是指利用计算机网络实现程序之间通信的一种编程方式。在网络编程中&#xff0c;程序需要通过网络协议(如 TCP/IP)来进行通信&#xff0c;以实现不同计算机之间的数据传输和共享。在网络编程中&#xff0c;通常有三个基本要素 IP 地址:定位网络中某台计算机端口号port:定…...

【矩阵】240. 搜索二维矩阵 II【中等】

搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a;每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22…...

详解uniapp的生命周期

这篇文章主要介绍了 uniapp 的生命周期, 应用生命周期是指应用程序从启动到关闭的整个过程&#xff0c;包括应用程序的启动、前后台切换、退出等, 需要的朋友可以参考下 Uniapp 作为一款跨平台应用开发框架&#xff0c;具有丰富的生命周期&#xff0c;以下是 Uniapp 的生命周期…...

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:PluginComponent)

提供外部应用组件嵌入式显示功能&#xff0c;即外部应用提供的UI可在本应用内显示。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。本组件为系统接口。 子组件 无 接口 PluginComponent(value:…...

mysql笔记:15. 事务和锁

文章目录 一、事务概述二、事务基本操作三、事务保存点四、事务的隔离级别1. READ UNCOMMITTED设置事务的隔离级别 2. READ COMMITTED3. REPEATABLE READ4. SERIALIZABLE 五、MySQL的锁InnoDB的锁类型1. InnoDB的行级锁2. InnoDB的表级锁 死锁 在开发过程中&#xff0c;我们经常…...

Learn OpenGL 15 面剔除

面剔除 尝试在脑子中想象一个3D立方体&#xff0c;数数你从任意方向最多能同时看到几个面。如果你的想象力不是过于丰富了&#xff0c;你应该能得出最大的面数是3。你可以从任意位置和任意方向看向这个球体&#xff0c;但你永远不能看到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, 请自行修改 # 再次注销&#xff0c;开…...

Spring Cache框架的介绍和使用

Spring Cache spring cache是一个框架&#xff0c;实现类基于注解的缓存功能&#xff0c;只需要简单的加一个注解&#xff0c;就能实现缓存功能&#xff0c;大大简化我们在业务中操作缓存的代码。 spring cache只是提供了一层抽象&#xff0c;底层可以切换不同的cache实现&am…...

perl 用 XML::Parser 解析 XML文件,访问哈希

本篇我们会看到 Perl 成为知名编程语言的关键特色--哈希 hash&#xff08;2000年以前叫&#xff1a;关联数组&#xff09;。 在Perl 中&#xff0c;可以使用各种模块和函数来解析 XML元素和属性。其中&#xff0c;最古老的模块是 XML::Parser&#xff0c;它提供了一组完整的X…...

MATLAB中的矩阵和数组,它们之间有什么区别?

MATLAB中的矩阵和数组&#xff1a;概念、区别与联系 MATLAB&#xff08;Matrix Laboratory&#xff0c;矩阵实验室&#xff09;作为一款强大的数学软件&#xff0c;广泛应用于工程、科学、数学、计算机科学等领域。在MATLAB中&#xff0c;矩阵和数组是两个核心概念&#xff0c…...

python爬虫实战——抖音

目录 1、分析主页作品列表标签结构 2、进入作品页前 判断作品是视频作品还是图文作品 3、进入视频作品页面&#xff0c;获取视频 4、进入图文作品页面&#xff0c;获取图片 5、完整参考代码 6、获取全部作品的一种方法 本文主要使用 selenium.webdriver&#xff08;Firef…...

Day1-力扣刷题学习打卡

1、两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以…...

C语言的位操作与位字段

C语言中的位操作允许程序员直接在整型变量的单个位或位组上进行操作。这种操作在许多低级编程任务中非常有用&#xff0c;尤其是在嵌入式系统编程中&#xff0c;如硬件操作、设备驱动及性能优化等场景。位操作主要使用以下几种位操作符&#xff1a; & &#xff08;按位与&a…...

应用实战|从头开始开发记账本1:如何获取BaaS服务

本期视频开始&#xff0c;我们将通过一系列教程&#xff0c;来详细讲解MemFire Cloud BaaS服务的使用方法&#xff0c;通过这一系列的教程&#xff0c;你将学会如何只使用前端技术完成一个生产级应用的开发和上线。 以下是本期视频主要章节&#xff1a; BaaS服务介绍用户如何…...

el-form v-for循环列表的表单如何校验

1、普通的表单校验直接在最外层<el-form> :model"数据" :rules"规则" &#xff0c;再在<el-form-item>层设置prop值与model里数据定义的key保持一致即可。 <el-form-item label"名称" prop"ruleName" :rules"[{r…...

笔记:《NCT全国青少年编程能力等级测试教程Python语言编程三级》

NCT全国青少年编程能力等级测试教程Python语言编程三级 ISBN:9787302574859 绪论 专题1 序列和元组 考查方向 考点清单 考点1 组合数据类型 序列类型(字符串、列表、元组);集合类型;映射类型。 考点2 元组类型 (一)元组类型…...

地平线旭日x3派部署yolov5--全流程

地平线旭日x3派部署yolov5--全流程 前言一、深度学习环境安装二、安装docker三、部署3.1、安装工具链镜像3.2、配置天工开物OpenExplorer工具包3.3、创建深度学习虚拟空间&#xff0c;安装依赖&#xff1a;3.4、下载yolov5项目源码并运行3.5、pytorch的pt模型文件转onnx3.6、最…...