Dubbo 和 Spring Cloud Gateway的区别
Dubbo 干的是服务之间的调用。
Spring Cloud Gateway 干的是入口流量的转发、拦截和改造。
一个在系统里面跑,一个站在系统门口挡请求。
Dubbo 官方给它的定位是 RPC 服务开发框架,处理微服务之间的远程调用、服务发现、流量治理、可观测这些东西。Spring Cloud Gateway 的核心则是 Route、Predicate、Filter,按请求特征匹配路由,再在请求进出时做过滤处理。
比如订单服务要查用户积分,我一般不会让它走 Gateway:
public interface UserCreditFacade {
CreditSnapshot querySnapshot(Long userId);
}
@DubboService(version = "1.0.0", timeout = 800)
publicclass UserCreditFacadeImpl implements UserCreditFacade {
privatefinal CreditAccountRepository creditAccountRepository;
public UserCreditFacadeImpl(CreditAccountRepository creditAccountRepository) {
this.creditAccountRepository = creditAccountRepository;
}
@Override
public CreditSnapshot querySnapshot(Long userId) {
CreditAccount account = creditAccountRepository.findActiveAccount(userId);
if (account == null) {
return CreditSnapshot.empty(userId);
}
returnnew CreditSnapshot(userId, account.getAvailable(), account.getFrozen());
}
}
消费方就是正常引用:
@Component
public class OrderPriceAssembler {
@DubboReference(version = "1.0.0", check = false, timeout = 800)
private UserCreditFacade userCreditFacade;
public PriceView build(Long userId, Long skuId) {
CreditSnapshot credit = userCreditFacade.querySnapshot(userId);
// 这里故意不把 Dubbo 调用藏太深,排查超时时能一眼看到
return new PriceView(skuId, credit.availableCredit());
}
}
这种调用看重什么?
看重接口契约、序列化、超时、重试、负载均衡、服务分组、版本隔离。 它是“我明确知道我要调哪个服务的哪个方法”。
Gateway 不是这么玩的。
Gateway 面对的是 HTTP 请求。它关心的是这个请求该不该进来,进来以后转到哪个后端,路径要不要改,请求头要不要补,灰度标记要不要塞进去。
@Configuration
publicclass MallGatewayRouteConfig {
@Bean
public RouteLocator mallRoutes(RouteLocatorBuilder routes) {
return routes.routes()
.route("order-api", r -> r
.path("/api/order/**")
.filters(f -> f
.stripPrefix(1)
.addRequestHeader("X-Entry", "gateway")
.filter(new TraceHeaderFilter()))
.uri("lb://order-service"))
.route("member-api", r -> r
.path("/api/member/**")
.filters(f -> f.stripPrefix(1))
.uri("lb://member-service"))
.build();
}
staticclass TraceHeaderFilter implements GatewayFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String traceId = exchange.getRequest()
.getHeaders()
.getFirst("X-Trace-Id");
if (traceId == null || traceId.isBlank()) {
traceId = UUID.randomUUID().toString().replace("-", "");
}
ServerHttpRequest request = exchange.getRequest()
.mutate()
.header("X-Trace-Id", traceId)
.build();
return chain.filter(exchange.mutate().request(request).build());
}
}
}
这段代码里就能看出味道。
Dubbo 写的是 Java 接口。 Gateway 写的是 HTTP 路由规则。
Dubbo 关心“服务方法”。 Gateway 关心“请求路径”。
Dubbo 的调用方一般是另一个后端服务。 Gateway 的调用方通常是浏览器、App、开放平台、第三方系统。

浙公网安备 33010602011771号