当前位置: 首页 > 知识库问答 >
问题:

基于请求体内容的Spring云网关路由

微生季
2023-03-14

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

这是一个路由微服务,它类似于反向代理,根据来自每个请求主体的一些信息进行路由。这意味着对于每个请求,我需要解析请求正文并获得“username”字段,然后建立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警告我那里有阻塞调用,我真的很感激。

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

共有1个答案

麹凯捷
2023-03-14

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

 类似资料:
  • 我正在尝试在最新版本的 Spring Cloud 流中使用基于内容的路由。根据这份文件 - 这是我用StreamListener编写的代码 通过使用该条件,可以将消息路由到两个不同的函数。 我正试图用如下的功能接口方法来消费消息。 如何在函数中实现类似的基于内容的路由?蒂亚。 其他细节- Spring引导版本 - 2.3.12.发布 Spring云版 - Hoxton.SR11

  • 我们正在使用Spring Cloud Stream v2。2带有Kafka和Avro(本机编码器/解码器)。我们正在尝试根据负载的条件使用基于内容的路由。据我所知,根据Spring Cloud Stream文档,基于内容的路由只能在标头上实现,因为负载到达条件时没有经过类型转换过程。因此,除非条件基于字节格式,否则它将无法按预期工作。但是,我知道,当在本机模式下使用Avro时,会跳过消息头,并且不

  • 我想在使用Spring Cloud Gateway时对uri的一部分进行消毒。 使用全局过滤器是正确的方法?或者是否有其他钩子可以用来拦截请求并修改URI?

  • 在我的理解中,Spring Cloud Gateway必须实现一个HTTP客户端来发出反向代理请求。Spring框架提供了WebClient。我不知道Spring云网关是否真的在内部使用它。

  • 我试图将使用工作的网关迁移到Spring Cloud网关,但遇到了请求路由问题。 下面是Spring Cloud Gateway配置的一个片段,我试图在其中配置一个等效的路由: 我使用Spring Cloud Eureka作为我的Discovery服务器(在一个单独的微服务中),并且我目前没有任何配置,如配置DiscoveryClient路由的谓词和过滤器中所述 如果我向发出请求,我将收到一个40

  • 我在spring cloud gateway中实现了自定义预过滤器,它允许经过身份验证的请求通过下游流程。我想要的是,如果请求是未经身份验证的,然后返回401未授权状态的响应,并停止下游处理。我可以实现这个Spring云网关。 请帮忙。 和配置如下: