断言功能详解(Predict)
前面我们了解了Route的功能,这一节我们来看一下Gateway最重要的一个核心功能-断言,这个功能决定了一个HTTP请求应该由哪个Route来做路由。
1、Predicate机制
Predicate 是Java 8中引入的一个新功能,就和我们平时在项目中写单元测试时用到的Assertion差不多,Predicate 接收一个判断条件,返回一个 ture 或 false 的布尔值结果,告知调用方判断结果。你也可以通过and (与),or(或)和negative(非) 三个操作符将多Predicate 串联在一块共同判断。
前面说到Gateway是挡在微服务前面的街达室大爷,那这Predicate 就是和大答的接头暗号。比如大爷可以要求你的Request中必须带有某个指定的参数叫name。对应的值必须是一个指定的人名“马冬梅”,如果你的Request中没有包含name,或者对应的人名给成了“马北梅”,那就是断言失败,只有当你的请求完全和接头暗号匹配的时候,大爷才能给你放行。
说白了Predicate就是一种路由规则,通过Gateway中丰富的内置断言的组合,我们就能让一个请求找到对应的Route来处理。
1.1)断言的作用阶段
一个请求在抵达网关层后,首先就要进行断言匹配,在满足所有断言之后才会进入Filter阶段,有关Fiter的内容将在接下来的小节内详细介绍。
2、常用断言介绍
Gateway提供了十多种内置断言,我们选几种常用的断言规则跟大家介绍下:
2.1)路径匹配
Path断言是最常用的一个断言请求,几乎所有路由都要便用到它,我们来看一下它的例子:
.route(r -> r.path("/gateway/**")
.uri("lb://FEIGN-SERVICE-PROVIDER/")
)
.route(r -> r.path("/baidu")
.uri(