目录

  1. 前言
  2. 项目依赖
  3. 配置
  4. 代码实现
  5. 路由规则
  6. 总结

前言

前篇我们介绍了Gateway的由来,这一篇我们介绍一下Gateway的使用,希望能够帮到小伙伴们。

Gateway网关路由有两种配置方式:

1、在配置文件yml中配置

2、代码中注入RouteLocator的Bean

这两种方式是等价的,建议使用yml配置方式

项目依赖

我们采用最新的版本

因为Gateway使用的是Netty + webflux,所以不需要引入web模块;只要引入spring-cloud-starter-gateway就行了,里面包含了spring-boot-starter-webflux

注:什么是webflux,老顾以后介绍

配置

属性含义如下

id:我们自定义的路由 ID,保持唯一

uri:目标服务地址

predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该属性包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)

请求效果

上面这段配置的意思是,配置了一个id为route-name的路由规则,当访问地址 http://localhost:8080/get 时会自动转发到地址:http://httpbin.org:80/get

代码实现

效果和配置方式是一样的。

上面我们简单的用两个案例演示了Gateway的路由转发,下面我们详细介绍一下路由规则

路由规则

Spring Cloud Gateway 的功能很强大,前面我们只是使用了 predicates 进行了简单Path的条件匹配,其实Gataway帮我们内置了很多 Predicates功能。

在项目启动日志中,我们就能发现有很多PredicateFactory。Gateway 是通过Spring WebFlux的HandlerMapping做为底层支持来匹配到转发路由,这些 Predicates 工厂通过不同的HTTP请求参数来匹配,多个 Predicates 工厂可以组合使用

Predicate 介绍

Predicate 来源于 Java 8,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。

在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则,有通过 Header、请求参数等不同的条件来进行作为条件匹配到对应的路由

网上有一张图总结了 Spring Cloud 内置的几种 Predicate 的实现。

上图中,很清晰的说明了各个工厂的规则,说到底Predicate就是为了实现一组匹配规则,方便让请求过来找到对应的 Route 进行处理。

时间匹配

Gateway支持设置一个时间,在请求进行转发的时候,可以通过判断在这个时间之前或者之后进行转发。比如我们现在设置只有在2019年9月10日才会路由转发,在这之前不进行转发,我就可以这样配置:

上面的配置After属性,设置时间,代表在这时间之后才能匹配;我们设置的是2019-9-10,这里的时间通过ZonedDateTime来对时间进行的对比,ZonedDateTime 是 Java 8 中日期时间功能里,用于表示带时区的日期与时间信息的类,ZonedDateTime 支持通过时区来设置时间,中国的时区是:Asia/Shanghai。

上面的示例是指,请求路径为/get,且请求时间在 2019年9月10日0点0分0秒之后的所有请求都转发到地址http://httpbin.org:80。+08:00是指时间和UTC时间相差八个小时,时间地区为Asia/Shanghai。

添加完路由规则之后,如果当地时间为9月4日访问地址http://localhost:8080/get不会转发,如果是9月10日会自动转发到http://httpbin.org:80/get

Before Route Predicate 刚好相反,在某个时间之前的请求都进行转发。

我们把上面路由规则中的 After 改为 Before,如下:

就表示在这个时间之前可以进行路由,在这时间之后停止路由

有了时间前与时间后,当然就会有时间之间Between,如下:

意思一看就能看出,在两时间之间即可路由,不在不可路由。

Cookie 匹配

Cookie Route Predicate 可以接收两个参数,一个是 Cookie name ,一个是正则表达式,路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行

不带cookies访问

curl http://localhost:8080/get //不带cookies

返回404

{"timestamp":"2019-09-04T09:28:45.726+0000","path":"/get","status":404,"error":"Not Found","message":null}

带上cookies访问,且userId为1

curl http://localhost:8080/get --cookie "userId=1"

返回正常

Header 匹配

Header Predicate 和 Cookie Predicate 一样,也是接收 2 个参数,一个 header 中属性名称和一个正则表达式,这个属性值和正则表达式匹配则执行

上面的意思,就是请求头要有token属性,并且值为整数的正则表达式

curl http://localhost:8080/get -H "token:12"

返回正常,将参数-H "token:12"改为-H "token:hello"再次执行时返回404证明没有匹配。

下面老顾就介绍快点,因为比较简单,一通百通

Host 匹配

Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板,用.号作为分隔符。它通过参数中的主机地址作为匹配规则。

predicates:- Host=**.toutiao.com

请求匹配上的

curl http://localhost:8080/get -H "Host: www.toutiao.com"
curl http://localhost:8080/get -H "Host: md.toutiao.com"

请求方式匹配

通过请求的方式是 POST、GET、PUT、DELETE 等进行路由。

predicates:- Method=GET //或者POST,PUT

请求路径匹配

Path Route Predicate 接收一个匹配路径的参数来判断是否走路由。

predicates:- Path=/get/{segment}

如果请求路径符合要求,则此路由将匹配,例如:/get/1 或者 /get/bar。

请求参数匹配

Query Route Predicate 支持传入两个参数,一个是属性名,一个为属性值,属性值可以是正则表达式。

predicates:- Query=token

只有属性名token,表示只要有token参数就行,不管值为多少,即可路由

predicates:- Query=token, \d+

表示不但要有参数名token,值还要是整数才能路由

请求 ip 地址匹配

通过设置某个 ip 区间号段的请求才会路由,RemoteAddr Route Predicate 接受 cidr 符号(IPv4 或 IPv6 )字符串的列表(最小大小为1),例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是子网掩码)。

predicates:- RemoteAddr=192.168.1.1/24

如果请求的远程地址是 192.168.1.10,则此路由将匹配。

组合使用

predicates:- Host=**.toutiao.com- Path=/get- Method=GET- Query=token- After=2019-01-20T06:06:06+08:00[Asia/Shanghai]

各种 Predicates 同时存在于同一个路由时,请求必须同时满足所有的条件才被这个路由匹配

总结

老顾今天主要聊了Gateway的基础路由规则,当然我们也可以自定义predicates。下一篇我们就进入高级篇,主要介绍Gateway的filter、熔断以及限流等

Gateway网关系列(二):SpringCloud Gateway入门实战,路由规则相关推荐

  1. 「刘一哥GIS」系列专栏《QGIS入门实战精品教程(配套案例数据)》

    「刘一哥GIS」系列专栏<QGIS入门实战精品教程(配套案例数据)>全新上线了,欢迎广大GISer朋友关注,一起探索GIS奥秘,分享GIS价值! 本专栏以实战案例的形式,深入浅出地介绍了Q ...

  2. SpringCloud的GateWay网关中怎么debug得到真实的路由地址

    org.springframework.cloud.gateway.filter下面的 然后按下 Step over 就得到了 mergedUrl 这个变量,然后就可以看到真实请求的地址了

  3. Spring Data 系列(二) Spring+JPA入门(集成Hibernate)

    通过[Spring Data 系列(一) 入门]的介绍,通过对比的方式认识到Spring提供的JdbcTemplate的强大功能.通过使用JdbcTemplate,操作数据库,不需要手动处理Conne ...

  4. webapi 设置参数可为空_Web API系列(二):灵活多样的路由配置

    1.导言 路由系统是请求消息进入http://ASP.NET Web API消息处理管道的第一道屏障,其根本目的在于利用注册的路由对请求的URL进行解析以确定目标HTTPController和Acti ...

  5. drools动态配置规则_微服务实战系列(八)-网关springcloud gateway自定义规则

    1. 场景描述 先说明下项目中使用的网关是:springcloud gateway, 因需要给各个网关服务系统提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现:动态加载自定义路 ...

  6. SpringCloud 09 - Gateway 网关

    SpringCloud 08 - Hystrix 熔断器 1. 概述简介 1.1 官网 上一代 zuul 1.x: https://github.com/Netflix/zuul/wiki 当前 ga ...

  7. gateway网关配置入门

    服务网关Gateway API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有 ...

  8. SpringCloud Gateway 详解

    文章目录 一.网关简介 1.服务网关介绍 1.1 API网关介绍 1.2 网关主要功能 2.常用网关介绍 2.1 Nginx+Lua 2.2 Kong 2.3 Traefik 2.4 Zuul 二.S ...

  9. SpringCloud gateway (史上最全)

    前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家介绍三个版本的 高并发秒杀: 一.版本1 :springcloud + zookeeper 秒杀 二.版 ...

  10. 【gateway系列】一步步带你学习gateway路由规则实践

    目录 1.准备 微服务项目 gateway网关服务 2.Path 3.Query 4.Method 5.DateTime 6.RemoteAddr 7.Header 1.准备 微服务项目 新创建一个s ...

最新文章

  1. exec不同文件l怎么汇总_ABAQUS常见问题汇总 - 2.0版.doc
  2. 人群密度估计--Learning to Count with CNN Boosting
  3. 截图 从图片中取一部分
  4. 并查集(Union-Find)算法介绍
  5. 一个 NAND flash写函数
  6. 九度OnlineJudge之1004:Median
  7. 数据库开发——MySQL——基本操作
  8. js与android webview交互
  9. Oracle 在 多个Virtualbox 虚拟机间 跨不同物理宿主机进行通信
  10. spyder 护眼背景
  11. Golang——递归的使用
  12. 存储过程批量执行脚本
  13. idea中plugins配置
  14. EasyRecovery---视频文件恢复技巧
  15. OpenCV_Corner Detect with FastFeatureDetector(基于FAST的角点检测) 及 SUSAN算子
  16. Day_04 显示条纹 图案
  17. 序列选项设置html,clustalx序列比对步骤
  18. github如何配置ssh
  19. 防红域名生成的3种方法介绍
  20. Spring Boot 入门系列(二十三)整合Mybatis,实现多数据源配置!

热门文章

  1. 简单的spring mvc实例
  2. Maven pom.xml中的元素modules、parent、properties以及import(转)
  3. HBase常用Shell命令
  4. SharePoint Backup
  5. 【刨根问底】32位/64位系统、地址总线以及最大内存寻址
  6. leetcode:Longest Common Prefix【Python版】
  7. ios开发中如何隐藏各种bar
  8. ubuntu14.04 安装adb 调试设备
  9. 问题记录:图片加载快速滑动闪动问题(Android-APP)
  10. linux一个进程打印10次,如何发现linux中引起高io等待的进程