Version: Next

Predicate 断言

观察网关 9527 启动日志,可以发现如下内容

: Loaded RoutePredicateFactory [After]
: Loaded RoutePredicateFactory [Before]
: Loaded RoutePredicateFactory [Between]
: Loaded RoutePredicateFactory [Cookie]
: Loaded RoutePredicateFactory [Header]
: Loaded RoutePredicateFactory [Host]
: Loaded RoutePredicateFactory [Method]
: Loaded RoutePredicateFactory [Path]
: Loaded RoutePredicateFactory [Query]
: Loaded RoutePredicateFactory [ReadBodyPredicateFactory]
: Loaded RoutePredicateFactory [RemoteAddr]
: Loaded RoutePredicateFactory [Weight]
: Loaded RoutePredicateFactory [CloudFoundryRouteService]
  • 先前在 9527 YAML 中配置的路由列表中,断言 predicates 属性就依据上述 RoutePredicateFactory 的内容来写
routes:
- id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
#匹配后提供服务的路由地址
#uri: http://localhost:8081
uri: lb://cloud-payment-service
predicates:
- Path=/payment/get/** # 断言,路径相匹配的进行路由
- id: payment_route2
#uri: http://localhost:8081
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
  • 可见之前只用到了 Path 断言,现在来看看其他的断言
    • After:在指定时间后才进行路由转发
获取当前时间可以用以下 Java 程序实现
public static void main(String[] args) {
ZonedDateTime time = ZonedDateTime.now(); // 默认时区
System.out.println(time);
}
  • Cookie:第一个参数是 Cookie 的名字,第二个是 正则表达式 必须匹配上才返回 true
  • Header:请求头,和 Cookie 格式一样
  • Method:请求方法
routes:
- id: payment_route2
#uri: http://localhost:8081
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
#- After=2020-03-12T15:44:15.064+08:00[Asia/Shanghai] # 在这个时间之后才做路由映射
#- Cookie=username,bsx #带Cookie,并且username的值为bsx
#- Header=X-Request-Id,\d+ #请求头要有 X-Request-Id属性并且值为整数的正则表达式
#- Method=GET # 必须是 GET 请求