中间件 | 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.hqwc.cn/news/543790.html

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

相关文章

【Poi-tl Documentation】自定义占位符来设置图片大小

前置说明&#xff1a; <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version> </dependency>模板文件&#xff1a; image_test.docx package run.siyuan.poi.tl.policy;imp…

【Poi-tl Documentation】区块对标签显示隐藏改造

前置说明&#xff1a; <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version> </dependency>模板&#xff1a; 删除行表格测试.docx 改造前测试效果 package run.siyuan…

磁盘未格式化,数据恢复有妙招

一、初遇磁盘未格式化&#xff0c;惊慌失措 在日常生活和工作中&#xff0c;我们经常会使用各种存储设备来保存重要的文件和数据。然而&#xff0c;有时当我们尝试访问这些存储设备时&#xff0c;却会突然遇到一个令人头痛的问题——磁盘未格式化。这个突如其来的提示让我们措…

墨子web3时事周报

链上游戏平台Crypto Gladiator League推出全链游戏平台 链上游戏平台 Crypto Gladiator League&#xff08;CGL&#xff09;宣布重大升级&#xff0c;推出全链游戏平台&#xff0c;标志着其在区块链游戏领域的新突破。全新平台主要包括三大创新&#xff1a; 首先&#xff0c;推…

(每日持续更新)jdk api之StringBufferInputStream基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

《Python深度学习》阅读笔记

以下是《Python深度学习》一书中学习过程中记录的一些重要的专属名词和概念&#xff1a; 一、概念 深度学习&#xff08;Deep Learning&#xff09;&#xff1a;指使用多层神经网络进行机器学习的技术。神经网络&#xff08;Neural Network&#xff09;&#xff1a;一种模仿生…

『scrapy爬虫』05. 使用管道将数据写入mysql(详细注释步骤)

目录 1. 新建管道类,并启用2. 准备好mysql数据库新建表3. 实现管道写入数据库的代码测试一下 总结 欢迎关注 『scrapy爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『scrapy爬虫』 专栏&#xff0c;持续更新中 如果对mysql和python不熟悉可看专栏【Python之pymysql库学习】 1.…

移动云行动:5.5G技术引领数字化转型

刚刚结束的全国两会上&#xff0c;有人大代表建议应尽快发挥5G-A&#xff08;5.5G&#xff09;优势&#xff0c;加快试点城市布局。此前&#xff0c;中国移动已宣布将在300多个城市启动5.5G商用部署。在通信技术的历史长河中&#xff0c;4G改变了我们的生活方式&#xff0c;而5…

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

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

强化学习------DDPG算法(附pytorch代码)

目录 一、前言二、基本原理2.1、经验回放2.2、更新过程2.2.1、Critic网络更新过程2.2.2、Actor网络更新过程2.2.3、 目标网络的更新 2.3、噪音探索 三、算法代码实现四、训练示例4.1、实现效果 一、前言 Deep Deterministic Policy Gradient (DDPG)算法是DeepMind团队提出的一…

浅谈性能测试中的基准测试

在性能测试中有一种测试类型叫做基准测试。这篇文章&#xff0c;就聊聊关于基准测试的一些事儿。 1、定义 通过设计合理的测试方法&#xff0c;选用合适的测试工具和被测系统&#xff0c;实现对某个特定目标场景的某项性能指标进行定量的和可对比的测试。 2、特质 ①、可重…

STL——map set

文章将解决一下几个问题&#xff1a; 1.什么是set 2.什么是map 3.set应用场景 4.map应用场景 序列式容器和关联式容器 数据结构有序列式容器和关联式容器&#xff0c;序列式容器一般有vector,list,deque…&#xff0c;但关联式容器中就有map&#xff0c;关联式容器也是用来存…