Route删除和Gateway-Filter优先级的小坑

最近在做业务网关的时候,发现用RouteLocatorBuilder构建的Route无法操作删除和更新操作,又换回了RouteDefinition的构建方式,梳理下这里面的坑。

Route不能删除

查看GatewayControllerEndpoint可以看到有这个删除的方法:

1
2
3
4
5
6
@DeleteMapping("/routes/{id}")
public Mono<ResponseEntity<Object>> delete(@PathVariable String id) {
return this.routeDefinitionWriter.delete(Mono.just(id))
.then(Mono.defer(() -> Mono.just(ResponseEntity.ok().build())))
.onErrorResume(t -> t instanceof NotFoundException, t -> Mono.just(ResponseEntity.notFound().build()));
}

但是他只针对RouteDefinition方式构建的Route, 因为它会调用delete()这个在RouteDefinitionWriter接口中的方法,具体实现是在InMemoryRouteDefinitionRepository中,我们看最开始:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class InMemoryRouteDefinitionRepository implements RouteDefinitionRepository {

private final Map<String, RouteDefinition> routes = synchronizedMap(new LinkedHashMap<String, RouteDefinition>());

@Override
public Mono<Void> save(Mono<RouteDefinition> route) {
return route.flatMap( r -> {
routes.put(r.getId(), r);
return Mono.empty();
});
}
...
}

直接就是一个带RouteDefinition的Map,这也都是save()存进来的KV,可以很清楚的看到Key就是他的Id,然后对应着本身。所以删除的时候直接删除这一KV,然后再去publisher一下就行了。

反而Route就没有这好事,所以我不得不先放弃了这个,但是也提了issues #675, 看看官方怎么说吧。

Factory不能实现Ordered

本想着构建Factory的时候,像普通的GlobalFilter或者GatewayFilter直接实现一个Ordered就能给他一个特定的优先级了。也不用改之前其他Filters定义好的优先级,但是不行啊!

我先给了个优先级,从官方给的EndPoint可以查看到:

但是这个设置了是不起作用的!只能debug看看了,进入到任意一个GlobalFilter,查看GatewayFilterChainfilters这一项,可以看到他的order是1!所以要改变的话,只要把应该在他后面的改的值比他大就行了。

结束!🔚


Buy Me A Coffee.