这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战。
上篇文章创建了网关子模块并介绍了Predicate的test方法,本篇文章将继续举例说明一下Predicate中and、negate、or、isEqual方法,简略解读一下PathRoutePredicateFactory.apply方法的源码。
Predicate 的 and 方法
and方法等同于我们的逻辑与(&&),存在短路特性,需要所有的条件都满足,代码如下:
1 | ini复制代码@Test |
Predicate 的 or 方法
or等同于我们的逻辑或(||),多个条件只要一个满足即可。 代码如下:
1 | ini复制代码@Test |
Predicate 的 negate 方法
negate 等同于我们的逻辑非(!)。 代码如下:
1 | typescript复制代码@Test |
Predicate 的 isEqual 方法
isEqual 类似于 equals(),区别在于,isEqual 会先判断对象是否为 NULL,不为 NULL 再使用 equals 进行比较。 代码如下:
1 | scss复制代码@Test |
PathRoutePredicateFactory.apply方法的源码
以上就大体介绍完了Predicate的方法,可以查看PathRoutePredicateFactory.apply方法的源码,apply方法最终是返回了一个new GatewayPredicate(),它继承了java8的Predicate,里面就有实现test方法。
先通过parsePath方法去获取到当前请求的路径信息,然后再去判断一下这个路径信息与我们传进来的配置是否相关,通过filter进行一个matches正则表达式的判断是否匹配,然后用findFirst返回第一个满足条件的。isPresent方法是判断查询的类对象是否存在。大家也可以去了解一下Java8引入的一个类————Optional,它的存在很好地解决了空指针异常的问题。
以下是两个比较常用的方法:
1、ofNullable
1 | php复制代码/** |
2、orElse
1 | typescript复制代码/** |
匹配就代表当前的请求被路由到当前定义的route中,否则就没有匹配再去寻找完成其他匹配。代码如下:
1 | arduino复制代码public Predicate<ServerWebExchange> apply(PathRoutePredicateFactory.Config config) { |
那么对于Predicate我们就介绍到这边,下一篇文章我们将介绍一下集成Alibaba Nacos实现动态路由配置。
本文转载自: 掘金