引言
书接上文,网关作为微服务系统中不可或缺的一部分,java的后端框架有SpringCloud Gateway ,Zuul,本篇文章简单介绍spring cloud gateway,后续会有其他文章详细介绍原理和实践。
一、Spring Cloud Gateway的核心概念
1. 路由(Route)
路由是网关的基本单元,定义请求如何被转发到目标服务,包含以下关键属性:
- ID:路由的唯一标识符,用于区分不同规则。
- URI:目标服务地址,支持静态(如
http://localhost:8080
)或动态(如lb://userservice
基于服务发现的负载均衡)配置。 - 断言(Predicates):匹配请求的条件集合,决定是否应用该路由规则。
- 过滤器(Filters):在请求转发前后执行的处理逻辑,如修改请求头、限流等。
示例配置:
spring:
cloud:
gateway:
routes:
- id: user_route
uri: lb://userservice
predicates:
- Path=/api/user/**
filters:
- AddRequestHeader=X-User-ID, 123
2. 断言(Predicate)
断言基于Java 8的Predicate
接口实现,用于验证HTTP请求是否符合路由规则。支持多种匹配条件:
- 路径匹配:如
Path=/api/**
匹配以/api
开头的请求。 - 请求头匹配:如
Header=X-Token, \d+
验证请求头中的令牌是否为数字。 - 请求方法匹配:如
Method=GET
仅允许GET请求。
断言支持逻辑组合(AND/OR),实现复杂路由逻辑。
3. 过滤器(Filter)
过滤器分为两类:
- 全局过滤器(GlobalFilter):作用于所有路由,如鉴权、日志记录。
- 路由过滤器(GatewayFilter):仅作用于特定路由,如
AddRequestHeader
添加请求头。
过滤器链按顺序执行,分为Pre-Filter(转发前处理)和Post-Filter(响应返回后处理)。
二、Spring Cloud Gateway的工作原理
1. 整体处理流程
Spring Cloud Gateway基于WebFlux框架,采用异步非阻塞模型,底层依赖Netty实现高性能通信。其请求处理流程如下:
- 请求接收:客户端请求被
HttpWebHandlerAdapter
封装为ServerWebExchange
对象,构建网关上下文。 - 路由匹配:
DispatcherHandler
调用RoutePredicateHandlerMapping
,遍历所有路由规则,通过断言匹配请求。 - 过滤器链执行:匹配成功后,
FilteringWebHandler
按顺序执行全局和路由过滤器:- Pre-Filter阶段:执行鉴权、限流、请求头修改等逻辑。
- 代理请求:通过
NettyRoutingFilter
转发请求到目标服务。 - Post-Filter阶段:处理响应数据(如压缩、日志统计)。
- 响应返回:响应数据经过过滤器处理后返回客户端,完成请求生命周期。
2. 高性能架构设计
- 响应式编程模型:基于Reactor库实现异步非阻塞I/O,避免线程阻塞,提升并发能力。
- Netty服务器:采用事件驱动模型,支持高吞吐量和低延迟,适合网关的高并发场景。
- 动态路由更新:结合服务发现(如Nacos、Eureka),实时感知服务实例变化,动态调整路由策略。
3. 核心组件协作
- RouteLocator:加载路由配置(静态文件或动态源如数据库)。
- FilterProcessor:管理过滤器链的执行顺序与逻辑。
- LoadBalancerClient:实现服务名的负载均衡(如轮询、随机策略)。
三、典型应用场景
- 统一鉴权与安全:网上很多文章说使用GlobalFilter或defaultFilter实现鉴权,但实际使用场景中,GlobalFIlter无法拦截静态资源的请求,SCG基于webflux构建,一个请求的大致处理过程如下:
从上图可以看到,请求会先经过spring webflux 的webfilter,webfilter会拦截所有请求,包括静态资源请求;如果使用统一的鉴权服务,通过webfilter拦截请求进行鉴权是更好的选择。 - 流量治理:使用自带的
RequestRateLimiter
过滤器实现限流,也可以集成AlibabaSentinel实现基于规则的动态限流,关于限流和熔断会在后续文章中展开说明。 - 灰度发布:基于请求头或权重路由,将部分流量导向新版本服务。
- 监控与日志:记录请求耗时、状态码、请求头标准化、植入全链路追踪TraceId等。
四、小结
Spring Cloud Gateway作为微服务架构的“流量守门员”,通过路由、断言、过滤器三大核心组件,实现了请求的动态分发与增强处理。其基于WebFlux和Netty的高性能架构,结合灵活的扩展机制,成为构建高并发、可观测微服务系统的关键基础设施。
五、实践
下面通过一个简单的例子实际了解一下spring cloud gateway
配置如下:
先启动网关服务
再启动路由里配置的flowservice-auth服务
通过网关访问flowservice-auth
在日志里可以看到路由信息
这个示例,简单实现了请求的路由,后续我会在其他文章中介绍springgcloud gateway 的其他功能。