惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
The GitHub Blog
The GitHub Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
U
Unit 42
Y
Y Combinator Blog
I
InfoQ
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
量子位
Microsoft Security Blog
Microsoft Security Blog
B
Blog
The Cloudflare Blog
F
Fortinet All Blogs
Google DeepMind News
Google DeepMind News
MyScale Blog
MyScale Blog
C
Check Point Blog
S
SegmentFault 最新的问题
爱范儿
爱范儿
博客园 - 叶小钗
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
罗磊的独立博客
T
Tailwind CSS Blog

博客园 - KLAPT

Spring Framework 自带工具类 Spring Web MVC 中,过滤器(Filter) 和 拦截器(Interceptor) SpringBoot API 接口防刷 ROW_NUMBER() 一台服务器最大能支持多少条 TCP 连接 Gateway 网关 CodeX =>Skills Redis 内存满了怎么处理 SpringBoot 默认配置修改 JWT 续签 Access Token + Refresh Token 双 Token claudeCode 命令 MyBatis 的 Mapper 接口 AI | CC GUI 集成 IDEA 完整教程 在IDEA中使用Claude Code IDEA中使用CodeX MyBatisPlus解决大数据量查询慢问题 idea 中的 claude code Token Transactional 注解中propagation 掌握 Spring 框架这 10 个扩展点 SpringBoot 快速实现 api 加密 Spring Boot/Cloud 中 bootstrap.yml 与 application.yml SpringBoot 实现 DOCX 转 PDF 微服务Token鉴权设计的几种方案 进程、线程、协程 RSA 加密 Java二维码 ntp服务端和客户端 Chronyd与NTP chronyd 作为服务器时钟
Dubbo 和 Spring Cloud Gateway的区别
KLAPT · 2026-06-04 · via 博客园 - KLAPT

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