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

推荐订阅源

cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
Vercel News
Vercel News
T
The Blog of Author Tim Ferriss
F
Full Disclosure
A
About on SuperTechFans
C
Check Point Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
Know Your Adversary
Know Your Adversary
K
Kaspersky official blog
L
LINUX DO - 热门话题
Recorded Future
Recorded Future
C
Cisco Blogs
M
MIT News - Artificial intelligence
T
Tenable Blog
G
GRAHAM CLULEY
月光博客
月光博客
Recent Announcements
Recent Announcements
V
Visual Studio Blog
IT之家
IT之家
T
The Exploit Database - CXSecurity.com
The GitHub Blog
The GitHub Blog
T
Threat Research - Cisco Blogs
D
DataBreaches.Net
P
Privacy International News Feed
P
Proofpoint News Feed
I
Intezer
博客园 - 叶小钗
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Hacker News
The Hacker News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - Franky
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
P
Palo Alto Networks Blog
Last Week in AI
Last Week in AI
小众软件
小众软件
Hacker News - Newest:
Hacker News - Newest: "LLM"
O
OpenAI News
N
News and Events Feed by Topic
Microsoft Security Blog
Microsoft Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
N
News and Events Feed by Topic
The Cloudflare Blog
Spread Privacy
Spread Privacy
酷 壳 – CoolShell
酷 壳 – CoolShell
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
B
Blog RSS Feed

博客园 - KLAPT

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 作为服务器时钟 chrony sudo命令和su 的区别 java -cp 和 java -jar Maven 项目打包:实现业务代码与第三方依赖分离 达梦数据库创建用户 梦数据库新增大字段报错问题 达梦数据库操作 MySQL UPDATE多表关联更新 达梦数据库 为HTTP POST请求设置请求体 在Java中调用第三方接口并返回第三方页面 Java调用第三方接口的方法 Nginx 之Rewrite 使用详解 linux 命令 Spring Boot项目中集成Spring Security OAuth2和Apache Shiro
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、开放平台、第三方系统。