项目场景:
在家休假突然接到电话,线上生产环境使用异常,部分接口请求一直报错,我开始紧急排查
问题描述
我通过f12进行调试后发现所有报500的都是同一个错误
查看后台nginx无异常
但是gateway报错
原因分析:
到这里我大概就知道问题出在那里了,这次问题主要出在 Gateway Actuator上
,根据报错定位到这个个方法
private AsyncPredicate<ServerWebExchange> combinePredicates(
RouteDefinition routeDefinition) {
List<PredicateDefinition> predicates = routeDefinition.getPredicates();
AsyncPredicate<ServerWebExchange> predicate = lookup(routeDefinition,
predicates.get(0));
for (PredicateDefinition andPredicate : predicates.subList(1,
predicates.size())) {
AsyncPredicate<ServerWebExchange> found = lookup(routeDefinition,
andPredicate);
predicate = predicate.and(found);
}
return predicate;
}
lookup(routeDefinition, predicates.get(0))
这块,表示从route配置中获取 predicates 是空的,所以才报Index: 0, Size: 0错误。要知道route路由配置中,prodicate是必填的,不允许为空,要不Gateway都启动不了,根据这个bug我检索了一下发现这个问题发现的人还是比较少可能影响的人不多,通过查看大佬们的博客大概把问题定位了
如果Gateway和Actuator集成后,是可以提供动态操作route路由的接口的。
创建路由,发送Post请求:/gateway/routes/{id_route_to_create}
删除路由,发送Delete请求:/gateway/routes/{id_route_to_delete}
如果使用创建路由接口,参数是一个不完整的route(因为这个接口没有任何参数校验),就会报我们项目的错误。既然BUG复现了,解决方案就好办了,禁用Gateway专用的Actuator接口
解决方案:
management:
endpoint:
gateway:
enabled: false
影响版本
Spring Cloud Gateway < 3.1.1
Spring Cloud Gateway < 3.0.7