Gataway中的Predicate的使用

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 说白了,Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。

说白了,Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。


Route Predicate Factories这个是什么东东?



5b2493fa72dc4d81a785858fc9297d31.png


Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分。


Spring Cloud Gateway包括许多内置的Route Predicate工厂。所有这些Predicate都与HTTP请求的不同属性匹配。多个Route Predicate工厂可以进行组合

 

Spring Cloud Gateway 创建 Route 对象时, 使用 RoutePredicateFactory 创建 Predicate 对象,Predicate 对象可以赋值给 Route。 Spring Cloud Gateway 包含许多内置的Route Predicate Factories。


常用的Route Predicate



After Route Predicate


- id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
       - Path=/payment/lb/**         # 断言,路径相匹配的进行路由
             - After=2020-02-05T15:10:03.685+08:00[Asia/Shanghai]         # 断言,路径相匹配的进行路由


Before Route Predicate 


- id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/**         # 断言,路径相匹配的进行路由
            - Before=2020-02-05T15:10:03.685+08:00[Asia/Shanghai]         # 断言,路径相匹配的进行路由


Between Route Predicate


 - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/**         # 断言,路径相匹配的进行路由
            - Between=2020-02-02T17:45:06.206+08:00[Asia/Shanghai],2020-03-25T18:59:06.206+08:00[Asia/Shanghai]


Cookie Route Predicate


Cookie Route Predicate需要两个参数,一个是 Cookie name ,一个是正则表达式。

路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行


3a78535937a8449383ee35a323ef8612.png

- id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/**         # 断言,路径相匹配的进行路由
            - Cookie=username,zzyy


Header Route Predicate 


a238f339282e43019ac57446cf438570.png


两个参数:一个是属性名称和一个正则表达式,这个属性值和正则表达式匹配则执行。


 - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/**         # 断言,路径相匹配的进行路由
            - Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数的正则表达式


Host Route Predicate


436cc10af59546d69dcb40333ced7e62.png


Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板,用.号作为分隔符。


它通过参数中的主机地址作为匹配规则。


 - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/**         # 断言,路径相匹配的进行路由
            - Host=**.atguigu.com


Method Route Predicate


dbe445c3774640f7b38b5c3a70ee2a08.png

 - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/**         # 断言,路径相匹配的进行路由
            - Method=GET


Path Route Predicate


f0b58a55b0fc44a0b48644e654e76131.png

- id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/**         # 断言,路径相匹配的进行路由


Query Route Predicate


fac84b5518c9454d9b8b982709c2d4f6.png


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


- id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/**         # 断言,路径相匹配的进行路由
            - Query=username, \d+  # 要有参数名username并且值还要是整数才能路由


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
一文搞懂:_.negate(predicate)
一文搞懂:_.negate(predicate)
10 0
|
3月前
|
Java API 容器
Java8函数式编程接口:Consumer、Supplier、Function、Predicate
Java8函数式编程接口:Consumer、Supplier、Function、Predicate
45 1
|
3月前
|
Java Spring
Gateway-Predicate
Gateway-Predicate
|
3月前
|
API
JDK8函数式接口之Predicate
JDK8函数式接口之Predicate
65 0
Java8中的函数式接口详解(Supplier、Consumer、Predicate、Function)
Java8中的函数式接口详解(Supplier、Consumer、Predicate、Function)
751 1
|
Java
1.3 Lambda表达式的基础:常用的函数式接口:Predicate、Consumer、Function等
1.3 Lambda表达式的基础:常用的函数式接口:Predicate、Consumer、Function等
60 0
常用函数式接口:Consumer、Predicate、Function的方法说明解练习
常用函数式接口:Consumer、Predicate、Function的方法说明解练习
79 0
|
Java 程序员 Go
Java 8 - 03 Lambda 函数式接口Predicate & Consumer & Function & Supplier
Java 8 - 03 Lambda 函数式接口Predicate & Consumer & Function & Supplier
95 0
四大函数式接口-Predicate和consumer和supplier
四大函数式接口-Predicate和consumer和supplier
145 0
四大函数式接口-Predicate和consumer和supplier
|
消息中间件 前端开发 JavaScript
软软猿妹问我JDK中眼花缭乱的Function/Consumer/Supplier/Predicate?(下)
哈喽,大家好,我是指北君。 JDK中有许多函数式接口,也会有许多方法会使用函数式接口作为参数,同时在各种源码中也大量使用了这些方法,那么我们在实际工作中应该如何使用!我们就来盘一盘,这样也有助于写出优雅的代码,使我们在阅读源码时事半功倍。
软软猿妹问我JDK中眼花缭乱的Function/Consumer/Supplier/Predicate?(下)