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

RPC远程调用框架Dubbo

一、分布式服务调用_什么是RPC

RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务。

大白话理解就是:RPC让你用别人家的东西就像自己家的一样。

RPC两个作用:

  • 屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法
  • 隐藏底层网络通信的复杂性,让我们更加专注业务逻辑。

常用的RPC框架

RPC是一种技术思想而非一种规范或协议。

常见 RPC 技术和框架:

  • 阿里的 Dubbo/Dubbox、Google gRPC、Spring Cloud。

二、Dubbo是什么

Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang、Rust 等多语言 SDK 实现。

2.1 为什么需要Dubbo,它能做什么?

按照微服务架构的定义,采用它的组织能够很好的提高业务迭代效率与系统稳定性,但前提是要先能保证微服务按照期望的方式运行,要做到这一点需要解决服务拆分与定义、数据通信、地址发现、流量管理、数据一致性、系统容错能力等一系列问题。

Dubbo 可以帮助解决如下微服务实践问题:

  • 微服务编程范式和工具

Dubbo 支持基于 IDL 或语言特定方式的服务定义,提供多种形式的服务调用形式(如同步、异步、流式等)

  • 高性能的 RPC 通信

Dubbo 帮助解决微服务组件之间的通信问题,提供了基于 HTTP、HTTP/2、TCP 等的多种高性能通信协议实现,并支持序列化协议扩展,在实现上解决网络连接管理、数据传输等基础问题。

  • 微服务监控与治理

Dubbo 官方提供的服务发现(可用nacos)、动态配置(可用nacos)、负载均衡、流量路由等基础组件可以很好的帮助解决微服务基础实践的问题。除此之外,您还可以用 Admin 控制台监控微服务状态,通过周边生态完成限流降级、数据一致性、链路追踪等能力。

  • 部署在多种环境

Dubbo 服务可以直接部署在容器、Kubernetes、Service Mesh等多种架构下。

  • 活跃的社区

Dubbo 项目托管在 Apache 社区,有来自国际、国内的活跃贡献者维护着超 10 个生态项目,贡献者包括来自海外、阿里巴巴、工商银行、携程、蚂蚁、腾讯等知名企业技术专家,确保 Dubbo 及时解决项目缺陷、需求及安全漏洞,跟进业界最新技术发展趋势。

  • 庞大的用户群体

Dubbo3 已在阿里巴巴成功取代 HSF 框架实现全面落地,成为阿里集团面向云原生时代的统一服务框架,庞大的用户群体是 Dubbo 保持稳定性、需求来源、先进性的基础。

2.2 Dubbo 不是什么?

  • 不是应用开发框架的替代者

Dubbo 设计为让开发者以主流的应用开发框架的开发模式工作,它不是各个语言应用开发框架的替代者,如它不是 Spring/Spring Boot 的竞争者,当你使用 Spring 时,Dubbo 可以无缝的与 Spring & Spring Boot 集成在一起。

  • 不仅仅只是一款 RPC 框架

Dubbo 提供了内置 RPC 通信协议实现,但它不仅仅是一款 RPC 框架。首先,它不绑定某一个具体的 RPC 协议,开发者可以在基于 Dubbo 开发的微服务体系中使用多种通信协议;其次,除了 RPC 通信之外,Dubbo 提供了丰富的服务治理能力与生态。

  • 不是 gRPC 协议的替代品

Dubbo 支持基于 gRPC 作为底层通信协议,在 Dubbo 模式下使用 gRPC 可以带来更好的开发体验,享有统一的编程模型和更低的服务治理接入成本

  • 不只有 Java 语言实现

自 Dubbo3 开始,Dubbo 提供了 Java、Golang、Rust、Node.js 等多语言实现,未来会有更多的语言实现。

2.3 任意通信协议

Dubbo 微服务间远程通信实现细节,支持 HTTP、HTTP/2、gRPC、TCP 等所有主流通信协议。与普通 RPC 框架不同,Dubbo 不是某个单一 RPC 协议的实现,它通过上层的 RPC 抽象可以将任意 RPC 协议接入 Dubbo 的开发、治理体系。

2.4 多语言 SDK

Dubbo 提供几乎所有主流语言的 SDK 实现,定义了一套统一的微服务开发范式。Dubbo 与每种语言体系的主流应用开发框架做了适配,总体编程方式、配置符合大多数开发者已有编程习惯。

三、项目所需要引入的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Dubbo和springboot整合依赖 -->
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!-- dubbo注册中心nacos依赖        -->
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-nacos</artifactId>
</dependency>

四、启动时检查

@DubboReference注解:

  • 使用在调用者处.
  • 如果配置check为false(默认为true),表示在启动时检查服务是否可用, 如果不可用, 则抛出异常. 设置为false, 表示不检查.即使服务不可用也可以正常启动服务.
@DubboReference(check = false)

 

五、Dubbo地址缓存

如果当Nacos突然故障,是否还能够保证Dubbo远程调用服务的正常使用(远端服务没有故障,只是nacos出现了问题).

答案是可以正常访问的,这也是Dubbo的强大之处.

Dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后在调用则不会访问注册中心。服务提供者地址发生变化时注册中心会通知服务消费者

六、服务发布

dubbo的服务要 被nacos检测,首先需要在对应服务接口加上@DubboService注解.这样我们将在nacos中看见dubbo所属服务的接口.

@DubboService
public class IPaymentServiceImpl implements IPaymentService {@Overridepublic String payment(Integer id) throws InterruptedException {return " hello world";}
}

七、超时时间

在其注解当中加入timeout属性.单位为毫秒ms.

 @DubboReference(check = false,timeout = 1000)//对于某个方法也可以设置超时
@DubboReference(methods = {@Method(name = "payment",timeout = 1000)})

服务端也是可以设置超时时间的

@DubboService(timeout = 1000)

超时是针对消费端,为什么服务端也可以设置超时呢?

这其实是一种策略,其实服务端的超时配置是消费端的缺省配置,即如果服务端设置了超时,任务消费端可以不设置超时时间,简化了配置。另外针对控制的粒度,Dubbo支持了接口级别也支持方法级别,可以根据不同的实际情况精确控制每个方法的超时时间。

但是如果你实际去测试,会发现一个奇怪的事情,你设计了1s的超时时间,但是你去请求一个超过1秒的服务(可利用Thread.sleep()制造一个异常).你会发现实际请求的时间却是大于1s的.大概在3s左右.这是为什么呢?

这就跟后面的超时重试有关啦.

八、超时重试

dubbo中默认会重试两次,所以在刚刚的示例当中,请求了一次,重试了两次.最后结果就是三次,也就是过了3秒后就结束啦.

但注意的是,不是在3秒内这个接口能够完成业务并返回结果就可以了,就不会抛出异常了.这是不正确的.

超时时间针对的是每一次的请求,你一次请求超过了1秒那就会进入第二次重试,重试后还是超过了1秒那接着就是最后一次.也就是设置超时时间表明了这一次请求需要在你设置的超时时间内完成.

我们可以通过其属性retries配置其重试次数(默认为2次)

@DubboReference(retries = 0)

九、多版本机制

服务发布是可以多版本的,在@DubboService中配置version属性

@DubboService(version = "1.0.0")

调用者可以指定使用哪个版本的服务

@DubboReference(version = "1.0.0")


多版本的作用:

可以不停机更新服务, 而不影响客户端的调用.少量的放入新版本,慢慢的切换到新版本.实现平滑升级.灰度发布.当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。

(一) 版本迁移步骤

  1. 在低压力时间段,先升级一半提供者为新版本
  2. 再将所有消费者升级为新版本
  3. 然后将剩下的一半提供者升级为新版本

十、负载均衡

在调用远程服务时,可能存在多个远程服务的实例.这个时候我们需要负载均衡.其实也就是跟Nginx,openFeign的负载均衡都是一个样子.

牵扯到负载均衡,那么dubbo提供了哪些常用的负载均衡的算法呢?

  • random: 随机
  • roundrobin: 轮询
  • leastactive: 最少活跃调用数(也就是哪个服务器压力小)
  • consistenthash: 参数一致性hash
    • 将服务实例经过hash运算放入到散列表中,然后调用服务的接口,经过hash计算看落在哪个位置对应的服务就调用哪个服务.如果所落在位置没有实例(服务出了故障),则将会向后移动,直到找到对应的实例.
       

如果记不住这些也没关系,通过Idea双击shift,查找loadbalance关键字,找到所属dubbo包下的loadbalance

然后通过接口上按下ctrl+h即可查看到所有的实例.

随便点击一个负载均衡实现的类.里面显示的NAME属性就是我们需要配置的名称.

落实到代码层面怎么配置呢,像下面这样

@DubboReference(loadbalance = "roundrobin")

其属性名的值就是按上述方法当中查找.

十一、集群容错

当调用处出了问题时,我们要以何种方法进行容错处理呢?

dubbo默认是失败了重试,即Failover机制.它还提供了其他的容错策略

1. Failover(失败自动切换)
  • 策略说明:当调用失败时,自动切换到其他服务器重试。这是Dubbo的默认容错策略,适用于读操作或幂等性的写操作。
  • 举例说明:假设有一个商品查询服务,当查询第一个服务器失败时,Dubbo会自动将请求切换到另一个服务器进行重试,直到查询成功或达到重试次数上限。
  • 配置示例<dubbo:reference interface="com.example.DemoService" retries="2"/>,其中retries表示重试次数,不包括第一次调用。
2. Failfast (快速失败)
  • 策略说明:只发起一次调用,失败立即报错。适用于非幂等性的写操作,如新增记录,以避免重复处理。
  • 举例说明:在订单生成场景中,如果第一次调用创建订单服务失败,Dubbo会立即报错,不再重试,以防止生成重复的订单。
3. Failsafe(失败安全)
  • 策略说明:调用失败时,直接忽略错误,继续执行后续逻辑。适用于记录日志等非核心业务逻辑。
  • 举例说明:在写入审计日志的场景中,如果日志服务调用失败,Dubbo会忽略该错误,继续执行后续操作,以保证主业务流程不受影响。
4. Failback(失败自动恢复)
  • 策略说明:调用失败后,不会立即报错,而是将失败请求缓存起来,定时重试,直到请求成功。适用于那些偶尔出现故障但期望未来可以恢复的服务调用。
  • 举例说明:在发送消息通知的场景中,如果第一次发送失败,Dubbo会将失败的消息缓存起来,并在后台定时重试,直到消息成功发送。
  • 需要注意的是,Failback策略目前有一些局限,如失败调用列表没有上限可能导致堆积,异步重试的执行间隔无法调整等
5. Broadcast(广播)
  • 策略说明:向所有服务提供者广播调用,逐个调用,任意一个报错则报错。适用于通知所有提供者更新缓存或日志文件等场景。
  • 举例说明:在缓存更新场景中,Dubbo会向所有缓存服务提供者广播更新请求,以确保所有缓存都得到更新。

记不住也可以同样查找cluster关键字,找到对应的接口,从这样我们也可以看见默认为什么是Failover

其他的策略接口

代码配置

    @DubboReference(cluster = "failover")

十二、序列化协议

网络传输的数据必须是二进制数据,但调用方请求的出入参数都是对象。此时对象需要实现Serializable接口,否则将会报错.

相关文章:

RPC远程调用框架Dubbo

一、分布式服务调用_什么是RPC RPC(Remote Procedure Call)远程过程调用&#xff0c;它是一种通过网络从远程计算机程序上请求服务。 大白话理解就是&#xff1a;RPC让你用别人家的东西就像自己家的一样。 RPC两个作用&#xff1a; 屏蔽远程调用跟本地调用的区别&#xff0c…...

基于STM32的智能灌溉系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码传感器读取和控制代码应用场景 农业灌溉花园自动灌溉常见问题及解决方案 常见问题解决方案结论 1. 引言 智能灌溉系统通过实时监测土壤湿度和环境温度&#xff0c;自动控制灌溉设…...

Datawhale AI 夏令营 Task3(半成品,仍在学习理解

课程链接 / 知识点整理 &#xff08;一&#xff09;...

细腻呵护静音生活缓冲器,家具中的隐形侍者

在忙碌的生活节奏中&#xff0c;家是我们寻找宁静与放松的避风港。而家具缓冲器&#xff0c;就像一位隐形的侍者&#xff0c;在不经意间为我们营造出温馨、宁静的居住环境。它们静静地工作&#xff0c;细腻地呵护着每一处细节&#xff0c;让家的每一次触碰成为一次尊享体验。 细…...

【MATLAB源码-第243期】基于simulink的CUK斩波电路仿真,输出各节点波形。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 CUK电路是一种高效的直流-直流转换器&#xff0c;它以其独特的能量传递方式和高效的电压转换能力&#xff0c;在许多电力电子应用中得到了广泛的使用。下面将详细描述CUK电路的工作原理、各个组成部分以及其在实际应用中的优…...

springboot项目不能同时跑junit4和junit5的解决方法

springboot项目的maven test只会跑junit4 RunWith注解的测试类&#xff0c;而不会跑junit5 ExtendWith的测试类 解决方法&#xff1a;pom加上以下plugin&#xff0c;版本号需要3.0.0-M5及以上 <plugin><groupId>org.apache.maven.plugins</groupId><art…...

【IO】使用消息队列完成两个进程之间相互通信

目录 1、使用消息队列完成两个进程之间相互通信 2、共享内存实现两个进程之间的通信 3、思维导图 1、使用消息队列完成两个进程之间相互通信 //msgsnd.c #include <myhead.h>// 要发送的消息类型 struct msgbuf {long mtype;char mtext[1024]; };// 定义一个宏&#…...

Web开发:用C#的逻辑理解VUE语法(VUE + Webapi小白开发笔记)

适用阅读对象&#xff1a;需要兼顾前端的C#后端开发人员&#xff08;基础笔记&#xff09; 目录 一、后端交互-获取实体数据 二、变量 1.声明 2.作用域 三、字符串的处理 四、数组(列表)的处理 1.数组中的SELECT语法&#xff08;提取特定字段到新数组&#xff09; 2.数…...

操作系统文件位置指针

文件位置指针 与标准IO的文件读写位置指针一样&#xff0c;系统IO时也会有一个表示位置的指针在移动&#xff0c;会随着读写操作的执行向后自动移动 当需要随机位置进行读写操作时&#xff0c;那么需要移动位置指针的位置 off_t lseek(int fd, off_t offset, int whence); 功…...

设计模式的概念

设计模式主要分为三类&#xff1a;创建类的设计模式、结构型设计模式、行为型设计模式。 创建类的设计模式&#xff1a;简单工厂&#xff0c;工厂模式&#xff0c;抽象工厂&#xff0c;建造者&#xff0c;单例&#xff0c;原型 结构型设计模式&#xff1a;代理模式、享元模式 行…...

VMware17下载与安装

1.下载 通过百度网盘分享的文件&#xff1a;VMware17 链接&#xff1a;https://pan.baidu.com/s/1gCine3d3Rp_l3NYAu5-ojg 提取码&#xff1a;ek25 --来自百度网盘超级会员V3的分享 2.安装...

mv命令学习

移动和重命名文件 mv mv命令的作用就是将文件系统的文件从一个地方移动到另一个地方。 $ pwd /home/scott/libby $ ls libby_arrowrock.jpg libby_bak.jpg libby.jpg ➥libby_on_couch.jpg on_floor $ ls ~/pictures/dogs libby_on_floor_01.jpg libby_on_floor_03.jpg li…...

西北航天基地采用Infortrend NAS存储做影视后期及共享

用户背景&#xff1a; 创建最早的综合型航空航天基地&#xff0c;占地5万平方米&#xff0c;每年约300天进行航天试验 挑战&#xff1a; 西北航天基地规模大任务多&#xff0c;分别有不同的项目组负责试验&#xff0c;项目组需要获取试验任务影像资料&#xff0c;用于分析总…...

GitHub每日最火火火项目(8.6)

项目名称&#xff1a;bghira / SimpleTuner 项目介绍&#xff1a;SimpleTuner是一个通用的微调工具包&#xff0c;主要面向Stable Diffusion 2.1、Stable Diffusion 3、DeepFloyd和SDXL等模型。它旨在为这些模型提供一种方便的方式进行微调&#xff0c;以适应不同的应用场景和需…...

LangChain与CI/CD的无缝对接:自动化部署的新前沿

LangChain与CI/CD的无缝对接&#xff1a;自动化部署的新前沿 在当今快速发展的软件开发领域&#xff0c;持续集成/持续部署&#xff08;CI/CD&#xff09;已成为提升开发效率和软件质量的关键实践。LangChain&#xff0c;作为一个假设的编程辅助工具&#xff0c;如果存在&…...

Laravel为什么会成为最优雅的PHP框架?

目录 1. 设计哲学 1.1 表达性语法 1.2 约定优于配置 1.3 优雅的异常处理 2. 核心特性 2.1 Eloquent ORM 2.2 路由系统 2.3 Blade模板引擎 2.4 Artisan命令行工具 3. 社区支持 3.1 丰富的文档和教程 3.2 Packalyst&#xff1a;丰富的扩展包 3.3 社区活动和会议 4.…...

LabVIEW中的Reverse String函数与字节序转换

在LabVIEW中&#xff0c;数据的字节序&#xff08;也称为端序&#xff09;问题通常出现在数据传输和存储过程中。字节序可以分为大端&#xff08;Big-Endian&#xff09;和小端&#xff08;Little-Endian&#xff09;&#xff0c;它们分别表示高字节存储在低地址和低字节存储在…...

用OpenCV与MFC写一个简单易用的图像处理程序

工厂里做SOP及测试报告以及员工资格鉴定等常需用到简单的图像处理&#xff0c;PS等软件正版费用不菲&#xff0c;学习起来成本也高。Windows自带的图像处理软件&#xff0c;用起来也不是那么得心应手。因此我用OpenCV与MFC写了一个简单易用的图像处理程序。 程序界面 基于简单…...

go语言的actor框架和air工具有什么区别?

Go语言的Actor框架和Air工具在多个方面存在显著的区别&#xff0c;主要体现在它们的设计目的、功能特性以及应用场景上。 ### Go语言的Actor框架 **设计目的与功能特性**&#xff1a; * **设计目的**&#xff1a;Actor框架是专为高并发和分布式系统设计的编程模型。它通过将系统…...

e6.利用 docker 快速部署自动化运维平台

利用 docker 快速部署自动化运维平台 1. 安装docker2. 拉取镜像3. 启动容器4. 初始化5. 访问测试 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主 机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

2.2.2 ASPICE的需求分析

ASPICE的需求分析是汽车软件开发过程中至关重要的一环&#xff0c;它涉及到对需求进行详细分析、验证和确认&#xff0c;以确保软件产品能够满足客户和用户的需求。在ASPICE中&#xff0c;需求分析的关键步骤包括&#xff1a; 需求细化&#xff1a;将从需求收集阶段获得的高层需…...

中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点

中科院1区顶刊|IF14&#xff1a;多组学MR联合单细胞时空分析&#xff0c;锁定心血管代谢疾病的免疫治疗新靶点 当下&#xff0c;免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入&#xff0c;我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…...

Docker环境下安装 Elasticsearch + IK 分词器 + Pinyin插件 + Kibana(适配7.10.1)

做RAG自己打算使用esmilvus自己开发一个&#xff0c;安装时好像网上没有比较新的安装方法&#xff0c;然后找了个旧的方法对应试试&#xff1a; &#x1f680; 本文将手把手教你在 Docker 环境中部署 Elasticsearch 7.10.1 IK分词器 拼音插件 Kibana&#xff0c;适配中文搜索…...

Flask和Django,你怎么选?

Flask 和 Django 是 Python 两大最流行的 Web 框架&#xff0c;但它们的设计哲学、目标和适用场景有显著区别。以下是详细的对比&#xff1a; 核心区别&#xff1a;哲学与定位 Django: 定位: "全栈式" Web 框架。奉行"开箱即用"的理念。 哲学: "包含…...

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决 2025/6/7 17:20 缘起&#xff1a; 1、根据RK809的DATASHEET&#xff0c;短按开机【100ms/500ms】/长按关机&#xff0c;长按关机。6s/8s/10s 我在网上找到的DATASHE…...