中间件 | 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/748840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 中的锁机制详解

MySQL 数据库系统在 server 层和存储引擎层都广泛应用了各种锁机制&#xff0c;以确保并发操作下的数据一致性及完整性。本文将详细介绍MySQL中两种关键类型的server层锁以及InnoDB存储引擎的表级和行级锁。 1. Server层锁 1.1 Metadata Lock (MDL) MDL&#xff0c;即元数据…

SpringCloud Stream 消息驱动

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第九篇&#xff0c;即介绍 Stream 消息驱动。 二、消息驱动概念 2.1 消息驱动是什么 官方定义 Spring …

JavaScript的事件

JavaScript的事件 先写一个test测试函数以查看事件是否触发 function test(){var ddocument.getElementById("tid");console.log("测试成功"d) //控制台输出 }onclick 鼠标单击事件&#xff1a; <input type"button" id"tid" va…

学习通刷视频刷题脚本及安装使用过程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装插件二、复制脚本文件链接三、启动脚本四、登录学习通&#xff08;切记一倍速就行不然被封哦&#xff09;五、最好先把答题关掉先刷视频 前言 解决学习…

Winform编程详解四:ComboBox 下拉列表框

一、属性介绍 1. (Name) 控件的对象标识符ID 2. Items 组合框中的集合项 3. BackColor 控件的背景颜色 4. Cursor 鼠标移过该控件显示的光标样式 5. DropDownStyle 组合框的下拉样式和功能 6. FlatStyle 控件的外观 7. Font 控件的字体样式 8. ForeColor 控件的文本颜…

AI技术崛起:数据可视化之路更近

在当今AI技术蓬勃发展的时代&#xff0c;数据可视化作为信息传达的重要手段&#xff0c;其门槛逐渐降低。然而&#xff0c;这并不意味着我们可以忽视学习数据可视化的重要性。即使不需要深入专业技术&#xff0c;对数据可视化的基础知识的了解也是至关重要的。那么&#xff0c;…

02-Java变量和运算符

1. 基本数据类型转换&#xff08;Conversion&#xff09; 在Java程序中&#xff0c;不同的基本数据类型的值经常需要进行相互转换。Java语言所提供的七种数值类型之间可以相互转换&#xff0c;基本数据类型转换有两种转换方式&#xff1a;自动类型转换和强制类型转换。boolean…

金口诀排盘 api接口

接口平台&#xff1a;https://api.yuanfenju.com 开发文档&#xff1a;https://doc.yuanfenju.com/liupan/jinkoujue.html 支持格式&#xff1a;Form-data 请求方式&#xff1a;HTTP POST/GET <?php//您的密钥 $api_secret "wD******XhOUW******pvr"; //请求…

react面试题总结

1、当调用 setState的时候&#xff0c;发生了什么操作&#xff1f; 当调用 setState时&#xff0c; React做的第一件事是将传递给setState的对象合并到组件的当前状态&#xff0c;这将启动一个称为和解&#xff08; reconciliation&#xff09;的过程。 和解的最终目标是&#…

代码随想录算法训练营第59天|496.下一个更大元素II 42.接雨水

496.下一个更大元素II 这道题特殊的点在于它有点像环&#xff0c;后面的元素可以再从前面的元素找&#xff0c;我看了卡哥的视频&#xff0c;卡哥是根据取模来取的&#xff0c;但是他会多了没必要的赋值&#xff0c;我还是按照我最初的想法写吧&#xff0c;我是跟之前单调区间一…

java之mybatis语法

1、增加&#xff08;Insert&#xff09;&#xff1a; xml <insert id"insertUser" parameterType"User">INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age}) </insert> 对应Java代码&#xff1a;java sqlSession.insert(&quo…

Dubbo 的配置总线:抓住 URL,就理解了半个 Dubbo

概述 在互联网领域&#xff0c;每个信息资源都有统一的且在网上唯一的地址&#xff0c;该地址就叫 URL&#xff08;Uniform Resource Locator&#xff0c;统一资源定位符&#xff09;&#xff0c;它是互联网的统一资源定位标志&#xff0c;也就是指网络地址。 URL 本质上就是…

嵌入式摄像头,获取视频要通过进程通讯?

大体来说&#xff1a; 前几天同事突然对我说&#xff0c;摄像头问题很大。我听了一愣&#xff1a;这摄像头多么成熟的技术&#xff0c;各种代码都有&#xff0c;怎么就有问题了&#xff1f;他解释了一番&#xff0c;大意是&#xff0c;实际上摄像头被camera进程完全控制。比如…

【C++从练气到飞升】03---构造函数和析构函数

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 ⛳️推荐 一、类的6个默认成员函数 二、构造函数 1. 构造函数的概念 2. 构造函数的定义 3. 构造函数的特性 三、析构函…

MySQL MHA故障切换

目录 一、案例分析 1.1、案例概述 1.2、案例前置知识点 1&#xff09;什么是 MHA 2&#xff09;MHA 的组成 3&#xff09;MHA 的优势 4&#xff09;MHA 现状 1.3、案例环境 1&#xff09;本案例环境 ​编辑 2&#xff09;案例需求 3&#xff09;案例实现思路…

CSS进阶空间转换和 less

<html> <head> <meta charset"UTF-8" /> <title>空间转换</title> </head> <body> <!-- 空间转换 空间&#xff1a;是从坐标轴角度定义的X,Y,和Z三条坐标轴构成一个立体空间 Z轴位置与视线方向相同 空间转换也叫3D转…

01——LenNet网络结构,图片识别

目录 1、model.py文件 &#xff08;预训练的模型&#xff09; 2、train.py文件&#xff08;会产生训练好的.th文件&#xff09; 3、predict.py文件&#xff08;预测文件&#xff09; 4、结果展示&#xff1a; 1、model.py文件 &#xff08;预训练的模型&#xff09; impor…

OceanBase中分区的运用

分区的概念 分区实质上是根据特定的规则&#xff0c;将表划分为若干个独立的物理存储单位。以MySQL为例&#xff0c;表会被拆分为多个物理文件。而在OceanBase​​​​​​​中&#xff0c;每个分区则表现为一个物理副本组&#xff0c;每个分区默认都拥有三个副本。 分区表的优…

lqb省赛日志[8/37]-[搜索·DFS·BFS]

一只小蒟蒻备考蓝桥杯的日志 文章目录 笔记DFS记忆化搜索 刷题心得小结 笔记 DFS 参考 深度优先搜索(DFS) 总结(算法剪枝优化总结) DFS的模板框架: function dfs(当前状态){if(当前状态 目的状态){}for(寻找新状态){if(状态合法){vis[访问该点]&#xff1b;dfs(新状态);?…

一道题学会如何使用哈希表

给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2示例 2&#xff1a; 输入&#xff1a;nums [1,2,3], …