【Gateway】


主要内容

1. API网关

2. Spring Cloud Gateway介绍

3. Gateway入门案例

4. 谓词

5. Filter

6. 使用Gateway实现限流

7. 使用Gateway实现服务降级

8. GlobalFilter

9. 自定义FilterFactory


一、API 网关

API网关作用就是把各个服务对外提供的API汇聚起来,让外界看起来是一个统一的接口。同时也可在网关中提供额外的功能。

总结:网关就是所有项目的一个统一入口。

gateway网关的容器是啥(Gateway网关)(1)

网关 = 路由转发 过滤器(编写额外功能)

2.1 路由转发

接收外界请求,通过网关的路由转发,转发到后端的服务上。

如果只有这个一个功能看起来和之前学习的nginx反向代理服务器很像,外界访问nginx,由nginx做负载均衡,后把请求转发到对应服务器上。

2.2 过滤器

网关非常重要的功能就是过滤器。

过滤器中默认提供了25内置功能还支持额外的自定义功能。

对于我们来说比较常用的功能有网关的容错、限流以及请求及相应的额外处理。

3.1 Spring Cloud Netflix Zuul

属于Spring Cloud Netflix下一个组件,具有灵活、简单的特点。在早期Spring Cloud中使用的比较多。

其版本更新都依赖于Netflix Zuul。

3.2 Spring Cloud Gateway

由Spring 自己推出的网关产品,完全依赖Spring自家产品。符合Spring战略意义,其更新版本等都由Spring自己把控。

目前很多项目中都是使用Gateway替代Zuul。

在本套课程中讲解的也是Gateway


二、Spring Cloud Gateway介绍

Spring Cloud Gateway是Spring Cloud 的二级子项目,提供了微服务网关功能,包含:权限安全、监控/指标等功能。

在学习Gateway时里面有一些名词需要提前了解,这对于后面的学习是很有帮助的。

2.1 Route

Route中文称为路由,Gateway里面的Route是主要学习内容,一个Gateway项目可以包含多个Route。

一个路由包含ID、URI、Predicate集合、Filter集合。

在Route中ID是自定的,URI就是一个地址。剩下的Predicate和Filter学习明白了,Route就学习清楚了。

2.2 Predicate

中文:谓词。

谓词时学习Gateway比较重要的一点,简单点理解谓词就是一些附加条件和内容。

2.3 Filter

所有生效的Filter都是GatewayFilter的实例。在Gateway运行过程中Filter负责在代理服务“之前”或“之后”去做一些事情。

2.4 流程

gateway网关的容器是啥(Gateway网关)(2)

流程文字解释:

网关客户端访问Gateway,网关Gateway中Handler Mapping对请求URL进行处理。处理完成后交换Web Handler,Web Handler 会被Filter进行过滤。Filter中前半部分代码是处理请求的代码。处理完成后调用真实被代理的服务。被代理服务响应结果,结果会被Filter中后半部分代码进行操作,操作完成后把结果返回给Web Hanlder,在返回给Handler Mapping,最终响应给客户端。


三、Gateway入门案例

1.1 Eureka Server

因为Gateway依赖Eureka,需要从Eureka中获取真实代理项目地址后,进行访问。

所以需要准备一个Eureka Server(示例中是非集群Eureka),端口设置为8761。

一个普通的Eureka Client项目,重点关注应用程序名和控制器即可,其他代码省略。

2.1 配置文件

gateway网关的容器是啥(Gateway网关)(3)

2.2 控制器

gateway网关的容器是啥(Gateway网关)(4)

3.1 编写pom.xml

gateway网关的容器是啥(Gateway网关)(5)

3.2 新建配置文件

谓词中Path一般会给每个项目前面起一个无意义的别名。

如 Path = /abc/** 当看到abc是知道路由转发到项目abc,后面的内容才是真实要访问abc的内容

如Path=/jqk/** 表示需要转发到jqk项目。

要明白:uri中第一部分就是为了防止各个项目中出现重名路径导致路由转发失败。

gateway网关的容器是啥(Gateway网关)(6)

3.3 新建启动器

新建com.bjsxt.GatewayApplication

gateway网关的容器是啥(Gateway网关)(7)

访问GatewayDemo项目。

http://localhost:9000/demo/one

页面会显示

gateway网关的容器是啥(Gateway网关)(8)

通过结果可以看出,用户虽然访问的GatewayDemo网关项目,但是最后真是访问的是DemoOne项目中/one 控制器

修改GatewayDemo项目中配置文件的路由参数,把StripPrefix的值由1改成0后,重启项目

filters: StripPrefix=0

再次访问http://localhost:9000/demo/one会发现

gateway网关的容器是啥(Gateway网关)(9)


四、谓词

谓词:当满足条件再进行路由转发。

在Spring Cloud Gateway中谓词实现GatewayPredicate接口。其中类名符合:XXXRoutepredicateFactory,其中XXX就是在配置文件中谓词名称。在上面示例中Path=/demo/** 实际上使用的就是PathRoutePredicateFactory

gateway网关的容器是啥(Gateway网关)(10)

所有的谓词都设置在predicates属性中,当设置多个谓词时取逻辑与条件,且一个谓词只能设置一组条件,如果需要有个多条件,添加多个相同谓词。

1.1 设置必须包含的参数名。

下面两种写法等效。都表示路径满足/demo/**同时包含参数abc。

Path和Query是谓词。abc是请求参数名称。

在浏览器中输入:http://localhost:9000/demo/one?abc=jqk

gateway网关的容器是啥(Gateway网关)(11)

1.2 设置参数的值

abc请求参数名称。jqk. 是abc的值,是一个正则表达式。在正则表达式中点(.)表示匹配任意一个字符。所以当请求参数abc=jqka或abc=jqkw能满足谓词条件。

在谓词中赋值使用逗号(,)赋值因为Query后面已经有等号,在值内容中在出现等号语法说不过去了。

gateway网关的容器是啥(Gateway网关)(12)

表示请求头中必须包含的内容。

注意:

参数名和参数值之间依然使用逗号

参数值要使用正则表达式

如果Header只有一个值表示请求头中必须包含的参数。如果有两个值,第一个表示请求头必须包含的参数名,第二个表示请求头参数对应值。

gateway网关的容器是啥(Gateway网关)(13)

如果设定请求头中需要包含多个参数及值。设置多个Header。在此处演示多个相同谓词配置,其他谓词中就不再强调可以配置多个谓词。

gateway网关的容器是啥(Gateway网关)(14)

Method表示请求方式。支持多个值,使用逗号分隔,多个值之间为or条件。

gateway网关的容器是啥(Gateway网关)(15)

允许访问的客户端地址。

要注意使用127.0.0.1而不要使用localhost。

gateway网关的容器是啥(Gateway网关)(16)

匹配请求参数中Host参数的值。满足Ant模式(之前在Spring Security中学习过)可以使用

? 匹配一个字符

* 匹配0个或多个字符

** 匹配0个或多个目录

gateway网关的容器是啥(Gateway网关)(17)

要求请求中包含指定Cookie名和满足特定正则要求的值。

Cookie必须有两个值,第一个Cookie包含的参数名,第二个表示参数对应的值,正则表达式。不支持一个参数写法。

gateway网关的容器是啥(Gateway网关)(18)

在指定时间点之前

gateway网关的容器是啥(Gateway网关)(19)

在指定时间点之前

gateway网关的容器是啥(Gateway网关)(20)

请求时必须在设定的时间范围内容,才进行路由转发。

注意:时间的格式

gateway网关的容器是啥(Gateway网关)(21)

多版本服务发布的时候,偶尔使用。v1.0 v1.1两个版本同时发布服务。内容一致,实现机制不同。发布两个不同命名的服务集群。使用Gateway做负载均衡。

负载均衡中权重。同一个组中URI进行负载均衡。

语法:Weight=组名,负载均衡权重

在Eureka中注册两个服务,这个服务(项目)是相同的,应用程序名分别叫做demo-one和demo-two。

Gateway在路由匹配时demo-one将占20%,demo-two将占80%

gateway网关的容器是啥(Gateway网关)(22)


海量Java学习资料,大厂面试题,项目练习题,统统免费提供,只要关注,那就会有收获~笔芯~

,