如何使用URL-> responsible-backend-service映射服务动态路由传入的请求?

时间:2019-06-28 10:09:34

标签: spring-cloud spring-cloud-gateway

我是spring-cloud-gateway的新手,如果我以预期的方式解决了问题,我将无法回答问题。我希望有人可以为我指明正确的方向,提供建议或提供示例性的示例代码。

要求: 我的spring-cloud-gateway服务的传入请求应转发到正确的后端服务(此类后端服务有X个,每个负责特定任务)。 该请求本身没有足够的信息来决定路由到哪个后端服务。

存在其他REST服务,该服务将任意URL映射到负责的后端服务名称。响应格式是一些小的JSON,其中包含要转发到的后端服务的名称。

用spring-cloud-gateway实现此功能的最简单/最佳/最智能/预期的解决方案是什么?

我尝试实现一个GatewayFilter,该GATEWAY_REQUEST_URL_ATTR首先调用映射服务,并取决于交换的结果集.uri("not://needed"))。 这样可以。但是我还有其他问题。

  1. 是否可以在路由设置中省略@SpringBootApplication @RestController public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public RouteLocator myRoutes(RouteLocatorBuilder builder) { return builder.routes().route(r -> r .alwaysTrue() .filters(f -> f.filter(new CustomRequestFilter())) .uri("not://needed")) // how to omit ? .build(); } public static class CustomRequestFilter implements GatewayFilter, Ordered { @Override public int getOrder() { return 10000; // why order > 9999 ? (below 10000 does not work) } @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { return getBackendServiceMappingResult(exchange.getRequest().getURI().toString()) //async call to REST service mapping URL->backend service name .flatMap(mappingResult -> { URI uri = mapServiceNameToBackendService(mappingResult.getServiceName()); exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, uri); return chain.filter(exchange); }); } private URI mapServiceNameToBackendService(String serviceName) { try { switch (serviceName) { case "serviceA": return new URI("http://httpbin.org:80/get"); case "serviceB": return new URI("https://someotherhost:443/"); } } catch (URISyntaxException e) { //ignore } return null; } } static class MappingResult { String serviceName; public String getServiceName() { return serviceName; } } static Mono<MappingResult> getBackendServiceMappingResult(String uri) { WebClient client = WebClient.create("http://localhost:8080"); return client.get().uri(uriBuilder -> uriBuilder.path("/mapping").queryParam("uri", uri).build()).retrieve().bodyToMono(MappingResult.class); } } 部分?

  2. 为什么定单值必须大于9999? (请参见代码示例)

{{1}}

是否有更好的方法(使用spring-cloud-gateway)来解决要求?

0 个答案:

没有答案