开发者学堂课程【全面讲解 Spring Cloud Alibaba 技术栈(知识精讲+项目实战)第三阶段:Gateway自定义路由断言】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/685/detail/11891
Gateway 自定义路由断言
自定义路由断言工厂
我们来设定一个场景:假设我们的应用仅仅让 age 在(min,max)的人来访问。
第1步:在配置文件中,添加一个 Age 的断言配置
第2步:自定义一个断言工厂,实现断言方法
我们按照上面的两个步骤写一个代码:
第一步,在配置文件中添加一个配置 Age=18,60,意义:仅仅让age在18到60之间的人访问‘
routes: #
路由数组 [路由就是指当请求满足什么样的条件的时候转发到哪个微服务上,转发过程中还可以动一些手脚]
- id: product_route#
当前路由发的标识,要求唯一,默认是 UUID
uri: http:7/localhost:8081#
请求最终要被转发到的地址
uri: lb://service-product #
1b 指的是负载均衡,后面跟的是具体微服务在nacos 中的标识
order: 1#
路由的优先级,数字越小代表路由的优先级越高
predicates: #
断言(条件判断,返回值是 boolean 转发请求要满足的条件)
- Path=/product-serv/**,#
当请求路径满足 path 指定的规则时,此路由信息才会正常转发
- Age=18,60#
仅仅让 age 在18到60之间的人访问
filters: #
过滤器(在请求传递过程中对请求做一些手脚)
- stripPrefix=1 #
在请求转发之前去掉一层路径
第二步配置路由断言工厂
编写 AgeRoutePredicatefactor 配置
#这是一个自定义路由断言工厂类,要求有两个
//
1名字必须是配置+RoutePredicateFactor
//2
必须继承 AbstractRoutePredicateFactory
<
配置类>
@
Component
P
ublic
class Age
RoutePredicatefactor
extends
AbstractRoute
PredicateFactor < AgeRoutePredicateFactor.Config >
{
/
/
构造函数
public AgeRoutePredicateFactory () {
super (AgeRoutePredicateFactory.config.class) ;
}
/
/
读取配置文件中的参数值 给他复制到配置类中的属性上
public List<string> shortcutFieldorder () {
/
/
这个位置的顺序必须跟配置文件中的值得顺序对应
return
Arrays.asList(“mixAge”,“maxAge”)
}
/
/
断言逻辑
Public Predicate<ServerWebExchange>
apply(AgeRoutePre
dicateFactory.config config ) {
return
new
Predicate
<ServerWebExchange> () {
@
Override
Public Boolean test(ServerWebExchange
serverWebExchange){
//1
接受前台传入的 age 参数
String
ageStr
=
serverWebExchange.
getRequest
().getQuery
Params ().getFirst (k:”age”);
/
/2
先判断是否为空
If (stringUtils.isNotEmpty(agestr) ) {
//3
如果不为空,再进行路由逻辑判断
int age = Integer.parseInt (agestr) ;
if (age < config.getM
ax
age ( ) && age >
config.getMinAge()) {
return true;
} else {
return false;
}
}
Return fasle;
}
/
/
配置类用于接受配置文件中的对应参数
@Data
@NoArgsConStructor
public static class config {
private
int
mixAge
private
int
maxAge
}
找到 ApiGateway 重新启动,进行访问,输入 age=19,结果没有问题