前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Cloud Gateway-路由谓词工厂详解(Route Predicate Factories)

Spring Cloud Gateway-路由谓词工厂详解(Route Predicate Factories)

作者头像
用户1516716
发布于 2019-08-13 13:11:29
发布于 2019-08-13 13:11:29
2.2K00
代码可运行
举报
文章被收录于专栏:A周立SpringCloudA周立SpringCloud
运行总次数:0
代码可运行

点击上方"IT牧场",选择"设为星标"技术干货每日送达!

TIPS 本文基于Spring Cloud Greenwich SR2编写,兼容Spring Cloud Finchley及更高版本。

这一节来详细探讨Spring Cloud Gateway的路由谓词工厂(Route Predicate Factories),路由谓词工厂的作用是:符合Predicate的条件,就使用该路由的配置,否则就不管。 只要掌握这一句,掌握路由谓词工厂就比较轻松了。

TIPS Predicate是Java 8提供的一个函数式编程接口。

本文探讨了Spring Cloud Gateway中内置的谓词工厂,包括:

路由配置的两种形式

先来探讨Spring Cloud Gateway路由配置的两种姿势:

路由到指定URL

示例1:通配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
      - id: {唯一标识}
        uri: http://www.itmuch.com

表示访问 GATEWAY_URL/** 会转发到 http://www.itmuch.com/**

TIPS 这段配置不能直接使用,需要和下面的Predicate配合使用才行。

示例2:精确匹配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
      - id: {唯一标识}
        uri: http://www.itmuch.com/spring-cloud/spring-cloud-stream-pan-ta/

表示访问 GATEWAY_URL/spring-cloud/spring-cloud-stream-pan-ta/ 会转发到 http://www.itmuch.com/spring-cloud/spring-cloud-stream-pan-ta/

TIPS 这段配置不能直接使用,需要和下面的Predicate配合使用才行。

路由到服务发现组件上的微服务

示例1:通配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
      - id: {唯一标识}
        uri: lb://user-center

表示访问 GATEWAY_URL/** 会转发到 user-center 微服务的 /**

TIPS 这段配置不能直接使用,需要和下面的Predicate配合使用才行。

示例2:精确匹配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
      - id: {唯一标识}
        uri: lb://user-center/shares/1

表示访问 GATEWAY_URL/shares/1 会转发到 user-center 微服务的 /shares/1

TIPS 这段配置不能直接使用,需要和下面的Predicate配合使用才行。

谓词工厂详解

下面正式探讨路由谓词工厂。Spring Cloud Gateway提供了十来种路由谓词工厂。为网关实现灵活的转发提供了基石。

After

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: lb://user-center
          predicates:
            # 当且仅当请求时的时间After配置的时间时,才会转发到用户微服务
            # 目前配置不会进该路由配置,所以返回404
            # 将时间改成 < now的时间,则访问localhost:8040/** -> user-center/**
            # eg. 访问http://localhost:8040/users/1 -> user-center/users/1
            - After=2030-01-20T17:42:47.789-07:00[America/Denver]

TIPS •技巧:时间可使用 System.out.println(ZonedDateTime.now()); 打印,然后即可看到时区。例如:2019-08-10T16:50:42.579+08:00[Asia/Shanghai]•时间格式的相关逻辑: •默认时间格式:org.springframework.format.support.DefaultFormattingConversionService#addDefaultFormatters•时间格式注册:org.springframework.format.datetime.standard.DateTimeFormatterRegistrar#registerFormatters

Before

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
        - id: before_route
          uri: lb://user-center
          predicates:
            # 当且仅当请求时的时间Before配置的时间时,才会转发到用户微服务
            # 目前配置不会进该路由配置,所以返回404
            # 将时间改成 > now的时间,则访问localhost:8040/** -> user-center/**
            # eg. 访问http://localhost:8040/users/1 -> user-center/users/1
            - Before=2018-01-20T17:42:47.789-07:00[America/Denver]

Between

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
        - id: between_route
          uri: lb://user-center
          predicates:
            # 当且仅当请求时的时间Between配置的时间时,才会转发到用户微服务
            # 因此,访问localhost:8040/** -> user-center/**
            # eg. 访问http://localhost:8040/users/1 -> user-center/users/1
            - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2027-01-21T17:42:47.789-07:00[America/Denver]

Cookie

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
        - id: cookie_route
          uri: lb://user-center
          predicates:
            # 当且仅当带有名为somecookie,并且值符合正则ch.p的Cookie时,才会转发到用户微服务
            # 如Cookie满足条件,则访问http://localhost:8040/** -> user-center/**
            # eg. 访问http://localhost:8040/users/1 -> user-center/users/1
            - Cookie=somecookie, ch.p

Header

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
        - id: header_route
          uri: lb://user-center
          predicates:
            # 当且仅当带有名为X-Request-Id,并且值符合正则\d+的Header时,才会转发到用户微服务
            # 如Header满足条件,则访问http://localhost:8040/** -> user-center/**
            # eg. 访问http://localhost:8040/users/1 -> user-center/users/1
            - Header=X-Request-Id, \d+

Host

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
        - id: host_route
          uri: lb://user-center
          predicates:
            # 当且仅当名为Host的Header符合**.somehost.org或**.anotherhost.org时,才会转发用户微服务
            # 如Host满足条件,则访问http://localhost:8040/** -> user-center/**
            # eg. 访问http://localhost:8040/users/1 -> user-center/users/1
            - Host=**.somehost.org,**.anotherhost.org

Method

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
        - id: method_route
          uri: lb://user-center
          predicates:
            # 当且仅当HTTP请求方法是GET时,才会转发用户微服务
            # 如请求方法满足条件,访问http://localhost:8040/** -> user-center/**
            # eg. 访问http://localhost:8040/users/1 -> user-center/users/1
            - Method=GET

Path

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: lb://user-center
          predicates:
            # 当且仅当访问路径是/users/*或者/some-path/**,才会转发用户微服务
            # segment是一个特殊的占位符,单层路径匹配
            # eg. 访问http://localhost:8040/users/1 -> user-center/users/1
            - Path=/users/{segment},/some-path/**

TIPS

建议大家看下这一部分的官方文档,里面有个segment编程技巧。比较简单,留个印象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://cloud.spring.io/spring-cloud-static/Greenwich.SR2/single/spring-cloud.html#_path_route_predicate_factory

Query

示例1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
        - id: query_route
          uri: lb://user-center
          predicates:
            # 当且仅当请求带有baz的参数,才会转发到用户微服务
            # eg. 访问http://localhost:8040/users/1?baz=xx -> user-center的/users/1
            - Query=baz

示例2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
        - id: query_route
          uri: lb://user-center
          predicates:
            # 当且仅当请求带有名为foo的参数,且参数值符合正则ba.,才会转发到用户微服务
            # eg. 访问http://localhost:8040/users/1?baz=baz -> user-center的/users/1?baz=baz
            - Query=foo, ba.

RemoteAddr

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
        - id: remoteaddr_route
          uri: lb://user-center
          predicates:
            # 当且仅当请求IP192.168.1.1/24网段,例如192.168.1.10,才会转发到用户微服务
            # eg. 访问http://localhost:8040/users/1 -> user-center的/users/1
            - RemoteAddr=192.168.1.1/24

TIPS

建议大家看下这一部分的官方文档,有个小编程技巧。比较简单,留个印象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://cloud.spring.io/spring-cloud-static/Greenwich.SR2/single/spring-cloud.html#_remoteaddr_route_predicate_factory

相关代码

干货分享

最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取! •001:《Java并发与高并发解决方案》学习笔记;•002:《深入JVM内核——原理、诊断与优化》学习笔记;•003:《Java面试宝典》•004:《Docker开源书》•005:《Kubernetes开源书》•006:《DDD速成(领域驱动设计速成)》•007:全部•008:加技术讨论群

近期热文

细说 Java 主流日志工具库Spring Cloud Stream知识点盘点亚马逊实践领域驱动设计之道缓存使用过程中的几种策略总结及优缺点组合分析秒懂 QPS、TPS、PV、UV、GMV、IP、RPS!多账户的统一登录 实现全过程

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT牧场 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
即时配送的ETA问题之亿级样本特征构造实践
引言 ETA(Estimated time of Arrival,预计送达时间)是外卖配送场景中最重要的变量之一(如图1)。 我们对ETA预估的准确度和合理度会对上亿外卖用户的订单体验造成深远影响,这关系到用户的后续行为和留存,是用户后续下单意愿的压舱石。 ETA在配送业务架构中也具有重要地位,是配送运单实时调度系统的关键参数。对ETA的准确预估可以提升调度系统的效率,在有限的运力中做到对运单的合理分配。在保障用户体验的同时,对ETA的准确预估也可以帮助线下运营构建有效可行的配送考核指标,保障骑手的体验和收
美团技术团队
2018/03/13
9600
即时配送的ETA问题之亿级样本特征构造实践
即时配送的ETA问题之亿级样本特征构造实践
ETA(Estimated time of Arrival,预计送达时间)是外卖配送场景中最重要的变量之一(如图1)。我们对ETA预估的准确度和合理度会对上亿外卖用户的订单体验造成深远影响,这关系到用户的后续行为和留存,是用户后续下单意愿的压舱石。
美团无人配送
2019/05/10
6340
即时配送的ETA问题之亿级样本特征构造实践
深度学习在美团配送ETA预估中的探索与实践-笔记
文章作者:Tyan 博客:noahsnail.com  |  CSDN  |  简书
Tyan
2022/08/11
7930
深度学习在美团配送ETA预估中的探索与实践-笔记
美团配送实时特征平台建设实践
导读:2019年5月,美团正式推出新品牌「美团配送」,升级配送开放平台。那你知道支撑美团配送大脑的实时特征平台是如何建设的吗?如何实现每分钟生产千万级的实时特征?如何在70w+QPS的场景下实现4个9响应耗时在50毫秒的需求?本文将为大家介绍配送实时特征平台的发展历程,关键技术和实践经验。
Houye
2021/01/27
1.5K0
美团配送实时特征平台建设实践
深度学习在美团配送ETA预估中的探索与实践
美美导读:ETA(预计送达时间预估)是配送调度环节中非常重要的一环,而且涉及的因素特别多。本文阐述了ETA深度学习技术迭代中的一些尝试及效果。
美团技术团队
2019/03/21
1.1K0
深度学习在美团配送ETA预估中的探索与实践
美团智能配送系统的运筹优化实战-笔记
文章作者:Tyan 博客:noahsnail.com  |  CSDN  |  简书
Tyan
2022/06/12
1.9K0
美团智能配送系统的运筹优化实战-笔记
美团智能配送系统的运筹优化实战
美团配送业务场景复杂,单量规模大。下图这组数字是2019年5月美团配送品牌发布时的数据。
物流IT圈
2020/02/26
2.1K0
美团智能配送系统的运筹优化实战
专访美团点评 AI 技术团队负责人何仁清:全球规模最大的智能配送调度系统是如何建成的
AI 研习社按:互联网影响着社会的方方面面,作为 O2O 和共享经济的代表,美团外卖经过几年高速发展,以每天配送超过千万份订单、几十万骑手的规模,成为世界上最大的配送平台。实际上,看上去劳动密集型的外卖行业,其实背后蕴藏着大数据、云计算、物联网、人工智能等高新技术,是这些高科技,使美团外卖能够在激烈竞争中逐渐脱颖而出。
AI研习社
2018/07/26
2.4K0
专访美团点评 AI 技术团队负责人何仁清:全球规模最大的智能配送调度系统是如何建成的
即时配送的订单分配策略:从建模和优化-笔记
文章作者:Tyan 博客:noahsnail.com  |  CSDN  |  简书
Tyan
2022/06/12
1.9K0
即时配送的订单分配策略:从建模和优化-笔记
机器学习在美团配送系统的实践:用技术还原真实世界
本文重点解读美团在即时配送领域机器学习技术的最新进展,构建对线下真实世界各种场景的感知能力,还原并预测配送过程各个细节。
美团技术团队
2019/01/07
6600
业界 | 每天1800万单,1小时送到,美团外卖如何优化配送模型?
大数据文摘作品 在4月13号刚结束的O'Reilly和Intel AI Conference上,美团点评的配送算法策略架构师郝井华博士详细介绍了美团外卖即时配送业务的重难点,让我们来看看大数据文摘整理的演讲精华。 郝井华,美团点评研究员 美团外卖是全球最大的外卖平台,以及全球最大的即时配送平台。其共有骑手60万,签约商家150万,每天配送外卖1800万单。 美团要做的是即时配送,也就是在一个小时之内把订单送到客户手中。那么配送模式是如何配置的呢?60万骑手如何能够高效率低成本地工作? 优化配送模式 后台是把
大数据文摘
2018/05/23
1.2K0
机器学习在美团配送系统的实践:用技术还原真实世界-笔记
文章作者:Tyan 博客:noahsnail.com  |  CSDN  |  简书
Tyan
2022/06/12
7960
机器学习在美团配送系统的实践:用技术还原真实世界-笔记
机器学习在美团配送系统的实践:用技术还原真实世界
2014年,斯嘉丽·约翰逊主演的科幻片《超体》大火,影片中主人公Lucy由于无意中摄入了大量的代号为“CPH4”的神秘药物,大脑神经元获得空前的开发,获得了异乎寻常的超能力,她能够对这个世界进行全新的感知、理解和控制(比如控制无线电波),最终跨越时间和空间成为了一个超级个体。
美团技术团队
2018/12/14
8570
机器学习在美团配送系统的实践:用技术还原真实世界
历经五次迭代,看饿了么方舟智能调度系统如何指挥 300 万骑手
雷锋网 AI 研习社按,2018 年初,比达咨询发布 2017 年度中国第三方餐饮外卖市场研究报告。报告显示,2017 年度外卖市场交易规模达 2046 亿元,较去年增长 23.1%,用户规模增长 3 亿人,较去年增长 15.4%。
AI研习社
2018/07/26
2.4K0
美团配送系统架构演进实践
美团配送自成立以来,业务经历了多次跨越式的发展。业务的飞速增长,对系统的整体架构和基础设施提出了越来越高的要求,同时也不断驱动着技术团队深刻理解业务、准确定位领域模型、高效支撑系统扩展。如何在业务高速增长、可用性越来越高的背景下实现系统架构的快速有效升级?如何保证复杂业务下的研发效率与质量?本文将为大家介绍美团配送的一些思考与实践。
美团技术团队
2019/03/22
1.7K0
美团配送系统架构演进实践
【沙龙干货】主题三:美团配送智能调度实践
分享内容 ---- 外卖从2013、2014年开始到现在,最近两到三年发展速度非常快,在快速发展过程里边涌现了很多很有难度很新的问题,这个里边订单的调度是比较有难度,也是比较有代表性的一个问题,希望通过今天的分享能让大家对外卖的订单调度问题以及我们的工作有一个比较深入的认识。 美团外卖从2015年初开始决定做配送,从最开始的一到两万单,已经发展到现在的将近300万单,目前需要十万以上的骑手,这个规模相当大。随之而来的一个问题——成本相对比较高,占到整个配送运营80%以上的成本,怎么样让我们的骑手工作效率高,
美团技术团队
2018/03/12
2.3K0
【沙龙干货】主题三:美团配送智能调度实践
美团、达达:即时配送掀起智能化竞速赛
受疫情影响,消费者线上消费行为渗透率逐渐提升,即时配送服务的需求不断增多。再加上非餐需求的持续上升,即时配送覆盖场景进一步扩大,消费者依赖度再度提升。面对市场规模不断增大的即时配送领域,各路玩家纷纷来此布局试图分走一杯羹。
用户6132544
2022/04/24
5670
配送交付时间轻量级预估实践
在本文中,我们介绍了交付时间预估迭代的三个版本,分别为基于地址结构的树模型、向量召回方案以及轻量级的End-to-End的深度学习网络。同时介绍了如何在性能和指标之间取舍,以及模型策略迭代的中间历程,希望能给从事相关工作的同学们有所启发和帮助。
美团技术团队
2019/10/12
7480
配送交付时间轻量级预估实践
机器学习中模型优化不得不思考的几个问题
图1 机器学习工程师的知识图谱 图1列出了我认为一个成功的机器学习工程师需要关注和积累的点。机器学习实践中,我们平时都在积累自己的“弹药库”:分类、回归、无监督模型、Kaggle上面特征变换的黑魔法、
美团技术团队
2018/03/12
1.3K0
机器学习中模型优化不得不思考的几个问题
配送交付时间轻量级预估实践-笔记
文章作者:Tyan 博客:noahsnail.com  |  CSDN  |  简书
Tyan
2022/06/12
6460
配送交付时间轻量级预估实践-笔记
推荐阅读
相关推荐
即时配送的ETA问题之亿级样本特征构造实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验