聊聊Spring Cloud Gateway

聊聊,spring,cloud,gateway · 浏览次数 : 288

小编点评

**网关概述** 网关是一种统一入口的通信基础设施,它可以提供多种功能,例如请求路由、鉴权、限流、日志收集等。它可以帮助简化应用的开发过程,并提供多个服务的平滑整合。 **关键概念** * **路由(Route):**是一个网关的基本组件,它包含路由规则和过滤器。 * **过滤器(Filter):**过滤请求并决定应该发送给哪个路由。 * **Route Predicate Factories(路由器工厂):**提供各种路由规则的匹配机制。 * **Filter Factories(过滤器工厂):**提供预处理请求和响应的过滤器。 **请求处理过程** 1. **路由匹配:**客户端发送请求到网关。 2. **过滤器匹配:**根据路由规则匹配请求。 3. **请求转发:**如果匹配到路由,网关将请求转发给相应的Route。 4. **请求处理:**Route处理请求并执行业务逻辑。 5. **响应返回:**响应结果返回给客户端。 **常用解决方案场景** * **Spring Cloud Gateway:**基于Spring Boot 2.0的网关,提供统一的路由请求、鉴权、限流等功能。 * **Dubbo:**针对Dubbo服务提供一个Web应用来进行协议转换。 * **Nginx:**基于Reactor模式的网关,提供类似于Spring Cloud Gateway的功能。 * **Redis:**基于Redis的限流实现。

正文

网关概述

整体来看,网关有点类似于门面,所有的外部请求都会先经过网关这一层。

网关不仅只是做一个请求的转发及服务的整合,有了网关这个统一的入口之后,它还能提供以下功能。

  • 针对所有请求进行统一鉴权、限流、熔断、日志。
  • 协议转化。针对后端多种不同的协议,在网关层统一处理后以HTTP对外提供服务。譬如针对Dubbo服务还需要提供一个Web应用来进行协议转化,此时可以在API网关层转换协议。
  • 统一错误码处理。
  • 灰度发布
  • 请求转发,并且可以基于网关实现内、外网隔离。

常用的解决方案场景如下:

image

image

image

Spring Cloud Gateway

Spring Cloud Gateway是基于Spring Boot 2.0、Spring WebFlux和Project Reactor等技术开发的网关,它不仅提供了统一的路由请求的方式,还基于过滤链的方式提供了网关最基本的功能;解决了Spring Cloud Zuul的性能问题:

  • Zuul 1.x采用的是传统的thread per connection方式来处理请求,也就是针对每一个请求,会为这个请求专门分配一个线程来进行处理,直到这个请求完成之后才会释放线程,一旦后台服务器响应较慢,就会使得该线程被阻塞,所以它的性能不是很好。

Spring WebFlux基于Project Reactor响应式框架实现了完全无阻塞的、响应式的、高并发性能的、网络请求响应;解决了如上的Zuul性能问题。

个人觉得,其实就是类似Nginx、Redis等基于Reactor模式的实现;也是非阻塞IO(Epoll)的另一种体现。

请求过程及关键概念

Spring Cloud Gateway的请求处理过程如图所示,其中有几个非常重要的概念。

  • 路由(Route):它是网关的基本组件,由ID、目标URI、Predicate集合、Filter集合组成。

  • 谓语(Predicate):它是Java 8中引入的函数式接口,提供了断言的功能。它可以匹配HTTP请求中的任何内容。如果Predicate的聚合判断结果为true,则意味着该请求会被当前Router进行转发。

image

Spring Cloud Gateway启动时基于Netty Server监听一个指定的端口(该端口可以通过server.port属性自定义)。当客户端发送一个请求到网关时,网关会根据一系列Predicate的匹配结果来决定访问哪个Route路由,然后根据过滤器链进行请求的处理。过滤器链可以在请求发送到后端服务器之前和之后执行,也就是首先执行Pre过滤器链,然后将请求转发到后端的微服务执行具体的业务,最后执行Post过滤器链。

Route Predicate Factories

Predicate是Java 8提供的一个函数式接口,它允许接收一个参数并返回一个布尔值,可以用于条件过滤、请求参数的校验。

image

在Spring Cloud Gateway中,Predicate提供了路由规则的匹配机制。比如:

image

意思是通过Path属性来匹配URL前缀是/gateway/的请求。

如下,Spring Cloud Gateway默认提供了很多Route Predicate Factory,这些Predicate会分别匹配HTTP请求的不同属性,并且多个Predicate可以通过and逻辑进行组合。

image

Gateway Filter Factories

Filter分为Pre类型的过滤器和Post类型的过滤器。

  • Pre类型的过滤器在请求转发到后端微服务之前执行,在Pre类型过滤器链中可以做鉴权、限流等操作。

  • Post类型的过滤器在请求执行完之后、将结果返回给客户端之前执行。

在Spring Cloud Gateway中内置了很多Filter,Filter有两种实现,分别是GatewayFilter和GlobalFilter。GlobalFilter会应用到所有的路由上,而GatewayFilter只会应用到单个路由或者一个分组的路由上。

GatewayFilter

Spring提供了一些内置的GatewayFilter,如:

  • AddRequestParameter GatewayFilter Factory:该过滤器的功能是对所有匹配的请求添加一个查询参数。
    image

  • AddResponseHeader GatewayFilter Factory:该过滤器会对所有匹配的请求,在返回结果给客户端之前,在Header中添加相应的数据。
    在上面这段配置中,会在Response中添加Header头,
    image
    在上面这段配置中,会在Response中添加Header头,key=X-Response-Foo,Value=Bar。

  • RequestRateLimiter GatewayFilter Factory:该过滤器会对访问到当前网关的所有请求执行限流过滤,如果被限流,默认情况下会响应HTTP 429-Too Many Requests。
    RequestRateLimiterGatewayFilterFactory默认提供了RedisRateLimiter的限流实现,它采用令牌桶算法来实现限流功能。
    image
    redis-rate-limiter过滤器有两个配置属性:
    image

  • Retry GatewayFilter Factory:Retry GatewayFilter Factory为请求重试过滤器,当后端服务不可用时,网关会根据配置参数来发起重试请求。
    image
    RetryGatewayFilter提供4个参数来控制重试请求,参数说明如下。
    image

GlobalFilter

GlobalFilter和GatewayFilter的作用是相同的,只是GlobalFilter针对所有的路由配置生效。Spring Cloud Gateway内置的全局过滤器也有很多,比如:

image

全局过滤链的执行顺序是,当Gateway接收到请求时,Filtering Web Handler处理器会将所有的GlobalFilter实例及所有路由上所配置的GatewayFilter实例添加到一条过滤器链中。该过滤器链里的所有过滤器都会按照@Order注解所指定的数字大小进行排序。

  • LoadBalancerClientFilter:LoadBalancerClientFilter是用于实现请求负载均衡的全局过滤器,配置如下。
    image
    如果URI配置的是lb://example_service,那么这个过滤器会识别到lb://,并且使用Spring Cloud LoadBalancerClient将example_service名称解析成实际访问的主机和端口地址。

  • GatewayMetricsFilter:GatewayMetricsFilter是网关指标过滤器,这个过滤器会添加name=gateway.requests的timer metrics,其中包含以下数据。
    image
    这些指标通过http://ip:port/actuator/metrics/gateway.requests获得,前提是需要添加Spring Boot Actuator依赖。

自定义过滤器

Spring Cloud Gateway提供了过滤器的扩展功能,开发者可以根据实际业务需求来自定义过滤器。同样,自定义过滤器也支持GlobalFilter和GatewayFilter两种。

  • 自定义GatewayFilter:自定义过滤器类GpDefineGatewayFilterFactory,继承AbstractGatewayFilterFactory。

  • 自定义GlobalFilter:GlobalFilter的实现比较简单,它不需要额外的配置,只需要实现GlobalFilter接口,自动会过滤所有的Route。

集成

Spring Cloud Gateway支持与其他解决方案集成,实现更强大的功能,比如Spring Cloud Alibaba系列。

与聊聊Spring Cloud Gateway相似的内容:

聊聊Spring Cloud Gateway

Spring Cloud Gateway是基于Spring Boot 2.0、Spring WebFlux和Project Reactor等技术开发的网关,它不仅提供了统一的路由请求的方式,还基于过滤链的方式提供了网关最基本的功能;解决了Spring Cloud Zuul的性能问题。

聊聊Spring Cloud Alibaba解决方案组件

在java的微服务解决方案中,最先出现目前应用比较多的就是spring cloud netfix系列,但是随着阿里的强劲支持,spring cloud alibaba解决方案逐渐可以替代前者,当然dubbo也是不容小觑的。之前面试几家公司应用的都是spring cloud alibaba,随着我自己

聊聊Spring Cloud Alibaba Sentinel的限流

Spring Cloud Alibaba Sentinel限流功能概览,目前先整理一版,东西有点多,想慢慢打开;后续继续更新......

聊聊Spring的工厂方法与FactoryBean

概述 工厂方法是比较常见,常用的一种设计模式。FactoryBean是Spring提供的一种Bean注入IOC容器的方式。 工厂方法 在做日常开发时,一般都会避免直接new对象,而且将new的操作丢给IOC容器,但对于第三方系统的集成,我们不太好直接丢给IOC容器,此时可以通过工厂模式, 提供一个工

聊聊Spring IOC容器的注入方式

为什么要说这个? 对于Spring体系而言,我个人认为最重要的就是IOC容器,其次才是AOP、Context等模块;因为这些模块功能是或搭建或集成在IOC容器这个基础设施之上的。 直接基于Spring框架体系做开发时,可以通过常用的JavaConfig或XML方式将对象的生命周期及装配由容器原生的接

聊聊Spring注解@Transactional失效的那些事

emm,又又又踩坑啦。这次的需求主要是对逾期计算的需求任务进行优化,现有的计算任务运行时间太长了。

聊聊Mybatis集成Spring的原理

一般都是研究框架源码,我为什么要反过来研究集成原理呢? 在我自己看来,集成虽然比较简单,但要求的细节比较多,需要掌握根本性的东西才能做到集成。 Mybatis集成Spring用到了FactoryBean以及BeanDefinition注册的原理,从这两个维度来实现集成,而我们单独学习Spring时,

聊聊Mybatis的实现原理

### 使用示例 平时我们使用的一般是集成了Spring或是Spring Boot的Mybatis,封装了一层,看源码不直接;如下,看看原生的Mybatis使用示例 ![image](https://img2023.cnblogs.com/blog/971683/202305/971683-2023

构建基于Java Spring Boot和Uniapp的心理小程序:从零到一的完整指南

构建基于Java Spring Boot和Uniapp的心理小程序:从零到一的完整指南 前言 大家好,今天我们来聊聊如何使用Java Spring Boot和Uniapp构建一个心理小程序。这个项目不仅能帮助你提升技术水平,还能为用户提供心理健康支持。我们将从项目的整体架构开始,逐步深入到具体的代码

聊聊Maven的依赖传递、依赖管理、依赖作用域

1. 依赖传递 在Maven中,依赖是会传递的,假如在业务项目中引入了spring-boot-starter-web依赖: org.springframework.boot spring-boot-starter