【问题标题】:Spring Cloud Gateway Routing Based On Content of the Request BodySpring Cloud Gateway 基于请求体内容的路由
【发布时间】:2019-12-11 14:03:40
【问题描述】:

我需要创建一个反向代理来接收传入请求并根据请求正文的内容将请求路由到特定的 URI。

这是一个路由微服务,它的作用类似于反向代理,并根据来自每个请求主体的一些信息进行路由。这意味着对于每个请求,我需要解析请求正文并获取“用户名”字段,然后建立 JDBC 连接以从数据库中获取其他信息。根据数据库中的信息,它最终会将请求重定向到正确的 URI。

从我现在的情况来看,我有 2 种阻塞方法。第一个是对请求体的解析,另一个是到数据库的 JDBC 连接。我知道我不应该在网关过滤器中放置任何阻塞调用。我只是不知道在这种情况下我应该怎么做。我可以让这两个操作异步运行,但最后我仍然需要来自数据库的信息来进行路由。

    @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();
    }

上面的例子只包括阻塞解析,因为我的请求正文是基于 XML 的。我的 IDE 警告我那里有一个阻塞调用,我真的很感激。

非常感谢任何帮助。谢谢大家!

【问题讨论】:

    标签: reactive-programming spring-cloud-gateway


    【解决方案1】:

    经过一些研究,Mono.fromCallable 似乎很合适。然后我直接在 github repo 下问了同样的问题,结果证明使用 servlet 应用程序可能会更好。对于任何有兴趣了解我的想法的人,请看这里https://github.com/spring-cloud/spring-cloud-gateway/issues/1229

    【讨论】:

    • 嗨,这种方法有效吗?我也有类似的问题,我需要根据传入请求正文上的一个元素重定向到不同的 url。如果您能提供完整的示例,将不胜感激。提前致谢。
    猜你喜欢
    • 2021-12-06
    • 2019-10-21
    • 2020-10-06
    • 1970-01-01
    • 2019-03-02
    • 2017-02-26
    • 2023-01-21
    • 2019-08-03
    • 2019-03-31
    相关资源
    最近更新 更多