SpringCloudGateway网关-开发过程中遇到问题的总结

93 阅读2分钟

背景:最近项目引入了SpringCloudGateway作为网关,网关的用处网上一大堆,这里就不再赘叙了。我们在使用的时候遇到转发地址的时候遇到多种场景,在原有配置的基础上需要切换host、切换path以及切换URL的情况下。对于这么多场景,大家觉得写几个方法做这个事比较好。

现状:其实我们在开发的时候发现一种情况写一个方法去解决,好不容易部署到测试环境,突然遇到一种情况转发的请求地址需要切换默认配置的URL,这时候就需要分别调用切换Host和切换,虽然功能实现了,总感觉很别扭。这块代码写的冗余,且后期不利于代码维护。这时候需要想怎么才能优雅的实现转发的地址。

解决方案:既然URL = host + Path.那不如只提供一个方法,只考虑切换URL的方法。这样调用者自己拼好跳转地址,这样方法数由之前的三个合并成一个,维护成本降低了很多,同时由于方法通熟易懂,调用者也不至于搞不清楚到底调用哪个方法。废话不多说了,直接把code贴出来。

public static Mono<Void> changeUrl(ServerWebExchange exchange,GatewayFilterChain chain,String newHttpUrl){
    ServerHttpRequest request = exchange.getRequest();
    HttpMethod httpMethod = request.getMethod();
    MultiValueMap<String, String> queryParams = request.getQueryParams();
    URI uri = UriComponentsBuilder.fromHttpUrl(newHttpUrl).queryParams(queryParams).build().toUri();
    ServerHttpRequest serverHttpRequest = request.mutate().uri(uri).method(httpMethod).headers(httpHeaders -> httpHeaders = httpHeaders).build();
    Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR);
    Route newRoute =
            Route.async().asyncPredicate(route.getPredicate()).filters(route.getFilters()).id(route.getId())
                    .order(route.getOrder()).uri(uri).build();
    exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, newRoute);
    return chain.filter(exchange.mutate().request(serverHttpRequest).build());
}

通过上面代码,我们发现,其实这段代码逻辑并不复杂,就是重写了route.整个方法大家一看就明白,第三个参数就是网关需要转发的服务的URL地址。