Dubbo与Spring Cloud Gateway:完全不同的两个世界
·
Dubbo与Spring Cloud Gateway:完全不同的两个世界
|
🌺The Begin🌺点点关注,收藏不迷路🌺
|
引言
在微服务架构的讨论中,经常有人会混淆Dubbo和Spring Cloud Gateway,认为它们都是微服务框架,但实际上它们处于完全不同的层次,解决的是完全不同的问题。本文将深入剖析两者的本质区别,并通过实际场景说明它们如何协同工作。
一、核心定位对比
架构层次对比
核心定位差异
| 维度 | Dubbo | Spring Cloud Gateway |
|---|---|---|
| 定位 | RPC服务框架 | API网关 |
| 作用范围 | 内部服务间通信 | 外部请求入口 |
| 通信协议 | Dubbo协议(主要)、REST、gRPC等 | HTTP/HTTPS、WebSocket |
| 调用方式 | 点对点直接调用 | 统一入口转发 |
| 服务对象 | 内部服务消费者 | 外部客户端 |
二、功能特性对比
1. Dubbo的核心功能
2. Spring Cloud Gateway的核心功能
三、工作流程对比
Dubbo调用流程
Spring Cloud Gateway调用流程
四、实际应用场景
场景1:典型微服务架构
场景2:Dubbo协议转HTTP
@Configuration
public class DubboGatewayConfig {
@Bean
public RouteLocator dubboRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("order-service", r -> r
.path("/api/order/**")
.filters(f -> f
// 将HTTP请求转换为Dubbo泛化调用
.filter(new DubboGenericFilter())
.addRequestHeader("X-Source", "gateway"))
.uri("dubbo://order-service:20880"))
.build();
}
@Component
public static class DubboGenericFilter implements GlobalFilter {
@Autowired
private DubboGenericService genericService;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
// 提取HTTP请求参数
String method = request.getMethod().name();
String path = request.getURI().getPath();
MultiValueMap<String, String> params = request.getQueryParams();
// 转换为Dubbo泛化调用参数
String dubboMethod = mapToDubboMethod(path);
Object[] dubboParams = mapToDubboParams(params);
// 执行Dubbo泛化调用
return Mono.fromCallable(() ->
genericService.$invoke(dubboMethod, dubboParams))
.map(result -> {
// 将Dubbo结果转为HTTP响应
exchange.getResponse().getHeaders()
.setContentType(MediaType.APPLICATION_JSON);
return exchange.getResponse()
.writeWith(Mono.just(result));
});
}
}
}
场景3:网关集成Dubbo服务发现
@Configuration
@EnableDiscoveryClient
public class GatewayDiscoveryConfig {
@Bean
public DiscoveryClientRouteDefinitionLocator discoveryRouteLocator(
RouteDefinitionLocator locator,
DiscoveryClient discoveryClient) {
return new DiscoveryClientRouteDefinitionLocator(
discoveryClient, locator);
}
// 自定义Dubbo服务发现
@Bean
public DiscoveryClient dubboDiscoveryClient() {
return new DubboDiscoveryClient();
}
public class DubboDiscoveryClient implements DiscoveryClient {
@Override
public List<ServiceInstance> getInstances(String serviceId) {
// 从Dubbo注册中心获取服务实例
List<ServiceInstance> instances = new ArrayList<>();
// 查询Dubbo服务提供者
Set<ProviderConfig> providers =
registryService.lookup(serviceId);
for (ProviderConfig provider : providers) {
instances.add(new DefaultServiceInstance(
provider.getId(),
serviceId,
provider.getHost(),
provider.getPort(),
false
));
}
return instances;
}
}
}
五、协同工作模式
1. 网关作为Dubbo消费者
@RestController
@RequestMapping("/api/order")
public class OrderController {
@DubboReference(version = "1.0.0")
private OrderService orderService; // Dubbo服务引用
@GetMapping("/{id}")
public Result getOrder(@PathVariable Long id) {
// 网关层直接调用Dubbo服务
Order order = orderService.getOrder(id);
return Result.success(order);
}
}
2. 服务间Dubbo调用
// 订单服务
@Service
public class OrderServiceImpl implements OrderService {
@DubboReference
private UserService userService; // 调用用户服务
@DubboReference
private ProductService productService; // 调用商品服务
@Override
public Order getOrder(Long id) {
Order order = orderMapper.selectById(id);
// 通过Dubbo调用获取用户信息
User user = userService.getUser(order.getUserId());
order.setUser(user);
// 通过Dubbo调用获取商品信息
Product product = productService.getProduct(order.getProductId());
order.setProduct(product);
return order;
}
}
3. 完整调用链路
六、选型建议
1. 何时使用Dubbo?
- 内部服务间通信:需要高性能RPC调用
- 复杂服务治理:需要服务路由、容错策略
- 多协议支持:需要多种通信协议
- 已有Dubbo生态:团队熟悉Dubbo开发模式
2. 何时使用Spring Cloud Gateway?
- 外部流量入口:需要统一处理外部请求
- 安全防护:需要认证鉴权、防攻击
- 流量控制:需要精细化限流策略
- 协议转换:需要HTTP转其他协议
3. 架构设计建议
七、总结
Dubbo和Spring Cloud Gateway的本质区别:
-
定位不同:
- Dubbo:服务间RPC通信框架
- Gateway:外部流量统一入口
-
作用范围:
- Dubbo:内部服务调用
- Gateway:外部请求处理
-
协议支持:
- Dubbo:主要支持Dubbo协议
- Gateway:主要支持HTTP/HTTPS
-
功能侧重:
- Dubbo:服务治理、负载均衡
- Gateway:路由转发、安全防护
在实际架构中,它们通常是协同工作而不是相互替代的关系:
- Gateway 负责处理外部请求
- Dubbo 负责处理内部服务调用
- 两者通过协议转换实现无缝集成
思考题:
- 在你的项目中,Dubbo和Gateway是如何配合使用的?
- 如果要在Gateway中调用Dubbo服务,有哪些注意事项?
- 服务网格(Service Mesh)的出现会对这种架构产生什么影响?
欢迎在评论区分享你的实践经验!

|
🌺The End🌺点点关注,收藏不迷路🌺
|
更多推荐




所有评论(0)