后端开发怎么选型并设计 API 网关层
结论:API 网关选型先定边界——网关只做南北向的流量治理(路由、鉴权、限流、熔断、日志),不写业务逻辑;再按部署形态选:K8s 集群内优先 APISIX、Kong、Higress 这类带 CRD 的网关,裸机或自建控制面用 Nginx、Envoy,Java 团队省事就选 Spring Cloud Gateway。
API 网关层到底该做哪些事?
结论:网关只做六件事——路由转发、认证鉴权、限流熔断、协议转换、灰度分流、可观测,业务规则、数据聚合、流程编排一律下沉到后端服务。
原因是网关是所有流量的单一入口,任何一次配置变更影响全站,且它无法按业务服务独立扩容、独立测试。协议转换指 HTTP/1.1 转 gRPC、WebSocket 透传、内外网协议隔离;可观测指统一注入 TraceID、记录访问日志、暴露指标。把业务逻辑写进网关,等于把最难回滚的代码放在最不能出错的位置。
选型前必须先回答哪几个问题?
结论:四个问题决定选型——流量方向(只有南北向,还是东西向也要)、部署形态(K8s 还是裸机虚机)、团队语言栈(Java/Go/Lua/C++)、扩展方式(改配置、装插件、写 Wasm 还是写代码)。
- 只做南北向且在 K8s:APISIX、Kong、Higress、Envoy Gateway,用 CRD 声明路由,改配置秒级生效。
- 东西向也要统一数据面:Envoy + Istio 或自研 xDS 控制面。
- 团队全是 Java、要复用 Spring 生态:Spring Cloud Gateway。
- 已有 Nginx 运维经验、路由变更频率低:OpenResty 或 Nginx + Lua。
主流网关方案有什么区别?
结论:五个方案的差异集中在配置生效方式、扩展语言和生态上,性能不是首要区分点——成熟网关单机都能扛住万级 QPS 量级。
Nginx 用 C 模块加配置文件,reload 生效,动态路由要靠 OpenResty 的 Lua 或 Consul Template 渲染配置。Kong 基于 OpenResty,官方插件覆盖鉴权、限流、日志等场景,DB-less 模式用声明式 YAML 管理配置,适合快速接第三方能力。APISIX 同样是 OpenResty 内核,配置存 etcd,改路由不用 reload,插件支持 Lua、Java、Go、Wasm 多语言。Envoy 是 C++ 编写、走 xDS 动态配置,是 Istio 的数据面,适合南北向和东西向共用一套数据面。Spring Cloud Gateway 基于 Spring WebFlux + Reactor Netty 的非阻塞模型,与 Nacos、Sentinel 直接打通;基于 Servlet 阻塞模型的 Zuul 1 已停止维护,不要再选。
网关的关键参数怎么定?
结论:超时、重试、限流、请求体大小必须显式配置,默认值迟早会坑你。
超时按链路逐层递减:客户端 5s ≥ 网关 4s ≥ 后端服务 3s。下游超时必须小于上游,否则上游先断连,日志里只剩 504,定位不到根因。重试只对幂等的 GET/HEAD 生效,次数设 1 次,退避 100ms;POST 要重试必须由业务方提供幂等键。限流用令牌桶:单 IP 100 QPS、单接口 1000 QPS、桶容量给 2 倍突发;网关限流是粗筛,精确额度仍在服务内部做。Nginx 的 client_max_body_size 默认 1MB,超出直接返回 413,需要上传就按接口显式调到 10MB。
鉴权和灰度怎么在网关落地?
结论:鉴权在网关做「验签 + 透传」,不做「查库」;灰度用请求头或用户 ID 取模。
JWT 校验用本地缓存的 JWKS 公钥验签,公钥缓存 5-10 分钟,每个请求调一次认证中心会把网关 QPS 打满。验完把 userId、tenantId 写进请求头透传给后端,后端不再解 token。灰度分流按 x-canary: 1 走全量、或 uid % 100 < 5 走 5% 流量,灰度路由和正式路由指向同一服务的不同 Deployment,回滚只需改路由权重。
上线前必须验证什么?
结论:四项验证——压测、超时链路、限流触发、配置回滚,缺一项都别上生产。
用 wrk 或 hey 压到目标峰值的 1.5 倍,盯 P99 延迟和错误率;手工把后端延迟调到超过网关超时,确认返回统一错误体 {code, message, traceId};把限流阈值临时设为 1 QPS 确认 429 真的生效;改一条路由后立刻回滚,确认生效时间在秒级。
网关是全局入口,选型没有唯一答案:K8s 上优先 APISIX/Kong/Higress,裸机用 Nginx/Envoy,Java 团队用 Spring Cloud Gateway。设计上守住四条线——只做流量治理、超时逐层递减、鉴权只验签不查库、参数全部显式配置,改动才敢在白天做。
原文链接:https://www.gj0.com/thread-968.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。