形象的讲解什么是Gateway网关
文章目录
- 一、什么是网关?
- 二、什么是Gateway网关
- 1、概述
- 2、Predicate(断言)
- 3、Filter(过滤器)
- 3.1 Pre类型和Post类型
- 3.2 GatewayFilter和GlobalFilter
- GatewayFilter:
- GlobalFilter:
- 4、过滤器的执行顺序
一、什么是网关?
通常我们把API网关简称为网关。
要弄懂Gateway网关,我们需要知道什么是网关。
在web应用服务中会涉及很多的接口调用,而且服务器的种类也有很多,为了更好的管理这些接口的调用规则,我们需要建立一个网络请求进入的统一入口。让这个入口帮我们匹配每一个请求所需要调用的服务,也可以帮助我们实现用户校验(只暴露网关接口给用户,其他接口统一用网关处理,不暴露于公网)、负载均衡、流量控制等功能:
二、什么是Gateway网关
1、概述
Spring Cloud Gateway是网关的一个实现方式,它是基于Spring+SpringBoot进行开发的。
Gateway的组成主要是两大部分
Predicate(断言)
Filter(过滤器)
2、Predicate(断言)
Gateway中有很多的Predicate(断言),这里的断言我们可以形象的理解成大门(网关)后面的多个小入口(某一个服务的接口)的保安。这些保安有自己的决策权力,决定当前游客是否可以进入园区:
注意:
Gateway实现断言功能,是基于Java中自带的函数式接口,Gateway只是运用了Java这个接口的特性:@FunctionalInterface public interface Predicate<T>
这个接口有Java官方自带的五个逻辑判断的默认方法或者静态方法:
default Predicate<T> negate();default Predicate<T> or(Predicate<? super T> other);static <T> Predicate<T> not(Predicate<? super T> target); default Predicate<T> or(Predicate<? super T> other);static <T> Predicate<T> isEqual(Object targetRef);
以及一个可重写的自定义判断逻辑:
boolean test(T t);
3、Filter(过滤器)
Predicate(断言)决定了发到网关的请求具体应该给到哪一个服务;Filter(过滤器)则是在这个请求的前后增加一些处理逻辑,这就是过滤器的作用范围。
3.1 Pre类型和Post类型
过滤器按照执行时机分为:Pre类型和Post类型:
-
Pre类型过滤器:路由处理之前执行请求转接到后端服务之前执行,在Pre类型过滤器中可以做鉴权、限流等。
-
Post类型过滤器:请求执行完成后,将结果返回给客户端之前执行,可以给响应体增加某些参数等。
比如去景区游玩:
- 进景区之前需要先买检票,验票(鉴权),如果今日进景区的游客超过了规定的人数,就不会进行限流(pre类型)
- 接下来进景区游玩
- 游玩之后,对景区服务进行评价(post类型)
3.2 GatewayFilter和GlobalFilter
gateway提供了GatewayFilter和GlobalFilter这两种过滤器的实现类;这两个实现类都有自带的过滤逻辑,只需要在yml文件中配置即可。
此外 GatewayFilter和GlobalFilter两个类也支持自定义重写,我们可以通过这个特性自定义一些过滤器。
具体操作方法不是本博客重点,所以不做过多说明。
GatewayFilter:
-
定义
GatewayFilter 是应用于特定路由(Route)的过滤器,用于处理特定路由的请求和响应。每个 GatewayFilter 通常通过 Spring Cloud Gateway 提供的 GatewayFilterFactory 实现,或者通过自定义方式实现。 -
作用范围
仅作用于绑定到的具体路由,不会自动应用于所有路由(也就是具体的某一个园区这个过滤器才会生效)。
GlobalFilter:
-
定义
GlobalFilter 是一个全局过滤器,作用于所有路由(Routes),无需显式绑定到某个路由。开发者通过实现 GlobalFilter 接口并注入 Spring 容器来定义。 -
作用范围:
全局生效,适用于所有请求和响应。
Default Filters
前面讲过GatewayFilter在指定服务中才会生效,而默认过滤器会在全部服务中生效。它提供了一些便捷过滤逻辑,直接在yml文件中配置即可;缺点是不支持自定义。
4、过滤器的执行顺序
过滤器的执行顺序时根据优先级的数值(int类型的数字大小)决定的。数值越小,优先级越高,越先执行。
在优先级相同情况下执行顺序:
GlobalFilter -> GatewayFilter-> defaultFilter
defaultFilter的优先级默认是Integer.MAX_VALUE,而且这个过滤器是不可以自定义的,所以它的执行优先级最低且不可更改。
而自定义的GlobalFilter 和GlobalFilter 可以通过它们的Order方法去修改优先级的。