【问题标题】:Proxy b/w client and services using webClient and Mono使用 webClient 和 Mono 的代理黑白客户端和服务
【发布时间】:2018-07-23 20:11:57
【问题描述】:

我正在编写一个代理 b/w 客户端和服务,在代理中我只需要一些基本的验证并将请求传递给服务,我在下面编写了相同的代码。请让我知道这是正确的方法还是有其他更好的方法来处理这个问题。

public Mono<ServerResponse> handlePostRequest(ServerRequest request) {
        return webClient.post().uri("/some/uri").headers(headers -> request.headers())
                        .body(request.bodyToMono(DataBuffer.class), DataBuffer.class)
                        .exchange()
                            .flatMap(response -> ServerResponse.status(response.statusCode())
                                            .headers(c -> response.headers().asHttpHeaders().forEach((name, value) -> c.put(name, value)))
                                            .body(response.bodyToMono(DataBuffer.class), DataBuffer.class));

}

【问题讨论】:

    标签: spring-boot spring-webflux


    【解决方案1】:

    我在此代码 sn-p 中看不到任何验证(尽管您在问题中提到了该要求)。

    我也没有看到任何错误管理,它应该处理服务器应该响应的内容,以防远程服务器返回 HTTP 错误(它应该只转发响应吗?),或者如果它没有响应并且超时发生。

    除此之外,鉴于您分享的简短要求,这可能适合您的用例。

    请注意,根据您对 HTTP 客户端库和服务器的选择,DataBuffer 实例可以是 PooledDataBuffer - 这意味着引用被计数以允许它们被重用,并且使用它们的代码负责释放它们.在这种情况下,您将重用这些缓冲区以将它们作为请求正文转发给客户端或作为响应正文转发给服务器。 release 操作将在它们写入网络之前为您完成。

    最后,如果您正在寻找更复杂的功能,您可以查看Spring Cloud Gateway project,它可以提供更多功能。

    【讨论】:

    • 感谢布赖恩提供的信息。在我的情况下,我不需要验证请求,只需要验证标头(这些是我在过滤器中验证的),并且不想读取请求正文并按原样传递。那么 PooledDataBuffer 会是一个不错的选择吗?
    • 缓冲区的类型由 webflux 服务器/客户端选择。您必须假设它们已被汇集并在需要时释放它们。您无需明确选择它们的类型。
    猜你喜欢
    • 1970-01-01
    • 2021-02-09
    • 2013-06-02
    • 2021-10-10
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多