网关(Gateway)作为网络架构中的关键组件,主要承担不同协议或网络之间的数据转换与路由功能。以下是其核心功能的详细说明:
网关能够连接使用不同通信协议的网络或系统,实现数据格式的转换。例如将HTTP请求转换为gRPC协议,或处理SOAP与RESTful API之间的互操作。这种能力在混合云环境或遗留系统集成中尤为重要。
基于请求内容(如URL路径、HTTP头)智能分发流量至后端服务。支持轮询、权重分配等负载均衡算法,同时可实现蓝绿部署和金丝雀发布等高级流量管理策略。
提供统一的认证鉴权入口,集成OAuth2、JWT等标准协议。具备IP黑白名单、速率限制、防SQL注入等Web应用防火墙功能,成为网络边界的安全屏障。
可将多个微服务的响应聚合成单一API响应,减少客户端请求次数。支持GraphQL查询语言,允许客户端按需获取数据,优化网络传输效率。
实时收集API调用指标(如响应时间、错误率),生成详细访问日志。这些数据可用于性能分析和故障排查,部分网关还支持与Prometheus等监控系统集成。
内置熔断器模式,当后端服务故障时自动降级或快速失败。支持请求重试和超时控制,提高系统整体容错能力,避免级联故障。
提供响应缓存减少后端负载,支持Gzip压缩降低带宽消耗。部分网关可实现TCP连接复用,显著提升高并发场景下的性能表现。
多数现代网关支持运行时动态调整路由规则和安全策略,无需重启服务。可通过Admin API或控制面板进行配置,适应敏捷开发需求。
路由定义
在Spring Cloud Gateway中,路由规则通过RouteLocator
或配置文件(如YAML)定义。每个路由包含ID、目标URI、断言(Predicate)和过滤器(Filter)。
spring:
cloud:
gateway:
routes:
- id: service_route
uri: http://example.com
predicates:
- Path=/api/**
filters:
- StripPrefix=1
关键组件
请求处理流程
核心机制
RouteDefinitionRepository
支持动态更新路由。LoadBalancerClient
集成,支持服务名(如lb://service-name
)的URI。Hystrix
或Resilience4j
集成实现熔断,RetryFilter
支持请求重试。路径改写与负载均衡
routes:
- id: user_service
uri: lb://user-service
predicates:
- Path=/user/**
filters:
- RewritePath=/user/(?>.*), /$\{segment}
限流配置
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
底层框架
基于Netty和WebFlux的非阻塞模型,通过DispatcherHandler
分发请求到RoutePredicateHandlerMapping
。
断言与过滤器扩展
自定义断言需实现RoutePredicateFactory
,自定义过滤器需实现GatewayFilterFactory
。
性能优化
CachingRouteLocator
)。Gateway断言是API网关中用于验证请求是否符合特定条件的机制,通常用于权限控制、参数校验或流量管理。断言结果决定请求是否被路由到后端服务或直接拦截。
路径断言
匹配请求路径,例如Path=/api/**
表示所有以/api/
开头的请求。
方法断言
匹配HTTP方法,例如Method=GET
表示仅允许GET请求。
头部断言
检查请求头,例如Header=X-Request-Id, \d+
要求头部X-Request-Id
为数字。
Cookie断言
验证Cookie值,例如Cookie=sessionid, .*
要求存在名为sessionid
的Cookie。
查询参数断言
Query=name, foo
匹配URL中必须包含参数name=foo
。
权重断言
Weight=group1, 80
将80%流量路由到指定分组。
远程地址断言
RemoteAddr=192.168.1.1/24
限制IP段访问。
对于Spring Cloud Gateway,可通过实现RoutePredicateFactory
接口创建自定义断言:
public class CustomPredicateFactory extends AbstractRoutePredicateFactory<CustomPredicateFactory.Config> {
@Override
public Predicate<ServerWebExchange> apply(Config config) {
return exchange -> {
// 自定义逻辑
return exchange.getRequest().getURI().getPath().contains(config.getKeyword());
};
}
}
多个断言可通过AND/OR逻辑组合:
AND
:所有断言需同时满足OR
:任一断言满足即可示例YAML配置:
predicates:
- Path=/payment/**
- Method=POST
- Header=X-Auth-Token, .+
以上内容涵盖了主流网关(如Spring Cloud Gateway、Kong等)的通用断言模式,具体语法需根据实际网关产品调整。