Как использовать реактивный Spring REST API с WebClient

Мне нужно использовать реактивный REST API (построенный с spring webflux) на бэкэнд-задании (исполняемом jar).

Я читал о Spring WebClient, но я не понимаю некоторые моменты.

например:

WebClient webClient = WebClient.create("http://localhost:8080");

Mono<Person> person = webClient.get()
        .uri("/persons/{id}", 42)
        .accept(MediaType.APPLICATION_JSON)
        .exchange()
        .then(response -> response.bodyToMono(Person.class));

в последней строке есть "bodyToMono". Вот мой вопрос:

Если вызываемый REST API уже является реактивной службой, нужно ли преобразовывать ответ в mono? Есть какой-то момент я не хватает?

С моей точки зрения, я думаю, что может быть способ позволить явному в коде, что мой REST API является реактивным, но, вероятно, это то, о чем я не знаю.

1 ответов


да требуется. Вся идея быть реактивным - убедиться, что ни один из потоков не заблокирован для ввода-вывода.

возможно, вы сделали свой серверный сервис реактивным, но когда вы потребляете это, какое преимущество вы получаете, когда ваш клиент заблокирован, пока нет ответа от сервера. Клиентский поток продолжает ждать ответа сервера. Что нежелательно.

webClient.get()
        .uri("/persons/{id}", 42)
        .accept(MediaType.APPLICATION_JSON)
        .exchange().block()

заблокирует текущий поток клиента, чтобы дождаться ответа сервера. Это может заблокировать поток клиента.

webClient.get()
        .uri("/persons/{id}", 42)
        .accept(MediaType.APPLICATION_JSON)
        .exchange()
        .then(response -> response.bodyToMono(Person.class));

дает вам Mono, который является ссылкой на издателя, который может выдавать одно значение в будущем. Таким образом, поток клиента не заблокирован.

Я написал в блоге, объясняя это больше. https://dzone.com/articles/spring-5-reactive-web-services