API网关是微服务架构中的关键组件,位于客户端与后端服务之间,承担统一入口、流量治理和安全管控等职责
📅 2026/7/5 14:46:18
👁️ 阅读次数
📝 编程学习
API网关是微服务架构中的关键组件,位于客户端与后端服务之间,承担统一入口、流量治理和安全管控等职责。其核心功能包括:
路由(Routing)
- 根据请求路径(Path)、Host、Header、Query参数或HTTP方法等条件,将请求动态转发至对应后端服务(如
/user/**→ 用户服务,/order/**→ 订单服务)。 - 支持灰度路由(基于用户ID、标签等)、A/B测试、蓝绿发布等高级路由策略。
- 通常结合服务发现(如Nacos、Eureka)实现自动服务地址更新。
- 根据请求路径(Path)、Host、Header、Query参数或HTTP方法等条件,将请求动态转发至对应后端服务(如
鉴权(Authentication & Authorization)
- 统一校验身份(AuthN):如JWT解析与签名验证、OAuth2 Token校验、API Key校验等。
- 统一控制权限(AuthZ):基于RBAC/ABAC模型判断当前用户是否有权访问某API(如
POST /api/v1/orders需role: merchant)。 - 支持令牌透传、上下文注入(如将用户ID、租户ID注入Header供下游服务使用)。
限流(Rate Limiting)
- 防止突发流量压垮后端服务,保障系统稳定性。
- 支持多维度限流:全局/接口级/用户级/租户级;算法包括固定窗口、滑动窗口、漏桶、令牌桶(推荐令牌桶,平滑可控)。
- 可配置QPS、并发数、请求总量等阈值,并支持拒绝(429 Too Many Requests)或排队降级。
熔断(Circuit Breaking)
- 当下游服务持续失败(如超时、异常率>50%),网关自动“熔断”对该服务的请求,快速失败并返回兜底响应(如默认值、缓存或友好错误页)。
- 熔断器具备三种状态:Closed(正常调用)→ Open(触发熔断)→ Half-Open(试探性恢复),避免雪崩效应。
- 常与超时(Timeout)、重试(Retry)策略协同使用。
✅ 补充说明:现代API网关(如Kong、APISIX、Spring Cloud Gateway、阿里云API网关)还常集成日志审计、监控告警、协议转换(HTTP/gRPC)、SSL终止、WAF防护等功能,但路由、鉴权、限流、熔断是其最基础且不可替代的四大核心能力。
# 示例:Spring Cloud Gateway 中配置限流 + JWT鉴权(伪代码)@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder){returnbuilder.routes().route("user-service",r->r.path("/api/user/**").filters(f->f.authenticationFilter()//自定义JWT鉴权过滤器.requestRateLimiter(c->c.setRateLimiter(redisRateLimiter()))//Redis令牌桶限流.circuitBreaker(config->config.setName("userCB").setFallbackUri("forward:/fallback"))).uri("lb://user-service")).build();}API网关实现路由规则的动态热更新(Hot Reload)而无需重启,核心在于将路由配置从代码/配置文件中解耦,转为可运行时读取、监听变更并实时生效的外部化数据源。主流实现方式如下:
✅1. 基于服务注册中心(如Nacos、Eureka、Consul)
- 网关作为客户端订阅服务实例列表,路由路径与服务名绑定(如
/user/** → user-service)。 - 当服务上下线或元数据变更(如新增
version: v2标签),注册中心主动推送事件,网关监听后自动刷新路由映射表(如 Spring Cloud Gateway 的CachingRouteLocator)。 - ✅ 优势:天然支持服务发现+路由联动,适合微服务动态扩缩容场景。
✅2. 基于配置中心(如Nacos Config、Apollo、ZooKeeper)
- 路由规则以 JSON/YAML 格式存储在配置中心(例如
gateway-routes.json):[{"id":"order-route","uri":"lb://order-service","predicates":["Path=/api/order/**"],"filters":["AuthFilter","RateLimitFilter"]}] - 网关启动时加载,并通过长轮询/监听接口(如 Nacos 的
@NacosConfigListener或 Apollo 的ConfigChangeListener)感知配置变更。 - 变更后触发
RouteDefinitionWriter+RefreshRoutesEvent(Spring Cloud Gateway)或 APISIX 的admin API重载路由缓存。 - ✅ 优势:配置与代码分离,支持灰度发布、版本回滚、权限管控。
✅3. 基于数据库(如MySQL + 定时扫描/监听binlog)
- 路由信息存入关系型数据库(含字段:path、service_id、methods、headers、status、weight等)。
- 网关通过定时任务(如每5秒查一次
updated_at > last_check)或结合Canal监听binlog实现近实时同步。 - ⚠️ 注意:需加锁/版本号避免并发更新冲突,性能低于配置中心,但便于审计与复杂查询。
✅4. 基于管理后台 + Admin API(如Kong Admin API、APISIX Dashboard)
- 运维/开发通过Web界面或curl调用网关提供的RESTful管理接口(如
POST /apisix/admin/routes)增删改路由。 - 网关内部监听自身Admin端口事件,解析请求后直接更新内存路由树(APISIX 使用 etcd 作为配置存储,所有节点监听 etcd key 变更,天然强一致性)。
- ✅ 优势:操作直观、支持多租户、审计日志完备。
🔍关键技术保障:
- 无锁/原子更新:使用
ConcurrentHashMap、CopyOnWriteArrayList或不可变对象(如RouteDefinition)避免热更新时路由不一致; - 双缓冲机制:加载新配置到备用缓冲区,校验通过后原子切换引用(如
AtomicReference<RouteLocator>); - 平滑过渡:旧路由连接允许完成(Graceful Shutdown in-flight requests),新请求立即走新规则;
- 健康检查兜底:若配置加载失败,自动回退至上一有效版本(需本地持久化备份)。
# APISIX 示例:通过 etcd 监听自动热更新(无需重启)# 所有节点 watch /apisix/routes/ 下的 key,变更即生效
编程学习
技术分享
实战经验