API网关是微服务架构中的关键组件,作为系统的统一入口,负责对外暴露有限、安全、可控的API接口,并对所有入站请求进行集中管理。其核心功能包括:
✅ 统一入口:所有客户端(Web、App、第三方系统)均通过网关访问后端服务,隐藏内部服务拓扑,提升安全性与可维护性;
✅ 智能路由:根据请求路径、Header、参数、JWT声明等条件,将请求动态转发至对应微服务(如 /user/** → user-service),支持灰度发布、A/B测试、服务发现集成(如Nacos、Eureka);
✅ 限流(Rate Limiting):基于用户ID、IP、API路径、令牌桶/漏桶算法等维度实施流量控制,防止突发流量击穿下游服务,保障系统稳定性(如单用户每分钟最多100次调用);
✅ 补充能力还包括:身份认证(OAuth2/JWT校验)、鉴权(RBAC/ABAC)、日志审计、熔断降级、请求/响应转换(如JSON Schema校验、字段脱敏)、缓存(响应缓存)、可观测性(Tracing、Metrics、Logging)等。
常见开源/商业实现:Kong(插件化强)、Spring Cloud Gateway(Java生态友好)、APISIX(云原生、高性能)、AWS API Gateway、阿里云API网关。
# 示例:APISIX路由+限流配置(YAML)
routes:
- uri: "/api/v1/users"
upstream:
nodes:
"user-service:8080": 1
plugins:
limit-count:
key: "remote_addr" # 按客户端IP限流
count: 100 # 每分钟最多100次
time_window: 60
rejected_code: 429
API网关与服务注册中心(如 Nacos)协同实现动态路由和自动服务发现,核心在于:网关不再硬编码后端服务地址,而是通过监听注册中心中服务实例的注册/下线事件,实时感知服务列表变化,并据此动态更新本地路由表或负载均衡器配置。整个过程解耦、实时、无需重启。
典型协同流程如下:
-
服务注册
微服务(如order-service)启动时,主动向 Nacos 注册自身元数据(服务名、IP、端口、健康状态、权重、版本标签等),Nacos 将其持久化并维持心跳检测。 -
网关订阅服务
API网关(如 Spring Cloud Gateway 或自研网关)作为 Nacos 的客户端,通过 SDK 或 HTTP API 订阅指定服务名(如user-service)。Nacos 在服务列表变更时,主动推送(Push)或网关定时拉取(Pull) 最新实例列表。 -
动态构建路由规则
- 网关将服务名映射为逻辑路由(如
/api/users/** → user-service); - 根据获取到的
user-service实例列表(如[10.0.1.10:8080, 10.0.1.11:8080]),自动构建可负载均衡的上游节点池; - 支持基于元数据的灰度路由(如只转发
version=2.0的实例)。
- 网关将服务名映射为逻辑路由(如
-
实时感知与热更新
当某实例宕机(Nacos 心跳超时将其剔除)或新实例上线,Nacos 触发变更事件 → 网关监听器收到通知 → 毫秒级更新本地路由缓存与负载均衡器(如 Ribbon、Spring Cloud LoadBalancer),流量自动绕过故障节点,全程零人工干预。
✅ 关键技术支撑:
- Nacos 的
watch机制(长轮询/Push)保障变更低延迟; - 网关内置服务发现适配器(如 Spring Cloud Gateway 的
DiscoveryClientRouteDefinitionLocator); - 路由配置支持“服务名”而非固定 IP(如
lb://user-service); - 健康检查兜底(网关可叠加主动探活,避免依赖注册中心最终一致性)。
// Spring Cloud Gateway 示例:启用服务发现路由
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("user_route", r -> r.path("/api/users/**")
.uri("lb://user-service")) // lb:// 表示使用负载均衡调用注册中心中的 service-id
.build();
}
// 配合 application.yml 启用:
spring:
cloud:
gateway:
discovery:
locator:
enabled: true # 自动为每个注册服务生成默认路由


436

被折叠的 条评论
为什么被折叠?



