Я посмотрел его, и кажется, что в принципе, и Spring WebFlux WebClient
, и Reactor Netty HttpClient
предназначены для первой обработки запроса (отправки тела запроса), а затем чтения тела ответа.
Другие HTTP-клиенты могут разрешить это, но я думаю, что в этом случае это способ связать противодавление как в операциях чтения / записи, так и объединить все в один реактивный конвейер.
Возможно, вы ищете двунаправленный транспортный протокол, ориентированный на сообщения, с поддержкой противодавления. Вы можете взглянуть на WebSockets (хотя вам нужно будет определить собственную семантику сообщений там) или следить за RSocket .
Если вы просто ищете эффективный реактивный шлюз, то Spring Cloud Gateway - ваш лучший выбор, так как он полностью активен и поддерживает интересные дополнительные функции.
Несколько дополнительных примечаний:
Spring WebFlux (как на уровне клиента, так и на уровне сервера) использует реализации Encoder
и Decoder
, адаптируясь к сообщению Content-Type. Некоторые конкретные типы контента, такие как application/streaming+json
или text/event-stream
, реализованы с учетом сценариев потоковой передачи. Это означает, что кодеры пишут сообщения по мере их поступления, разделенные определенными символами, и сбрасываются в сети. Использование обычных типов носителей, таких как application/octet-stream
или application/json
, не приведет к такому поведению. В этих случаях прокси и посредники могут буферизировать тело сообщения и предоставлять большие / меньшие окна. Вот почему такие механизмы требуют разделителя между сообщениями и надлежащими кодеками.
Насколько я понимаю, вы используете HTTP 1.1, который использует механизм запроса / ответа - спецификация HTTP явно не запрещает серверу писать ответ до прочтения полного запроса, но говорит, что он должен прочитать полное тело запроса (или закрыть соединение), несмотря ни на что. См https://tools.ietf.org/html/rfc7230#section-3.4
Как всегда, вы можете запросить улучшения для https://jira.spring.io,, хотя в этом случае, я думаю, это сделано намеренно.