Dubbo 作为一款高性能的 Java RPC 框架,默认主要支持 Dubbo 协议(基于 TCP 的二进制私有协议),但通过扩展或结合其他组件,也能支持 HTTP 协议(如 RESTful 风格的 HTTP 调用)。以下是配置 Dubbo 使用 HTTP 协议的完整流程,涵盖 原生 Dubbo 的 HTTP 扩展、结合 Spring Boot 的配置、常见实现方案(如 Dubbo-HTTP、Dubbo over HTTP)以及关键注意事项。
![图片[1]_Dubbo 配置 HTTP 协议全过程详解_知途无界](https://zhituwujie.com/wp-content/uploads/2025/10/d2b5ca33bd20251021091943.png)
一、Dubbo 原生对 HTTP 的支持说明
Dubbo 原生核心协议(如 dubbo://、rest://)默认不直接提供标准的 HTTP/1.1 RESTful 接口,但通过以下两种主流方式间接支持 HTTP 协议:
- **
rest://协议(官方扩展)
Dubbo 2.7+ 提供了实验性的rest协议,基于 JAX-RS(如 Jersey、RESTEasy) 或 Spring MVC** 实现,允许将 Dubbo 服务暴露为 HTTP/REST 接口(类似 Spring Cloud 的 REST 风格)。 - Dubbo 服务通过 HTTP 网关代理
更常见的生产实践是通过 API 网关(如 Nginx、Kong、Spring Cloud Gateway) 将 HTTP 请求转发到 Dubbo 的 Dubbo 协议端口(如 dubbo://:20880),由网关处理 HTTP 到 Dubbo 协议的转换(如 JSON <-> Java 对象、路径映射)。 - 第三方扩展(如 dubbo-http)
社区或企业可能提供第三方模块(如dubbo-http),将 Dubbo 服务直接映射为 HTTP 接口(需额外依赖)。
二、方案一:使用 Dubbo 原生 rest:// 协议(推荐官方扩展)
1. 环境准备
- Dubbo 版本:2.7.x 或更高(
rest协议在 2.7+ 中支持更完善)。 - 依赖:需引入 JAX-RS 实现(如 Jersey) 或 Spring MVC(根据选择的实现方式)。
2. 添加依赖(以 Jersey 为例)
在 pom.xml 中添加 Dubbo 和 Jersey 的依赖:
<!-- Dubbo 核心依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.20</version> <!-- 根据实际版本调整 -->
</dependency>
<!-- JAX-RS 实现(Jersey) -->
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.35</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.35</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.35</version>
</dependency>
3. 定义 Dubbo 服务接口
使用 JAX-RS 注解(如 @Path、@GET)定义 HTTP 接口,同时通过 Dubbo 的 @Service 暴露服务:
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import org.apache.dubbo.config.annotation.DubboService;
// Dubbo 服务注解(暴露服务)
@DubboService // 相当于 @Service(interfaceClass = UserRestService.class)
// JAX-RS 接口定义(HTTP 映射)
@Path("/users") // 根路径
public class UserRestServiceImpl implements UserRestService {
@GET
@Path("/{id}") // 子路径
@Produces(MediaType.APPLICATION_JSON) // 返回 JSON
public User getUser(@PathParam("id") Long id) {
return new User(id, "User-" + id);
}
@POST
@Path("/create")
@Consumes(MediaType.APPLICATION_JSON) // 接收 JSON
public String createUser(User user) {
return "Created: " + user.getName();
}
}
// 服务接口(需单独定义,与实现类一致)
public interface UserRestService {
User getUser(Long id);
String createUser(User user);
}
// 数据模型
public class User {
private Long id;
private String name;
// 构造方法、getter/setter 省略...
}
4. 配置 Dubbo 与 HTTP 协议
在 application.yml(Spring Boot)中配置 Dubbo 服务暴露的协议为 rest,并指定端口和上下文路径:
dubbo:
application:
name: dubbo-http-demo
protocol:
name: rest # 使用 rest 协议
port: 8080 # HTTP 服务端口(默认 8080)
contextpath: /api # 可选:服务上下文路径(如 /api/users/1)
registry:
address: zookeeper://127.0.0.1:2181 # 注册中心(可选,若需服务发现)
关键参数说明:
name: rest:指定协议为 Dubbo 的rest扩展(非原生 HTTP)。port: 8080:HTTP 服务监听的端口(客户端通过http://ip:8080/api/users/1访问)。contextpath: /api:可选,为所有接口添加统一前缀(如/api/users)。
5. 启动与验证
启动 Spring Boot 应用后,Dubbo 会将 UserRestService 暴露为 HTTP 接口:
- GET 请求:
http://localhost:8080/api/users/1→ 返回{"id":1,"name":"User-1"}。 - POST 请求:
http://localhost:8080/api/users/create(Body 为 JSON{"id":2,"name":"Test"})→ 返回"Created: Test"。
三、方案二:Dubbo 服务通过 HTTP 网关代理(生产推荐)
若不想直接修改 Dubbo 服务代码,更常见的做法是通过 API 网关 将 HTTP 请求转发到 Dubbo 的原生协议端口(如 dubbo://:20880)。步骤如下:
1. 暴露 Dubbo 原生服务
在 application.yml 中配置 Dubbo 使用默认的 dubbo 协议(TCP 私有协议):
dubbo:
application:
name: dubbo-native-demo
protocol:
name: dubbo # 默认协议(基于 TCP)
port: 20880 # Dubbo 服务端口
registry:
address: zookeeper://127.0.0.1:2181
定义普通 Dubbo 服务(无需 HTTP 注解):
import org.apache.dubbo.config.annotation.DubboService;
@DubboService
public class UserServiceImpl implements UserService {
@Override
public User getUser(Long id) {
return new User(id, "User-" + id);
}
}
2. 配置 API 网关(以 Nginx 为例)
通过 Nginx 将 HTTP 请求(如 http://gateway:80/api/users/1)转发到 Dubbo 服务的消费端(或直接到 Dubbo Provider 的 HTTP 适配层):
server {
listen 80;
server_name gateway.example.com;
location /api/users/ {
# 方案1:转发到 Dubbo 消费端(需消费端提供 HTTP 接口)
proxy_pass http://dubbo-consumer:8080/internal-api;
# 方案2:通过 Dubbo HTTP 适配服务(如自定义网关服务)
# proxy_pass http://dubbo-http-adapter:8080;
}
}
更常见的生产实践:使用 Spring Cloud Gateway 或 Kong 等网关,结合 Dubbo 客户端 将 HTTP 请求转换为 Dubbo RPC 调用(网关收到 HTTP 请求后,通过 Dubbo 客户端调用对应的
@DubboReference服务)。
四、方案三:第三方扩展(如 dubbo-http)
部分社区项目(如 dubbo-http)提供将 Dubbo 服务直接映射为 HTTP 接口的模块。以 Spring Boot 为例:
1. 添加依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.20</version>
</dependency>
<dependency>
<groupId>com.example</groupId> <!-- 假设第三方库的 groupId -->
<artifactId>dubbo-http-adapter</artifactId>
<version>1.0.0</version>
</dependency>
2. 配置 HTTP 映射
通过注解或配置文件将 Dubbo 服务接口映射为 HTTP 路径(具体实现依赖第三方库的规则)。
五、关键注意事项
- 协议选择建议:
- 内部服务调用:优先使用 Dubbo 原生协议(
dubbo://),性能更高(二进制编码、长连接)。 - 对外暴露 HTTP 接口:使用
rest://协议(官方扩展)或通过网关代理(更灵活,支持跨语言)。
- 内部服务调用:优先使用 Dubbo 原生协议(
- 性能与安全:
rest://协议基于 HTTP/1.1,性能低于 Dubbo 原生协议,但兼容性更好(浏览器、移动端可直接调用)。- 生产环境需配置 HTTPS(通过网关或 Dubbo 的 SSL 扩展)和鉴权(如 JWT、OAuth2)。
- 跨语言支持:
- 若需支持非 Java 客户端(如 Python、JavaScript),优先使用
rest://(RESTful 接口天然跨语言)或通过网关转换为 JSON-RPC/gRPC。
- 若需支持非 Java 客户端(如 Python、JavaScript),优先使用
- 调试工具:
- 使用 Postman 或 curl 测试 HTTP 接口(如
curl http://localhost:8080/api/users/1)。 - 通过 Dubbo Admin(官方管理控制台)监控服务状态。
- 使用 Postman 或 curl 测试 HTTP 接口(如
六、总结
| 方案 | 适用场景 | 协议类型 | 实现复杂度 | 性能 | 跨语言支持 |
|---|---|---|---|---|---|
Dubbo rest:// 协议 | 需要直接暴露 HTTP/REST 接口的 Java 服务 | HTTP/1.1(REST) | 中等 | 中等 | 高(天然支持) |
| HTTP 网关代理 | 生产环境对外暴露服务(兼容 Dubbo 原生协议) | Dubbo(TCP) + HTTP 网关 | 低(依赖网关) | 高(Dubbo 原生) | 依赖网关配置 |
| 第三方扩展(如 dubbo-http) | 特定场景的 HTTP 映射需求 | 自定义 HTTP | 高(依赖社区) | 可变 | 可变 |
推荐选择:
- 快速验证或对外提供 HTTP 接口 → Dubbo
rest://协议(官方支持,配置简单)。 - 生产环境高并发、低延迟需求 → Dubbo 原生协议 + HTTP 网关代理(性能最优,灵活扩展)。
通过上述任一方案,均可实现 Dubbo 服务的 HTTP 协议支持,根据实际需求选择最适合的路径即可。

























暂无评论内容