做海淘业务的系统,和做普通商城系统有个特别大的区别:你根本没法假设用户、商品、库存、支付这几样东西在一个网络区域内。API 网关在海淘系统里的角色,就不再只是一个转发流量的入口,它得更像一个“调度中枢”,要把跨区域请求、多币种字段、外部依赖超时、以及大促脉冲流量这些问题全部兜住。这篇文章我会从实际改造经历出发,把我们在海淘系统上落地 API 网关时解决过的几个典型问题、踩过的坑、以及事后复盘出来的规则,完整记录下来。如果你正在给跨境商城或者多区域业务设计网关方案,这份实践笔记应该能帮你省掉不少弯路。
1. 海淘系统在网关上遇到的四道特殊考题
1.1 用户、货源、服务三端分处不同网络区域
境内电商最常见的部署模式是“客户端就近访问 CDN 或者云上入口,入口后面就是同一地域的微服务集群”,网络模型简单,请求链路上最大的不确定性往往只来自客户端弱网。但海淘系统完全不一样,用户可能在东八区,货源仓可能在另一个大洲,商品数据库也可能独立部署在货源侧,第三方的支付、物流轨迹、清关状态接口又散落在不同的服务商那里。
这就带来一个很直接的后果:任何需要跨区域拿数据的操作,单次网络往返可能就要几十毫秒甚至上百毫秒。商品详情页如果画面上需要展示商品信息、可售库存、含税预估价格、运费时效这四组数据,客户端要是按老思路挨个接口去请求,在跨区域网络下体验会很差。一次详情操作背后可能是四五次串行接口调用,首屏出来已经非常吃力。
所以海淘系统的 API 网关,第一个硬指标就是要能做接口聚合。它不能只会匹配路径、转发请求,它必须能在网关层把多个下游服务的数据拼装成一个面向客户端的 JSON 返回。换句话说,网关在这里不是普通反向代理,而是承担了一个轻量级 BFF 的职责。
1.2 海淘业务提出的四个要求,普通网关为什么接不住
很多团队早期会直接把 Nginx 当作网关来用。如果是境内单机房业务,用 Nginx 做七层转发、简单限流、SSL 终止,确实也够用。可一旦迁移到海淘场景,有四个要求会陆续浮出水面:
第一,路由维度变多了。境内电商路由一般只按业务模块划分,比如 /user 开头的请求转发到用户服务,/order 开头转发到订单服务。海淘系统还要叠加“地区”这么一个维度。同一个商品详情接口,用户在哪个地区看到的价格、税费、可配货仓需要按照地区策略来;甚至有些商品只允许部分地区下单,路由规则里必须能做拦截。
第二,接口返回的字段不能只当普通 JSON 处理。商品价格字段可能是美元,也可能是欧元,订单金额还可能经过汇率转换。网关在转发时如果只是死板地把请求体转发过去,遇到币种换算、金额校验这类需求时,就得在下游每个服务里分别处理,非常容易不统一。
第三,外部依赖的失败概率更高。海淘订单状态流转时常要等第三方支付回调、海外仓发货回执、物流轨迹同步,任何一个环节超时都可能让整个下单接口失败。网关不能把后端错误直接抛给 C 端页面,必须能在超时后快速降级,或者返回一个本地可用的兜底结果。
第四,安全和限流策略不能按境内思维去做。海淘场景里存在大量代拍、抢单类流量,而且由于用户的出口网络经常比较集中,按纯 IP 维度去限流很容易让一批正常用户受影响。网关需要把限流维度细化到用户、设备、场景等更准确的粒度上。
1.3 自研还是开源网关:我们最终怎么取舍的
讨论方案时,团队内部也自研和开源争论过一轮。自研的好处是逻辑完全可控,坏处是网关这种处在流量咽喉位置的系统,涉及并发模型、热加载、插件隔离、证书管理、可观测性方方面面,起步成本非常高。我们当时没有足够人力去从零维护一套网关,最终是在开源网关基础上做二次开发的。
选择上主要看三点:第一,是否支持 OpenResty 或者同类高性能扩展机制,因为网关里要写不少聚合和路由定制逻辑,不能用的平台会因为二次开发成本直接劝退;第二,是否有现成的管理 API 和配置下发通道,网关配置要频繁调整,没有管理
