了解gateway
我们从4个角度去理解
1.对搭建部署,架构层面有一定量的理解
2.理解gateway提供的一整套知识体系
3.gateway在实际项目中,需要整合的其他的技术栈
4.gateway在实际项目中的,灵活使用
1.对搭建部署,架构层面有一定量的理解
1.创建一个springboot,然后引入gateway的依赖
2.在yaml中给配置
2.理解gateway提供的一整套知识体系
之前的文章,详细介绍过springmvc
要把住住springmvc
就要深刻理解,他是http请求包,到java能理解实体类,这一层做的,机制的设计
我们回顾一下springmvc有哪些机制
1.controller接口机制,包括文件的
2.拦截器机制
3.r响应
4.全局异常处理
他都是处理请求与响应的机制
这里springmvc的局限在哪里呢
他无法处理把请求分发给不同的springboot的机制的机制
springmvc版本升级了,我记得是有使用netty作为收发请求的底层原理的
所以核心还是这个分配机制
我们看看gateway提供了哪些机制
路由机制
断言机制
过滤器机制:
自定义全局异常处理器:
我们顺着你提供的思路,从四个角度来深入了解一下 Spring Cloud Gateway。
1. 搭建部署与架构:轻量入门与响应式内核
搭建一个 Gateway 服务非常简单,它本身就是一个 Spring Boot 应用。
快速搭建步骤:
- 创建项目:创建一个新的 Spring Boot 模块。
- 引入依赖:在
pom.xml中添加核心依赖spring-cloud-starter-gateway。注意,需要排除默认的spring-boot-starter-web依赖,因为 Gateway 是基于 WebFlux 的,两者会冲突。 - 简单配置:在
application.yml中配置路由规则。例如,将路径为/api/user/**的请求转发到http://localhost:8081。
核心架构:响应式编程模型
这是 Gateway 与 Spring MVC 最根本的区别。Gateway 基于Spring WebFlux构建,底层使用Netty作为异步非阻塞的网络通信框架。
- 对比 Spring MVC:Spring MVC 基于 Servlet API,是同步阻塞的。每个请求会占用一个线程直到处理完毕,在高并发下,线程资源会成为瓶颈。
- Gateway 的优势:Netty 和 Reactor 的响应式模型,使其能用少量线程处理大量并发请求,显著提升系统的吞吐量。在相同硬件条件下,WebFlux 版本的 QPS(每秒查询数)可比 MVC 版本提升30%-50%,内存使用降低20%-30%。
因此,你之前提到的“使用 Netty 作为收发请求的底层原理”是准确的,这也正是 Gateway 高性能的关键。
2. Gateway 的知识体系:路由、断言与过滤器
Gateway 的知识体系围绕三个核心概念构建,你可以将它们类比为 Spring MVC 中的DispatcherServlet、拦截器和控制器的组合,但功能更强大。
- Route(路由):网关的基本构建模块。它由ID、目标URI、断言(Predicate)集合和过滤器(Filter)集合组成。
- Predicate(断言):匹配条件。Java 8 中的
Predicate函数式接口,用于判断请求是否满足某个条件。Gateway 内置了丰富的断言工厂,如Path(路径匹配)、Method(请求方法)、Header(请求头匹配)等。一个路由可以配置多个断言,必须全部满足才能匹配。 - Filter(过滤器):处理逻辑。在请求被路由前后对请求或响应进行修改。分为两种:
- GatewayFilter:作用于单个特定路由。
- GlobalFilter:作用于所有路由,是全局性的。
工作流程:
- 客户端请求到达 Gateway。
- Gateway Handler Mapping根据请求信息,通过Predicate断言匹配找到对应的Route。
- 请求进入Gateway Web Handler,它会触发该路由关联的一系列Filter(称为 Pre-Filters),对请求进行预处理。
- 请求被转发到目标 URI 指向的后端服务。
- 后端服务返回响应后,响应会再次经过 Filter 链(称为 Post-Filters)进行处理。
- 最终,响应返回给客户端。
3. 实际项目中的技术整合
Gateway 通常不是孤立运行的,在实际项目中需要与微服务架构中的其他组件紧密整合。
- 服务注册与发现(如 Nacos, Eureka):Gateway 需要从注册中心获取所有后端服务的实例列表,实现动态路由。配置
uri: lb://service-name,Gateway 就会自动使用负载均衡器将请求分发到service-name服务的可用实例上。 - 配置中心(如 Nacos, Spring Cloud Config):将路由规则等配置外部化,可以实现路由规则的热更新,无需重启网关即可生效。
- 熔断与限流(如 Sentinel, Hystrix):Gateway 可以集成熔断器,当下游服务故障时,快速失败并返回友好提示,防止故障扩散。同时,内置的限流功能可以保护系统免受突发流量冲击。
- 链路追踪(如 Sleuth + Zipkin):Gateway 作为流量的入口,是分布式追踪的关键节点,可以为每个请求生成 Trace ID,方便追踪请求在微服务间的完整调用链。
4. 实际项目中的灵活使用
基于以上能力,Gateway 在项目中可以实现很多强大的功能。
- 统一鉴权:编写一个GlobalFilter,拦截所有请求,验证 JWT Token 或 Session 的有效性。这是最经典的用法。
- 灰度发布 / 金丝雀发布:通过自定义断言或过滤器,实现精细化的流量控制。
- 流量染色:在 Gateway 过滤器里根据用户 ID、请求头等给请求打上标签(如在 Header 中添加
version: v2)。 - 灰度路由:根据请求的“染色”标签,将其路由到不同的服务版本。例如,使用
Weight断言,将 10% 的流量导向新版本服务。
- 流量染色:在 Gateway 过滤器里根据用户 ID、请求头等给请求打上标签(如在 Header 中添加
- 请求/响应转换:使用过滤器统一修改请求或响应的格式。例如,为所有请求添加一个公用的 API 版本号 Header,或者统一封装响应体的结构。
- 跨域处理:通过配置
CorsWebFilter,集中解决前后端分离架构中的跨域问题,避免在每个微服务中单独配置。 - 自定义全局异常处理:正如你提到的,这是保证系统一致性的关键。由于 Gateway 是 WebFlux 环境,不能使用 Spring MVC 的
@ControllerAdvice。你需要通过继承AbstractErrorWebExceptionHandler来实现自定义的全局异常处理,以返回统一格式的错误信息。
总的来说,理解 Gateway 的关键在于把握住它“响应式、非阻塞”的架构本质,以及“路由、断言、过滤器”这三个核心概念。在实际项目中,它通过与其他基础设施(如注册中心、配置中心)整合,成为微服务架构中统一的流量入口和治理中心。