【发布时间】: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