![在这里插入图片描述](https://img-blog.csdnimg.cn/20200411232940406.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjMzMjk4NQ==,size_16,color_FFFFFF,t_70#pic_center)
一、简要介绍
SpringCloud Gateway是基于Spring构建的一个API网关,它旨在提供一种简单而有效的方式实现API接口路由。
特性:
- 最新版本基于Spring 5/SpringBoot 2.0;
- 能够针对任何请求属性匹配路由;
- 对特定的路由请求进行断言和过滤;
- 集成Hystrix断路器;
- 集成SpringCloud Discovery Client;
- 容易实现Predicates和Filters;
- 请求频率限制;
- 请求路径改写;
- SpringCloud Gateway 是基于SpringBoot 2.0,- SpringWebFlux 以及Project Reactor构建的。它运行需要SpringBoot和Spring WebFlux 提供的Netty的运行环境。因此当Gateway被构建成war包运行时,可能无法在传统的Servlet容器中工作。
二、需要关注的术语
- Route(路由):核心概念,路由由ID、目的URI、一系列断言(Predicates)及一系列过滤器所定义。当请求满足断言时就会匹配到相应的路由。
- Predicate(断言):这个就跟Java8的Function Predicate是一样的。输入类型是Spring的ServerWebExchange,它的功能在于让你对任何的HTTP请求进行判断匹配,比如说请求头或者查询参数。
- Filter(过滤器): 所有的过滤器都是GatewayFilter的实例,一般是用一个指定的构建Factory实例化的。在过滤器中,可以在转发到下游请求之前对请求进行修改,或者在下游请求得到响应之后,对响应进行修改然后再返回给客户端。
三、工作原理
(1)客户端发起请求到Gateway
(2)由Gateway Handler Mapping来决定请求的路由匹配工作,然后就会将请求交给Gateway Web Handler,Handler就会将请求经过一系列的过滤器链。
(3)图中Filters用虚线隔了两部分,是因为所有的过滤器都可以在代理请求被发送到下游前和获取到下游响应后都有可能经过执行。
(4)过滤器分为两种,一种是Pre类型和Post类型,即请求先进如Pre类型的Filter,再到下游系统,得到下游业务系统的响应后,再有Post类型的过滤器处理。
(5)如果路由中的URI没有指定端口号,那么就会使用默认的80和443端口(HTTP、HTTPS)
四、开始上手
(1)集成依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
可以利用SpringBoot Initializer勾选依赖生成,你会得到一个基于SpringBoot的简单demo工程。
(2)配置Predicate Factories 和Gateway Filter Factories
官方提供了两种配置方式:shortcuts和fully expanded arguments。大多数情况下使用shortcut的方式即可。配置时需要指定name和argument names,并且参数在shortcut配置方式时通常是按顺序给定的。
- Shortcut 配置方式
配置时以name=args的格式给出,如果存在多个参数,参数之间以英文逗号,隔开。
示例application.yml
spring:
cloud:
gateway:
routes:
- id: bugdongdong
uri: example.bugdongdong.com
predicates:
- Cookie=cookiename,cookievalue
该示例就会匹配到带有名称为cookiename且值为cookievalue的Cookie的请求
- Fully Expanded Arguments配置方式
这种方式看起来会更加的标准,格式是以name:value的键值对,典型的配置会有两个key,一个name和一个args的key,其中args是一个键值对的map集合,用于配置断言和过滤器
示例application.yml
spring:
cloud:
gateway:
routes:
- id: bugdongdong
uri: example.bugdongdong.com
predicates:
- name: Cookie
args:
name: cookiename
regexp: cookievalue
这种配置方式和上面提到shortcut的配置方式一样作用
五、两个基础抽象类和接口
在SpringCloud Gateway中,有两个很重要的工厂接口:RoutePredicateFactory和GatewayFilterFactory,这两个接口是上层对于PredicateFactory和FilterFactory的上层规范,基于这两个接口,官方提供了两个更易于实现的抽象类,AbstractRoutePredicateFactory和AbstractGatewayFilterFactory。一般系统预置的PredicateFactory和FilterFactory都是基于这两个抽象类做的实现来构建相应的Predicate和Filter。
配置文件的predicates中配置的名称,如Cookie,全名为CookieRoutePredicateFactory,就是实现上文中提到的响应的抽象类。如果需要自己定制Predicate或者Filter的时候,比如自定义一个MyOwnRoutePredicateFactory,实现对应的抽象类即可,仿照其他官方提供的Factory去尝试写实现,那么在配置文件中的predicate中就可以配置为-name: MyOwn了。MyOwnGatewayFilterFactory的定义实现也是类似的操作。
官方提供了很多常用的标准的PredicateFactory和GatewayFilterFactory,可以针对需要查阅相应的配置方法,使用套路都是一样的。
六、参考资料
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/