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、开放平台、第三方系统。

posted @ 2026-06-04 22:34  KLAPT  阅读(3)  评论(0)    收藏  举报