本文编写一些测试例子来说下gateway中的内置路由谓词工厂。

文章目录

  • 环境准备
  • 常见路由谓词工厂
  • 实战部分
    • 路径-谓词工厂
    • 后时刻-谓词工厂
    • 前时刻-谓词工厂
    • 时间段-谓词工厂
    • cookie-谓词工厂
    • 方法-谓词工厂
    • 请求头-谓词工厂
    • 查询参数-谓词工厂
    • 主机-谓词工厂
    • RemoteAddr/网段-路由谓词工厂
    • 权重-谓词工厂
  • 本文小结

环境准备

为了测试gateway的使用,使用springboot搭建了简单服务。服务是注册在注册中心nacos中,网关没有在注册中心注册,后面介绍动态网关的时候再进行注册。

搭建了一个端口为8581的order服务


常见路由谓词工厂

官网给出的内置路由谓词工厂


实战部分

路径-谓词工厂

-Path=路径1

exmaple: 请求Url包含/order/**时触发路由 ,将请求转发到order-service服务中

具体配置如下:

server:port: 8888spring:application:name: api-gatewaycloud:gateway:#路由规则routes:#路由ID,唯一- id: server-order#目标URI,路由到微服务地址uri: http://localhost:8581#断言,判断条件predicates:#匹配对应URL的请求,将匹配到的请求追加在目标URI之后- Path=/order/**

网关测试

先看实际效果,再分析

通过访问网关的http://localhost:8888/order/getNameAndPort 接口调用到了 order服务 localhost:8581/order/getNameAndPort 接口。这个是最简单,也是常用的路由规则。


后时刻-谓词工厂

可以设置一个时间点,当系统时间大于设置时间点时才会将请求进行路由。

– After=时刻

server:port: 8888spring:application:name: api-gatewaycloud:gateway:#路由规则routes:#路由ID,唯一- id: server-order#目标URI,路由到微服务地址uri: http://localhost:8581#断言,判断条件predicates:# [Asia/Shanghai] 为时间所对应的时区- After=2020-10-10T21:21:21.993+08:00[Asia/Shanghai]

测试结果


这样设置后谓词工厂后呢,即是当系统时间(上海时区)大于2020年10月10日21点21分21秒后 ,才会将请求进行路由。


前时刻-谓词工厂

与后路径谓词工厂一样,一样是支持一个时间点设置,当当前请求时间小于设置的路由时间时,才会将请求进行路由。

– Before=时刻

server:port: 8888spring:application:name: api-gatewaycloud:gateway:#路由规则routes:#路由ID,唯一- id: server-order#目标URI,路由到微服务地址uri: http://localhost:8581#断言,判断条件predicates:# [Asia/Shanghai] 为时间所对应的时区- Before=2022-10-10T21:21:21.993+08:00[Asia/Shanghai]

测试结果


时间段-谓词工厂

这个时间段路由谓词呢,实际就是 前时刻 后时刻 两个路由谓词的综合,其配置需要设置两个时间点,当请求时间在这两个时间点之间,则会触发路由,反之则不进行路由。

-Between=时刻1,时刻2

server:port: 8888spring:application:name: api-gatewaycloud:gateway:#路由规则routes:#路由ID,唯一- id: server-order#目标URI,路由到微服务地址uri: http://localhost:8581#断言,判断条件predicates:# [Asia/Shanghai] 为时间所对应的时区- Between=2022-01-01T22:22:22.993+08:00[Asia/Shanghai],2022-10-10T10:10:10.993+08:00[Asia/Shanghai]

测试结果


cookie-谓词工厂

看名字,即可猜出当前路由触发条件了,即当我们的请求包含某cookie的时候才会进行路由,

– Cookie=cookie名字,值(值支持正则表达式)

server:port: 8888spring:application:name: api-gatewaycloud:gateway:#路由规则routes:#路由ID,唯一- id: server-order#目标URI,路由到微服务地址uri: http://localhost:8581#断言,判断条件predicates:- Cookie=username,zs

如果按照我这么配置,那么我们的请求必须携带userme的cookie ,且其值必须为zs。

当cookie不满足时,则无法触发路由


方法-谓词工厂

所谓方法谓词工厂,即是根据HTTP请求类型匹配来路由,例如GET、POST、PUT、DELETE等等,可配置多种请求方法。

– Method=GET,POST

server:port: 8888spring:application:name: api-gatewaycloud:gateway:#路由规则routes:#路由ID,唯一- id: server-order#目标URI,路由到微服务地址uri: http://localhost:8581#断言,判断条件predicates:- Method=GET,POST

测试结果

当为put请求的时候


请求头-谓词工厂

例如我们在实际开发中,通常会设置一个token请求头,当有些接口需要登录访问,则会校验当前请求是否携带一个token请求头…

或者说,我们前后端交互的时候,要求前端向后端传输JSON格式的参数,那么在HTTP请求的时候,需要加上一个Content-Type= application/json 的一个键值对请求头…

我们的请求头谓词呢,即是要求当前HTTP请求必须携带定义的请求头才会触发路由

– Header=Authentication,zs

server:port: 8888spring:application:name: api-gatewaycloud:gateway:#路由规则routes:#路由ID,唯一- id: server-order#目标URI,路由到微服务地址uri: http://localhost:8581#断言,判断条件predicates:- Header=Authentication,zs

当我们的请求没有携带设置的请求头时

当我们的请求携带设置的请求头时


查询参数-谓词工厂

即当我们的请求中含有某个请求参数时,才会进行路由。此设置则只要求请求参数中必须携带参数名为:【参数名】

– Query=【参数名】

server:port: 8888spring:application:name: api-gatewaycloud:gateway:#路由规则routes:#路由ID,唯一- id: server-order#目标URI,路由到微服务地址uri: http://localhost:8581#断言,判断条件predicates:- Query=name

无设置的参数请求

有gateway路由谓词设置的参数请求


主机-谓词工厂

即需要我们的请求头中必须要携带设置的主机信息,才会对我们的请求进行路由。

主机名列表可设置多个,例如下边这样

– Host=主机1,主机2,主机3…

server:port: 8888spring:application:name: api-gatewaycloud:gateway:#路由规则routes:#路由ID,唯一- id: server-order#目标URI,路由到微服务地址uri: http://localhost:8581#断言,判断条件predicates:- Host=**.zs.org

** 则支持模糊匹配

携带Host信息的时候

不携带或者错误的host信息


RemoteAddr/网段-路由谓词工厂

当前谓词呢,即只接受设置的某一网段类的请求,当请求来自于某一网段时,才会触发路由

–RemoteAddr=192.168.0.1/24

server:port: 8888spring:application:name: api-gatewaycloud:gateway:#路由规则routes:#路由ID,唯一- id: server-order#目标URI,路由到微服务地址uri: http://localhost:8581#断言,判断条件predicates:- RemoteAddr=192.168.0.1/24

即当请求方的IP为192.168.0.1-192.168.0.24之间时,才会触发路由。


权重-谓词工厂

我们做后端的,都应该知道这个词:负载均衡。而在负载均衡中呢,又涉及到了负载的权重策略 ,例如随机、轮询、权重等。何为权重?权重,说白了就是某一因素对某一事物的重要程度,程度的高低则为权重的高低。

在路由谓词的时候即支持权重了,可根据我们配置的权重比,将请求进行相应量化的转发,其需要设置两个参数一个是group一个是weight,即权重分组和权重比。

– Weight=组, 权重比

server:port: 8888spring:application:name: api-gatewaycloud:gateway:#路由规则routes:#路由ID,唯一- id: server-order#目标URI,路由到微服务地址uri: http://localhost:8581#断言,判断条件predicates:- Weight=testWeight, 2- id: server-order2#目标URI,路由到微服务地址uri: http://localhost:8582#断言,判断条件predicates:- Weight=testWeight, 1

两次8581的服务,一次8582的服务




本文小结

本文介绍了现在常用的gateway各种内置的路由谓词工厂,编写了简单的实例来进行说明。

Gateway路由谓词工厂实例相关推荐

  1. Spring Cloud Gateway(一)为什么用网关、能做什么、为什么选择Gateway、谓词工厂、过滤器配置

    1.为什么用网关?能做什么?为什么选择Gateway? 1.1.为什么用网关 网关api:封装了系统内部架构,为每个客户端提供一个定制的 API.在微服务架构中,服务网关的核心要点是,所有的客户端和消 ...

  2. spring-cloud(十一)GateWay强大的路由谓词(断言)功能

    spring-cloud-Hoxton.SR6 (十一)GateWay强大的路由谓词(断言)功能 本文spring-cloud 版本为:hoxton.sr6 本文spring-boot版本为:2.2. ...

  3. Spring Cloud Alibaba - 25 Gateway-路由断言工厂Route Predicate Factories谓词工厂示例及源码解析

    文章目录 官网 The After Route Predicate Factory 小栗子 AfterRoutePredicateFactory源码 The Before Route Predicat ...

  4. Spring Cloud Gateway 路由转发之After(Before)路由断言工厂使用

    前言 本文旨在介绍After(Before)路由断言工厂使用,以此类推可以使用其他路由断言工厂 案例 1.概念 网关简单的说就是提供一个对外统一的API入口和出口,统管企业对外的所有API出口.一般来 ...

  5. Spring Cloud Gateway之路由断言工厂篇

    1. 背景 最近,需要提升系统安全性,市面上有很多款网关服务的技术方案,最终选择了Spring Cloud Gateway. 2. Spring Cloud Gateway工作机制 官网配图: 客户端 ...

  6. GateWay路由网关的概述与入门详解

    一.概述简介 官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/h ...

  7. 三分钟了解Spring Cloud Gateway路由转发之自动路由

    文章目录 一.前言 二.路由配置 1. 静态路由 2. 动态路由 3. 自动路由 三.Spring Cloud Gateway 是如何实现动态路由 工作原理 源码解析 路由转发原理 路由转发源码解析 ...

  8. Spring Cloud Alibaba - 26 Gateway-自定义谓词工厂RoutePredicateFactory

    文章目录 需求 三部曲 第一步 搞配置类 第二步 搞自定义谓词工厂 第三部 搞配置 验证 源码 需求 我们看了官方提供的几个例子,如果都不满足呢? 举个例子: 实现一个类似 12306订票管控的需求: ...

  9. gateway路由网关,zuul的替代品

    zuul1 low, zuul2 还没长大呢,不敢用. gateway 基于netty, spring flux, reactor 异步非阻塞, 快呀. 与spring良好整合, spring社区的呢 ...

最新文章

  1. PG 9.4 行冻结信息的测试
  2. 02_Mybatis动态代理
  3. Windows、Linux和MAC的CR, LF, CR/LF换行符
  4. Educational Codeforces Round 114总结
  5. spark简介(大数据技术)
  6. 在intellij idea 中怎么不用git 解除关联
  7. 程序员的黑科技_用代码回复博客
  8. SpringMVC 理论与有用技术(一) 简单、有用、易懂的几个实例
  9. opencv 实现图像时钟
  10. php中的常用魔术方法总结
  11. 遥感常用数据下载链接
  12. Mac开机速度优化的详细教程
  13. 如何在高共模电压下测量小差分电压
  14. Unity3DAI行为------路径跟随
  15. 基于 mycat,我实现了一个数据库透明加密中间件
  16. 系统组件:工具栏Toolbar
  17. 设置表头QHeaderView
  18. Android面试总结(持续更新修改)
  19. 视频捕捉全教程(vc+vfw)
  20. python 列表去重 保持顺序

热门文章

  1. C#里的进制与ASCII转换
  2. Python报错too many values to unpack解决方案
  3. “体验版”PyTorch 2.0备受瞩目,它到底好在哪里?
  4. NOI2006:金明的预算方案
  5. fluentd收集K8S日志并以K8S的container_name作为索引名存入Elasticsearch中
  6. 集运系统,集运下单系统,国际物流集运系统,转运系统源码 集运系统源码
  7. 记录一下家里双路由实现wifi漫游功能
  8. 2019届大疆提前批校招机器学习岗笔试B卷
  9. C++小白入职如何快速上手
  10. HC3i论坛医疗信息化热门资源100个