При вызове построителя WebClient из одного микросервиса в другой микросервис впервые выдается ошибка неверного запроса в Webflux - PullRequest
1 голос
/ 17 февраля 2020

Мы используем вызов WebClient Builder для связи между микро сервисами в нашем проекте. Это приложение на основе springboot-thymleaf-webflux. До сих пор все работало нормально, но мы получили от клиента требование изменить вызов GET на вызов POST в Контроллер thymleaf. После внесения этих изменений в пользовательском интерфейсе и бэкэнде вызовы Thymleaf работают нормально, но один из XHR, то есть после вызова из пользовательского интерфейса, выдает ошибку неверного запроса для вызова веб-клиента во второй микросервис для первого щелчка и работает для второго щелчка. Сравнение заголовка и запроса на оба клика не обнаружило никакой разницы. Я не могу понять, почему веб-клиент ведет себя неуверенно в первый раз и работает нормально во второй раз. Ниже приведен фрагмент кода для вызова веб-клиента, и он перенаправляется к исключению WebclientResponseException, не обращаясь ко второму микросервису, говоря BAD-запрос для http://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.

1 Ответ

0 голосов
/ 03 марта 2020

Это постоянная проблема с Нетти. Netty содержит некоторые соединения с недопустимым состоянием HttpObjectEncoder. Когда клиент получает такое соединение из пула и использует его для отправки запроса к целевому серверу, оно немедленно завершается неудачей, поскольку HttpObjectEncoder не может закодировать DefaultHttpRequest. Отключение пула соединений исправляет проблему.

...