1、初次认识
Spring Cloud Gateway是Spring官方推荐使用一个代理网关,以后可能会替代掉Zuul。其基于Spring Boot 2.x,Spring WebFlux,Reactor之上来构建运行,但在使用时我们可以不用太关心底层的网络协议,只要熟悉它的配置规则就可以上手。总的来说,Spring Cloud Gateway跟其他网关类似,能够提供如下功能:
- 权限控制;
- 限流;
- 路由转发;
- 负载均衡;
- 黑白名单控制
Route、Predicate、Filter组成的三件套是我们学习Spring Cloud Gateway工作原理的入口,它们组成了网关的路由规则。
Route:是网关路由的最小单元,它包括了Predicate和Filter,每个Route由ID,URI等组成。系统里可以配置多个Route规则,如果多个Route规则能够匹配到请求的话,由Order较小的匹配成功。
Predicate:是Java 8的Predicate方法,返回布尔值,代表是否能够匹配上,有些配置可以使用正则表达式。
Filter:是过滤器,有Pre和Post之分,Pre在请求发送到目标服务之前执行,Post在请求从目标服务返回之后执行。
下面是Spring Cloud Gateway的工作原理图,开始看不懂没关系,留个印象,后面分析源码使用。
2、环境搭建
由于最新版本3.0.2不是很稳定,我们使用了v2.2.6.RELEASE来做源码的分析,从tag里拉出分支。
git clone https://github.com/spring-cloud/spring-cloud-gateway
cd spring-cloud-gateway
git checkout v2.2.6.RELEASE
git checkout -b v226
切出代码后,在IDEA上可能会加载不了依赖,需要把profile的spring开关打开:
在这里插入图片描述
接下来我们切到spring-cloud-gateway-sample这个项目,来运行demo。为了更好的理解网关的配置,我建议开始把配置文件的routes规则都注释掉,然后我们一个个打开规则来做调试。
1)注释routes规则
2)修改test.uri为 httpbin.org:80。
替换- PrefixPath=/httpbin 为 - PrefixPath=/ 。这个是前缀路径,会在每个请求路径前面加上配置的前缀
3)运行:GatewaySampleApplication.java
4)命令行输入:curl http://localhost:8080/testfun 。会看到响应: hello
3、routes的使用
routes里面就是对应的就是每个请求的规则处理,可以配置多个,一般由id、uri、predicates、filter组成。id是唯一指定的
routes:
- id: baiduceshi
uri: http://www.baidu.com
order: 1
predicates:
- Cookie=name,xiaoming
- id: default_path_to_httpbin
uri: http://httpbin.org
order: 2
predicates:
- Path=/get
上面配置了两个路由规则,假如一个请求进来两个规则都符合,那么会优先走order较小的。另外uri这里代表路由的目标地址,有个注意的地方是uri只会走域名部分,即如果第二个把 http://httpbin.org改为 http://httpbin.org/getInfo/a,一个请求localhost:8080/get进来还是会走http://httpbin.org/get,即会把目标地址根目录后面的路径去除。
要测试上面代码,我建议把GatewaySampleApplication.java类中的所有加@Bean注解的方法都注释掉,我们就可以来看看输出结果了:
curl http://localhost:8080/get
{
"args": {},
"headers": {
"Accept": "*/*",
"Content-Length": "0",
"Forwarded": "proto=http;host=\"localhost:8080\";for=\"0:0:0:0:0:0:0:1:61473\"",
"Host": "httpbin.org",
"User-Agent": "curl/7.64.1",
"X-Amzn-Trace-Id": "Root=1-6058f2be-3e6b1fbf45cea4df76116356",
"X-Forwarded-Host": "localhost:8080"
},
"origin": "0:0:0:0:0:0:0:1, 223.104.66.105",
"url": "http://localhost:8080/get"
}
4、predicate的使用
predicate决定请求是否走自己的路由,在routes下面配置,常见的PredicateFactory工厂有以下几个:
如果配置了多个,则需要同时满足,是and的关系,比如下面既要满足头部要有X-Request-Id=123,还必须是get请求。
routes:
- id: header_route
uri: http://httpbin.org:80/get
predicates:
- Header=X-Request-Id, 123 // 请求头要有X-Request-Id=123
- Method=GET // get方法
5、filter的使用
filter过滤器网关的模块,很多功能可以在这里实现,比如鉴权,限流,日志输出。除了配置文件可以配置过滤器,还可以通过自定义类来实现过滤器。下面列举几个过滤器。
- AddRequestHeader=X-Request-Foo, Bar // 往请求头里加参数,头部会加上X-Request-Foo=Bar
- RewritePath=/foo/(?.*), /${segment} // 路径重写,/foo/aa 会替换成 /aa
6、总结
该篇文章算是对Spring Cloud Gateway的一个初步的理解,主要是搭建环境和运行demo验证自己的认知。更深入的原理分析、详细用法等后面文章会慢慢补充。