远程调用框架Dubbo
约 2806 字大约 9 分钟
2025-09-12
远程调用框架
远程调用框架是一类用于支持分布式系统中不同进程或不同计算机之间相互通信和调用功能的软件工具或库。简单来说,它让程序可以像调用本地函数方法一样,去调用运行在另一台机器上的服务或函数,而开发者无需过多关心底层网络通信的复杂性。
远程调用框架的核心功能
一个典型的远程调用框架通常提供以下能力:
透明化远程调用:开发者可以像调用本地方法一样去调用远程服务,无需手动处理网络连接、数据序列化等细节;
通信协议支持:提供高效、可靠的网络通信机制,如TCP、HTTP、gRPC协议;
服务发现与注册:支持服务的发现与注册,使得调用方可以动态找到被调用的服务地址(尤其在微服务构架中极为重要);
序列化与反序列化:将函数参数和返回值在调用方和被调用方之间进行序列化(转为字节流传输)和反序列化(还原为对象);
负载均衡和容错:在多个服务实例间进行请求的负载均衡,并处理服务调用失败、超时、重试等问题;
服务治理能力:包括限流、熔断、日志、链路追踪等,保障系统的稳定性和可观测性;
常见的远程调用框架和协议
RPC(远程过程调用,Remote Producer Call)框架
RPC框架是一种让调用远程服务像调用本地函数一样简单的技术,相关框架有:
gRPC(Google开发,基于HTTP/2和Protocol Bffers,高性能,支持多语言);
Dubbo(阿里巴巴开源,面向Java的高性能RPC框架,广泛用于微服务);
Thrift(Facebook开源,支持多语言,包含接口定义语言和RPC框架);
Hessian(轻量级RPC,常用于Java应用之间的远程调用);
Spring Cloud Alibaba / Spring Cloud Netfix(基于HTTP的RESTful服务调用,也整合了RPC思想);
RESTful API(基于HTTP的远程调用)
虽然严格意义上REST不算传统的RPC,但在实际开发中,通过HTTP接口(如JSON over HTTP)也是一种非常普遍的远程调用方式,常用的框架包括:
Spring Boot + Spring Web(构建RESTful服务)
Axios / Fetch (前端调用后端HTTP接口)
Dubbo
Dubbo是阿里巴巴开源的一款高性能、轻量级Java RPC(远程过程调用)框架,专注与分布式系统中服务通信与服务治理,旨在帮助企业构建稳定、高效的分布式架构。它通过屏蔽底层网络通信细节,让开发者能够像调用本地方法一样调用远程服务,同时提供了一套完整的服务治理工具,解决分布式系统中的服务注册、发现、负载均衡、容错等问题。
在云原生时代,Dubbo相继衍生出了Dubbo3、Proxyless Mesh等架构与解决方案,在易用性、超大规模微服务时间、云原生基础设施适配、安全性等几大方向上进行了全面升级。

Dubbo整体分为服务治理抽象控制面和Dubbo数据面:
服务治理控制面:服务治理部是特指如注册中心类的单个具体组件,而是对Dubbo治理体系的抽象表达。控制面包含协调服务发现的注册中心、流量管控、Dubbo Admin控制台等,如果采用了Service Mesh架构则还包含Istio等服务网格控制面;
Dubbo数据面:数据面代表集群部署的所有Dubbo进程,进程件通过RPC通信协议实现数据交换,Dubbo定义了微服务开发与调用规范并负责完成数据传输的编解码工作。
服务消费者:发起业务调用或RPC通信的Dubbo进程
服务提供者:接受业务调用或RPC调用的Dubbo进程
通信协议
Dubbo不绑定任何一款特定的通信协议,支持HTTP/2、REST、gRPC、JsonRPC、Thrift、Hessian2等几乎所有主流的通信协议,Dubbo框架都可以提供支持。

快速开始
引入依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.3.4</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>3.3.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>服务提供者
Dubbo支持很多的注册中心,我们本地演示以Nacos作为注册中时的相关配置:
server:
port: 9900
spring:
application:
name: dubbo-provider
dubbo:
consumer:
timeout: 3000
check: false
protocol:
name: dubbo
port: -1
registry:
address: nacos://124.222.91.208:8848
parameters:
namespace: 9b85dd8f-78be-4f7e-a27d-5a92f309d9eb
group: DUBBO_GROUP
application:
name: ${spring.application.name}
qos-enable: true
qos-accept-foreign-ip: false编写需要具体提供的服务:
@DubboService
public class ProducerServiceImpl implements ProducerService {
@Override
public String getMessage() {
return "hello";
}
}@DubboService注解标注了服务的提供的内容,Dubbo会将服务的内容注册到Nacos上:
@DubboService注解支持的属性配置如下:
| 属性名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| version | String | 否 | "0.0.0"或无默认,通常建议显式设置 | 服务的版本号,用于区分同一接口的不同实现版本,消费端可通过 version 来指定调用哪个版本的服务。例如:version = "1.0.0" |
| group | String | 否 | 无默认值 | 服务的分组,用于对服务进行逻辑分组,常用于多租户或模块拆分等场景。消费端可通过 group 指定调用哪个分组下的服务。 |
| interfaceClass | Class<?> | 否 | 无(默认使用实现类实现的唯一接口) | 指定该服务实现对应的具体 Dubbo 服务接口。如果一个类实现了多个接口,推荐显式指定该属性来明确暴露哪一个接口。 |
| interfaceName | String | 否 | 无 | 服务接口的全限定名,可以作为 interfaceClass 的替代方式,一般较少使用。 |
| generic | boolean | 否 | false | 是否为泛化服务。如果设置为 true,则表示该服务是一个泛化服务,通常用于客户端不依赖服务接口 jar 包的场景(如通过 API 方式调用)。 |
| timeout | int | 否 | 默认使用全局配置(通常为 1000ms) | 服务方法调用的超时时间(单位:毫秒)。可覆盖全局配置。 |
| retries | int | 否 | 默认使用全局配置(通常为 2) | 远程调用失败后的重试次数,不包括第一次调用。设置为 0 表示不重试。 |
| cluster | String | 否 | 默认使用全局配置(如 "failover") | 集群容错模式,比如:failover(失败自动切换)、failfast(快速失败)、failsafe(失败安全)等。 |
| loadbalance | String | 否 | 默认使用全局配置(如 "random") | 负载均衡策略,比如:random(随机)、roundrobin(轮询)、leastactive(最少活跃调用数)等。 |
| async | boolean | 否 | false | 是否为异步服务。如果设置为 true,则服务提供者不会阻塞等待结果,而是立即返回 Future 对象。消费端需要通过异步方式获取结果。 |
| sent | boolean | 否 | true | 仅当 async=true 时有效。是否在调用线程发送请求后立即返回(true),还是等请求发送到网络后才返回(false)。 |
| delay | int | 否 | 0 | 服务暴露延迟时间(单位:秒)。设置为正整数表示服务将在应用启动后 delay 秒后再暴露。例如 delay=5 表示延迟 5 秒暴露。 |
| mock | String 或 boolean | 否 | false | 服务 mock 配置,用于服务降级或模拟返回。可以是: |
true:表示使用接口名 + Mock后缀的类作为 mock 实现"return null":直接返回 null- 自定义 mock 类全名,如
"com.example.MockServiceImpl"| |cache|String|否|无默认值(通常关闭)|服务缓存策略,比如"lru"、"threadlocal"等,根据需求开启方法级缓存。| |validation|boolean|否|false|是否启用参数校验(基于 JSR303)。需要引入相关依赖并配置校验规则。| |connections|int|否|默认使用全局配置|对每个提供者的最大连接数,用于控制客户端与服务提供者之间的连接数限制。| |actives|int|否|无默认值(通常使用全局)|每个方法的最大并发活跃调用数,超过则排队或拒绝。| |executes|int|否|无默认值|服务端对单个方法的最大并发执行数,超过会抛异常或限流。| |deprecated|boolean|否|false|标记该服务是否已废弃,可用于提示调用方。| |accesslog|String|否|无默认值|是否开启访问日志,可以设置为"true"开启简单日志,或者指定日志输出格式/目标。| |weight|int|否|100|服务权重,用于负载均衡时影响流量分配,值越大分配的流量越多。| |document|String|否|无|服务的文档说明,可用于生成文档。| |tags|String[]|否|无|服务标签,Dubbo 2.7+ 引入,用于更细粒度的服务分组和路由,比如配合标签路由功能使用。| |registry|String[] 或 RegistryConfig[]|否|无(默认使用所有注册中心)|指定该服务发布到哪些注册中心,可以指定注册中心 ID。通常不需要手动设置,除非有多个注册中心且要定向发布。| |provider|String 或 ProviderConfig|否|无|引用一个全局的 ProviderConfig 配置的 ID,用于复用提供者配置。|
服务消费者
与服务提供者一样,服务的消费者在不提供接口的时候它是不会将自己注册到Nacos上的。但是仍然需要配置Nacos的信息,因为它需要从Nacos来获取服务提供方的调用信息。
server:
port: 9700
spring:
application:
name: dubbo-consumer
consumer:
timeout: 3000 # 【重要】默认的远程服务调用超时时间,单位:毫秒(这里为 3 秒)。如果具体服务配置了 timeout 会覆盖此值
check: false # 【重要】是否在启动时检查依赖的服务是否可用。false 表示不检查,即使依赖的 Dubbo 服务未启动,消费者应用也能正常启动。适合开发或服务依赖可能延迟的场景
protocol:
name: dubbo # 使用的协议名称,这里是 Dubbo 默认的 dubbo 协议(基于 TCP 的高性能 RPC 协议)
port: -1 # Dubbo 服务暴露的端口,-1 表示不暴露服务(因为这是消费者配置,通常不需要暴露服务)。如果是服务提供者,这里应该设置具体的端口,如 20880
registry:
address: nacos://124.222.91.208:8848
parameters:
namespace: 9b85dd8f-78be-4f7e-a27d-5a92f309d9eb
group: DUBBO_GROUP
application:
name: ${spring.application.name}
qos-enable: true # 是否启用 Dubbo QOS(服务质量)功能,提供了一些运行时管理能力,比如 dubbo-cli 工具连接查看服务状态等
qos-accept-foreign-ip: false # 是否允许外部 IP 访问 QOS 服务。false 表示只允许本地或内网访问,出于安全考虑,生产环境建议保持 false 或配合防火墙使用创建一个测试用的接口
@RestController
@RequestMapping("/test")
public class TestController {
@DubboReference(version = "1.0.0")
private ProducerService producerService;
@RequestMapping("/getMessage")
public String getMessage() {
return producerService.getMessage();
}
}调用该接口可以看到返回了“hello”:
