写点什么

Predicate

作者:周杰伦本人
  • 2022 年 9 月 01 日
    贵州
  • 本文字数:1502 字

    阅读完需:约 5 分钟

Predicate

Predicate 是 java 8 提供的一个函数式接口,它允许接收一个参数并返回一个布尔值,可以用于条件过滤,请求 cas 的校验。

指定时间规则匹配路由

  • 请求在指定日期之前 对应 BeforeRoutePredicateFactory

  • 请求在指定日期之后 对应 AfterRoutePredicateFactory

  • 请求在指定的两个日期之间 对应 BetweenRoutePredicateFactory


spring:  cloud:    gateway:      routes:      - id: before_route        uri: https://example.org        predicates:        - Before=2017-01-20T17:42:47.789-07:00[America/Denver]
复制代码

Cookie 匹配路由

对应 CookieRoutePredicateFactory


spring:  cloud:    gateway:      routes:      - id: cookie_route        uri: https://example.org        predicates:        - Cookie=chocolate, xpp
复制代码


当前请求需要携带一个 name=chocolate value 为 xpp 才能路由到https://example.org

Header 匹配路由

对应 HeaderRoutePredicateFactory,判断请求中 Header 头消息对应的 name 和 value 与 Predicate 配置的值是否匹配,value 也是正则匹配形式


spring:  cloud:    gateway:      routes:      - id: header_route        uri: https://example.org        predicates:        - Header=X-Request-Id, \d+
复制代码


请求中 Header 头的 name=X-Request-Id value 根据正则表达式匹配\d+ ,也就是匹配 1 个以上的数字。

Host 匹配路由

HTTP 请求会携带一个 Host 字段,这个字段表示请求的服务器地址,对应 HostRoutePredicateFactory


spring:  cloud:    gateway:      routes:      - id: host_route        uri: https://example.org        predicates:        - Host=**.somehost.org,**.anotherhost.org
复制代码


host 可以配置一个列表,列表中的每个元素通过逗号分隔。当前请求中的 host 的值符合**.somehost.org, **.anotherhost.org时候,才会路由到https://example.org

请求方法匹配路由

对应 MethodRoutePredicateFactory 根据 HTTP 请求的 Method 属性来匹配以实现路由


spring:  cloud:    gateway:      routes:      - id: method_route        uri: https://example.org        predicates:        - Method=GET,POST
复制代码


如果请求的方式为 GET 或 POST 请求,会路由到https://example.org

请求路径匹配路由

对应 PathRoutePredicateFactory


spring:  cloud:    gateway:      routes:      - id: path_route        uri: https://example.org        predicates:        - Path=/red/{segment},/blue/{segment}
复制代码


{segment}为特殊的占位符,/*表示单层路径匹配,/**表示多层路径匹配。匹配请求的 URI 为/red/* ,/blue/* 时,才会转发到https://example.org


总结一下,我们这篇文章主要讲了 gateway 的谓词部分,谓词是 java8 进入的函数式接口,提供断言功能。可以匹配 HTTP 请求中的任何内容。如果 Predicate 集合判断结果为 true,则意味着请求会被当前 Router 进行转发。


然后谓词的类型大概有按照指定时间规则匹配路由,按照 Cookie 匹配路由,按照 Header 匹配路由,按照 Host 匹配路由,按照请求方法匹配路由等待。


我们在合适的场合使用合适的谓词路由规则,简化我们的代码开发,让 gateway 网关真正起到路由转发的作用,gateway 网关的本质是对请求进行路由转发以及对请求前置和后置的过滤,在下篇文章中我们会对过滤器这一部分的内容进行讲解,如果这篇文章对你有帮助的话,不要忘了给我点赞留言哦,嘿嘿,您的赞和评论是对我大力的支持,我们一起学习好 gateway 网关,以便在工作中能够灵活运用,让 gateway 网关真正发挥它的作用。


参考:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

发布于: 刚刚阅读数: 6
用户头像

还未添加个人签名 2020.02.29 加入

公众号《盼盼小课堂》,多平台优质博主

评论

发布
暂无评论
Predicate_9月月更_周杰伦本人_InfoQ写作社区