Spring Cloud_GateWay
什么是 Spring Cloud Gateway?
- Spring Cloud Gateway 属于 Spring Cloud 生态系统中的网关,其诞生的目标是为了替代老牌网关 Zuul
- 为了提升网关的性能,Spring Cloud Gateway 基于 Spring WebFlux 。Spring WebFlux 使用 Reactor 库来实现响应式编程模型,底层基于 Netty 实现同步非阻塞的 I/O
- Spring Cloud Gateway 不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,限流
- Spring Cloud Gateway 和 Zuul 2.x 的差别不大,也是通过过滤器来处理请求。不过,目前更加推荐使用 Spring Cloud Gateway 而非 Zuul,Spring Cloud 生态对其支持更加友好
Spring Cloud Gateway 的工作流程?
![[Pasted image 20230913094237.png]]
- 路由判断:客户端的请求到达网关后,先经过 Gateway Handler Mapping 处理,这里面会做断言判断,看下符合哪个路由规则,这个路由映射后端的某个服务
- 请求过滤:然后请求到达 Gateway Web Handler,这里面有很多过滤器,组成过滤器链,这些过滤器可以对请求进行拦截和修改,比如添加请求头、参数校验等等。然后将请求转发到实际的后端服务
- 服务处理:后端服务处理请求
- 响应过滤:后端处理完后,响应结果,返回给 Gateway 的过滤器做处理
- 响应返回:响应经过过滤处理后,返回给客户端
Spring Cloud Gateway 的断言是什么?
- 断言就是对表达式做 if 判断
- 在 Gateway 中,如果客户端发送的请求满足了断言的条件,则映射到指定的路由器,就能转发到指定的服务上进行处理
Spring Cloud Gateway 的路由和断言是什么关系?
- 一对多:一个路由规则可以包含多个断言
- 同时满足:如果一个路由规则中有多个断言,则需要同时满足才能匹配
- 第一个匹配成功:如果一个请求可以匹配多个路由,则映射第一个匹配成功的路由
Spring Cloud Gateway 如何实现动态路由?
- 实现动态路由的方式有很多种,推荐基于 Nacos 的注册中心来实现
- Spring Cloud Gateway 可以从注册中心获取服务的元数据(例如服务名称、路径等),然后根据这些信息自动生成路由规则
Spring Cloud Gateway 的过滤器有哪些?
Filter 按照请求和响应可以分为两种:
- Pre 类型:在请求被转发到微服务之前,对请求进行拦截和修改
- 例如参数校验、权限校验、流量监控、日志输出
- Post 类型:微服务处理完请求后,返回响应给网关,网关可以再次进行处理
- 例如修改响应内容或响应头、日志输出、流量监控等
Filter 按照作用范围划分:
- 局部过滤器:应用在单个路由或一组路由上的过滤器
- AddRequestHeader 为原始请求添加 Header
- AddResponseHeader 为原始响应添加 Header
- 全局过滤器:应用在所有路由上的过滤器,常见用法是进行负载均衡
- LoadBalancerClient Filter 整合 Ribbon 实现负载均衡
Spring Cloud Gateway 支持限流吗?
- 支持,Spring Cloud Gateway 自带限流器,基于 Reids + Lua 实现
- 通常结合 Sentinel 实现网关流量控制
Spring Cloud Gateway 如何自定义全局异常处理?
- 在 SpringBoot 项目中,捕获全局异常只需要在项目中配置
@RestControllerAdvice
和@ExceptionHandler
就可以,不过,这种方式在 Spring Cloud Gateway 下不适用 - Spring Cloud Gateway 提供了多种全局处理的方式,比较常用的一种是实现
ErrorWebExceptionHandler
并重写其中的handle
方法