网关(Gateway)详解
一、核心概念
网关是分布式系统的统一入口,主要功能包括:
- 协议转换:处理不同协议间的通信(如HTTP转gRPC)
- 路由控制:根据请求特征定向到特定服务
- 安全防护:身份验证、权限控制、防DDoS攻击
- 流量治理:限流、熔断、降级
- 监控分析:请求日志、性能指标收集
二、典型应用场景
# Spring Cloud Gateway 配置示例
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- StripPrefix=2
- name: RequestRateLimiter
args:
key-resolver: "#{@userKeyResolver}"
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
三、常见面试题与解答
1. 网关与负载均衡器的区别?
- 网关提供协议转换、安全控制等七层功能
- 负载均衡器专注流量分发(四层或七层)
- 示例:Nginx主要做负载均衡,Spring Cloud Gateway实现API网关
2. 如何实现动态路由?
- 方案1:结合配置中心(如Nacos)实时更新路由表
- 方案2:通过数据库存储路由规则,监听变更事件
- 方案3:使用Kubernetes CRD定义路由策略
3. 限流算法比较
算法 | 特点 | 公式表示 |
---|---|---|
令牌桶 | 允许突发流量 | r ( t ) = min ( b , c + r t ) r(t) = \min(b, c + rt) r(t)=min(b,c+rt) |
漏桶 | 严格限制速率 | q ( t ) = min ( c , q p r e v + Δ t ⋅ r ) q(t) = \min(c, q_{prev} + \Delta t \cdot r) q(t)=min(c,qprev+Δt⋅r) |
滑动窗口计数 | 精确控制单位时间请求量 | c o u n t = ∑ t = n o w − 1 s n o w r e q t count = \sum_{t=now-1s}^{now} req_t count=t=now−1s∑nowreqt |
4. 熔断机制实现原理
- 状态机模型:
- Closed:正常请求
- Open:拒绝所有请求(触发阈值后)
- Half-Open:试探性允许部分请求
- 判定指标:
- 错误率超过阈值(如50%)
- 连续错误数达到上限
- 响应时间百分位超标
5. 如何设计高可用网关?
- 多活部署:跨机房集群部署
- 流量分级:核心业务与非核心业务分离
- 故障隔离:Bulkhead模式划分资源池
- 自动恢复:健康检查+自动重启机制
四、性能优化技巧
-
连接池管理:
- 保持与下游服务的持久连接
- 设置合理的最大连接数(公式: m a x _ c o n n = Q P S × a v g _ l a t e n c y 1000 max\_conn = \frac{QPS \times avg\_latency}{1000} max_conn=1000QPS×avg_latency)
-
缓存策略:
- 对静态资源启用CDN缓存
- 对认证结果进行短期缓存
-
异步处理:
// Reactor 异步编程示例
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return Mono.fromRunnable(() -> {
// 记录请求日志
logRequest(exchange.getRequest());
}).then(chain.filter(exchange));
}
五、安全实践
-
JWT验证流程:
- 客户端携带Token → 网关验证签名 → 解析claims → 转发用户信息到下游服务
-
防重放攻击:
- 时间戳校验(5分钟窗口)
- Nonce随机数缓存
- 请求签名算法: s i g n = H M A C _ S H A 256 ( s e c r e t , m e t h o d + p a t h + t i m e s t a m p + n o n c e + b o d y ) sign = HMAC\_SHA256(secret, method+path+timestamp+nonce+body) sign=HMAC_SHA256(secret,method+path+timestamp+nonce+body)
-
敏感数据过滤:
# 敏感信息过滤伪代码
def filter_sensitive_data(headers):
blacklist = ['Authorization', 'X-Api-Key']
return {k:v for k,v in headers.items() if k not in blacklist}
六、常见架构模式
-
Sidecar模式:
- 每个服务实例部署独立网关代理
- 优势:细粒度控制,语言无关
-
分层网关架构:
- 边缘网关(处理外部流量)
- 内部网关(服务间通信)
- 服务网格(精细流量管理)
典型故障排查流程:
- 检查网关日志中的X-Request-ID
- 确认路由配置是否生效
- 验证下游服务健康状态
- 分析监控指标(QPS/延迟/错误率)
- 检查证书有效期(HTTPS场景)