Spring Cloud Gateway源码分析-环境搭建以及入门使用

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验证自己的认知。更深入的原理分析、详细用法等后面文章会慢慢补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值