Spring Cloud Gateway Routing Based On Content of the Request Body

我的梦境 提交于 2021-01-24 08:12:39

问题


I need to create a reverse proxy that takes incoming request and based on the content of the request body, route the request to specific URI.

This is for a routing micro service that acts like a reverse proxy and does routing based on some information from each request body. This means for each request I need to parse the request body and get the "username" field and then make a JDBC connection to fetch additional information from the database. Based on that information in database, it would finally redirect the request to the correct URI.

From what I have now, I have 2 blocking methods. The first one is the parsing for the request body, the other one is the JDBC connection to the database. I understand that I should not put any blocking calls inside the gateway filter. I just don't know what I should do in this case. I could have both operations running async but in the end I still need the information from database to do routing.

    @Bean
    public RouteLocator apiLocator(RouteLocatorBuilder builder, XmlMapper xmlMapper) {
        return builder.routes()
            .route(r -> r
                .path("/test")
                .and()
                .readBody(String.class, s -> true)  // Read the request body, data will be cached as cachedRequestBodyObject
                .filters(f -> f.filter(new GatewayFilter() {
                    @Override
                    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                        try {
                            // The following method is blocking and should not be put here
                            xmlMapper.readValue((String) exchange.getAttribute("cachedRequestBodyObject"), Map.class);
                        } catch (Exception e) {
                            //TODO
                        }
                        return chain.filter(exchange);
                    }
                }))
                .uri("http://localhost:8080"))
            .build();
    }

The above example only includes the blocking parsing as my request body is XML based. My IDE is warning me of having a blocking call there which I really appreciate.

Any help is greatly appreciated. Thank you everyone!


回答1:


After some research, Mono.fromCallable seems to be a good fit. I then asked the same question directly under the github repo, it turns out that using a servlet app may be better. For anyone who is interested to see what I came up with, please take a look here https://github.com/spring-cloud/spring-cloud-gateway/issues/1229



来源:https://stackoverflow.com/questions/57335022/spring-cloud-gateway-routing-based-on-content-of-the-request-body

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!