中间件 | RPC - [Dubbo]

news2024/11/18 2:59:51

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.coloradmin.cn/o/1521800.html

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

相关文章

leetcode代码记录(动态规划基础题(斐波那契数列)

目录 1. 题目&#xff1a;2. 斐波那契数列&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a…

基于高德地图JS API实现Vue地图选点组件

基于高德地图JS API2.0实现一个搜索选择地点后返回给父组件位置信息的功能&#xff0c;同时可以进行回显 目录 1 创建key和秘钥1.1 登录高德地图开放平台1.2 创建应用1.3 绑定服务创建秘钥 2 使用组件前准备2.1 导入loader2.2 在对应的组件设置秘钥2.3 引入css样式 3 功能实现…

【C语言】整型提升与算术转换

一、表达式求值 在我们平常的表达式求值的题目中&#xff0c;虽然看似是道很简单的题目&#xff1b;但是出题人总是会埋坑&#xff0c;其中最常见的就是整型提升与算术转换。 二、整型提升 C语⾔中整型算术运算总是⾄少以缺省(默认)整型(int)类型的精度来进⾏的&#xff1b;…

【MySQL基础】MySQL基础操作二

文章目录 &#x1f34e;1.数据库约束&#x1f350;约束类型&#x1f346;1.1NOT NULL&#x1f346;1.2UNIQUE&#x1f346;1.3DEFAULT&#x1f346;1.4PRIMARY KEY&#x1f346;1.5FOREIGN KEY &#x1f34f;2.查询操作&#x1f35f;2.1聚合查询&#x1f354;2.1.1聚合函数&…

视频号电商的风口来了!这个消息还有多少人不知道?

大家好&#xff0c;我是电商糖果 短视频做电商&#xff0c;这几年的热度真的是非常高&#xff0c;就是因为热度太高了&#xff0c;才让视频号也动了电商的心思。 腾讯推出的视频号是为了和抖音对打&#xff0c;这几年靠着微信输送的流量&#xff0c;视频号的日活已经渐渐有赶…

JavaSE-----认识异常【详解】

目录 一.异常的概念与体系结构&#xff1a; 1.1异常的概念&#xff1a; 1.2一些常见的异常&#xff1a; 1.3异常的体系结构&#xff1a; 1.4异常的分类&#xff1a; 二.异常的处理机制&#xff1a; 2.1 抛出异常&#xff1a; 2.2异常的捕获&#xff1a; 2.3try-catch-&…

JavaWeb一些开发问题

一、Restful package com.example.crudtest1.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data NoArgsConstructor AllArgsConstructor public class Result {private Integer code;//响应码&#xff0c;1 代表成功; 0 代表失…

浅易理解:卷积神经网络(CNN)

浅易理解卷积神经网络流程 本文的目录&#xff1a; 1 什么卷积神经网络 2 输入层 3 卷积层 4 池化层 5 全连接层 传统的多层神经网络只有 输入层、隐藏层、输出层 卷积神经网络&#xff08;CNN)&#xff1a; 在多层神经网络的基础上&#xff0c;加入了更加有效的特征学习部分…

315曝光黑灰产业链:主板机

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 315晚会曝光主板机黑灰产业链&#xff0c;主板机是什么呢?可能很多人还不知道。在这里松松给大家普及一下&#xff0c;也欢迎大家关注卢松松哟! 主板机是什么呢? 通过报废手机的主板&#xff0c;拆出来后组装成主…

【Linux进程状态】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、直接谈论Linux的进程状态 看看Linux内核源代码怎么说 1.1、R状态 -----> 进程运行的状态 1.2、S状态 -----> 休眠状态(进程在等待“资源”就绪) 1.3、T状…

NFTScan 正式上线 Blast NFTScan 浏览器和 NFT API 数据服务

2024 年 3 月 15 号&#xff0c;NFTScan 团队正式对外发布了 Blast NFTScan 浏览器&#xff0c;将为 Blast 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商&#xff0c;Blast 是继 Bitcoin、Ethereum、BNBChain、…

Linux 系统调用函数fork、vfork、clone详解

文章目录 1 fork1.1 基本介绍1.2 fork实例1.2.1多个fork返回值1.2.2 C语言 fork与输出1.2.3 fork &#x1f4a3; 2 vfork2.1 基本介绍2.2 验证vfork共享内存 3 clone3.1 基本介绍3.2 clone使用 1 fork 1.1 基本介绍 #include <sys/types.h> #include <unistd.h>p…

2024年【危险化学品经营单位主要负责人】找解析及危险化学品经营单位主要负责人模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位主要负责人找解析考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品经营单位主要负责人模拟考试题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品经营单位主要负责人…

Grok的开源的一些想法

Grok是埃隆马斯克的人工智能团队开发的大模型&#xff0c;自马斯克发布消息称将开源大模型&#xff0c;其热度就居高不下。Grok的开源能迅速帮助国内建立起AI应用的能力。 从xAI公布的数据来看&#xff0c;Grok在主流的测试方法中均已超过GPT-3.5&#xff0c;而其是开源发展速度…

如何使用Python进行数据可视化:Matplotlib和Seaborn指南【第123篇—Matplotlib和Seaborn指南】

如何使用Python进行数据可视化&#xff1a;Matplotlib和Seaborn指南 数据可视化是数据科学和分析中不可或缺的一部分&#xff0c;而Python中的Matplotlib和Seaborn库为用户提供了强大的工具来创建各种可视化图表。本文将介绍如何使用这两个库进行数据可视化&#xff0c;并提供…

高可用系统有哪些设计原则

1.降级 主动降级&#xff1a;开关推送 被动降级&#xff1a;超时降级 异常降级 失败率 熔断保护 多级降级2.限流 nginx的limit模块 gateway redisLua 业务层限流 本地限流 gua 分布式限流 sentinel 3.弹性计算 弹性伸缩—K8Sdocker 主链路压力过大的时候可以将非主链路的机器给…

性能测试工具——wrk的安装与使用

前言 想和大家来聊聊性能测试&#xff0c;聊到了性能测试必须要说的是性能测试中的工具&#xff0c;在这些工具中我今天主要给大家介绍wrk。 ​介绍 wrk是一款开源的性能测试工具 &#xff0c;简单易用&#xff0c;没有Load Runner那么复杂&#xff0c;他和 apache benchmar…

【Unity】读取Json的三种方法(JsonUtility,LitJson,Newtonsoft)

介绍 在Unity开发过程中&#xff0c;Json是比较常用的一种数据存储文本&#xff0c;尤其是在和第三方交互中&#xff0c;基本都是json格式。 先给出一个Json示例&#xff0c;我们来看看是如何解析的。 {"Player": [{"id": 1001,"name": "…

Linux网络编程: IP协议详解

一、TCP/IP五层模型 物理层&#xff08;Physical Layer&#xff09;&#xff1a;物理层是最底层&#xff0c;负责传输比特流&#xff08;bitstream&#xff09;以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流&#xff0c;例如通过电缆、光纤或无线传输等。…

湖南麒麟SSH服务漏洞

针对湖南麒麟操作系统进行漏洞检测时&#xff0c;会报SSH漏洞风险提醒&#xff0c;具体如下&#xff1a; 针对这些漏洞&#xff0c;可以关闭SSH服务&#xff08;前提是应用已经部署完毕不再需要通过SSH远程访问传输文件的情况下&#xff0c;此时可以通过VNC远程登录方法&#x…