1

我们正在使用 WebClient Builder 调用在我们的项目中进行微服务之间的通信。它是基于 springboot-thymleaf-webflux 的应用程序。到目前为止一切都运行良好,但我们得到了客户端的要求,将 GET 调用更改为 thymleaf 控制器中的 POST 调用。在 UI 和后端进行这些更改后,Thymleaf 调用工作正常,但其中一个 XHR 即来自 UI 的后调用 - 给 Webclient 调用第二个微服务以进行第一次单击并为第二次单击工作的错误请求错误。我比较了标题和两次点击的请求都没有发现任何区别。我无法理解为什么 webclient 第一次表现异常而第二次工作正常。下面是 webclient 调用的代码片段,它正在路由到 WebclientResponseException 而不会通过说 BAD Request forhttp://second-microservice- eureka-address/endpoint-url

     * Submitting xyz 
     * @param submitFlowRequest
     */
    @Override
    public Mono<ApiResponse<SubmitResponse>> submitFlow(SubmitFlowRequest submitFlowRequest,
            Map<String, String> headers) {
        long startTime = System.currentTimeMillis();
        String uri = propertyConfig.getAggregationService()
                + propertyConfig.getAggregationSubmitCCInfoURL();
        DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(uri);
        factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.URI_COMPONENT);
        MultiValueMap<String, String> clientHeaders = buildHeaders(headers);
        return webClientBuilder.uriBuilderFactory(factory).build().post()
                .headers(httpHeaders -> httpHeaders.addAll(clientHeaders)).accept(MediaType.APPLICATION_JSON)
                .syncBody(submitFlowRequest).retrieve().bodyToMono(ApiResponse.class)
                .onErrorMap(ConnectException.class,
                        error -> new VzwRuntimeException(ErrorCodeEnum.V404.toString(), Constants.OPP_TC_SYSTEM_ERROR,
                                (Constants.CONNECTION_FAILURE_TEXT + Constants.AGGREGATION)))
                .onErrorMap(WebClientResponseException.class,
                        error -> new VzwRuntimeException(ErrorCodeEnum.V404.toString(), Constants.OPP_TC_SYSTEM_ERROR,
                                (Constants.CONNECTION_FAILURE_TEXT + Constants.AGGREGATION)))
                .flatMap(res -> {
                    Audit apiAudit = Audit.builder().apiUrl(uri).request(LoggerUtil.asJson(submitFlowRequest))
                            .response(LoggerUtil.asJson(res))
                            .executionTime(String.valueOf(System.currentTimeMillis() - startTime))
                            .headers(LoggerUtil.asJson(clientHeaders)).transactionType(res.getData()!=null?mapper.map(res.getData(), SubmitResponse.class).getTransactionType():"").build();
                    LoggerUtil.logExternalApiCalls(apiAudit);
                    return Mono.just((ApiResponse<SubmitResponse>) res);
                });
    }```

Please provide me some lead.I am tired of finding solution for this.
4

1 回答 1

0

这是 Netty 一直存在的问题。Netty 持有一些状态无效的连接 HttpObjectEncoder。当客户端从池中获得这样的连接并使用它向目标服务器发出请求时,它会立即失败,因为 DefaultHttpRequest 无法由 HttpObjectEncoder 编码。禁用连接池可以解决问题。

于 2020-03-03T09:17:13.647 回答