7

聊聊Spring Cloud Gateway - 又见阿郎

 1 year ago
source link: https://www.cnblogs.com/zhiyong-ITNote/p/17454590.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

聊聊Spring Cloud Gateway

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

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

  • 针对所有请求进行统一鉴权、限流、熔断、日志。
  • 协议转化。针对后端多种不同的协议,在网关层统一处理后以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方式来处理请求,也就是针对每一个请求,会为这个请求专门分配一个线程来进行处理,直到这个请求完成之后才会释放线程,一旦后台服务器响应较慢,就会使得该线程被阻塞,所以它的性能不是很好。

  • 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进行转发。

  • 谓语(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系列。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK