В весенней загрузке микросервис на основе webflux, кто подписчик?
Примечание. Здесь термины "подписчик" и "подписка" используются в спецификации реактивных потоков.
Рассмотрим следующие методы @RestController в микросервисе на основе весенней загрузки на основе webflux.
@GetMapping(path = "/users", produces = MediaType.APPLICATION_JSON_VALUE)
public Flux<TradingUser> listUsers() {
return this.tradingUserRepository.findAll();
}
@GetMapping(path = "/users/{username}", produces = MediaType.APPLICATION_JSON_VALUE)
public Mono<TradingUser> showUsers(@PathVariable String username) {
return this.tradingUserRepository.findByUserName(username);
}
Здесь "кто / что" будет выступать в роли "Подписчика"? Я предполагаю, что среда весенней загрузки предоставляет подписчика (?). Может кто-нибудь предоставить подробности или ссылки по этому поводу?
Скажем, я вызываю вышеупомянутую оконечную точку отдыха с использованием клиента, такого как postman / curl / browser, тогда как в таком случае может ли сигнал клиента потребовать реактивный сервер? (Только подписчик имеет дескриптор объекта Subscription с методом request(n) для сигнализации о спросе. Однако, поскольку подписчик, вероятно, также на стороне сервера, реализован в среде весенней загрузки, как фактический клиент может сигнализировать о спросе?) Я явно что-то упускаю.
2 ответа
В настоящее время с HTTP точная информация о противодавлении не передается по сети, поскольку протокол HTTP не поддерживает это. Это может измениться, если мы используем другой проводной протокол.
Таким образом, требование реактивных потоков переводится в / из фактического чтения / записи на уровне HTTP.
Если вы посмотрите на Spring Framework's org.springframework.http.server.reactive.ServletHttpHandlerAdapter
вы увидите, что этот класс выполняет адаптацию между асинхронным вводом-выводом Servlet 3.1 и реактивными потоками. Это реализует определенный Subscriber
учебный класс.
Для этого есть и другие специфические реализации адаптера: Undertow, Jetty, Tomcat, Reactor Netty. Если базовый сервер поддерживает реактивные потоки, мы просто позволим серверу обработать запрос. Если нет, то Subscriber
реализация используется.
Внутри зависимости
org.springframework.spring-web
есть функция с именем
public void service(...
который вызывает
.subscribe
в
ServletHttpHandlerAdapter
. Я думаю, что иногда сбивает с толку понимание того, что фреймворк обрабатывает эту подписку под капотом, когда многие учебники по WebFlux показывают подписчикам Mono или Flux явно, чтобы продемонстрировать, как работают реактивные потоки, но здесь это делается фреймворком для нас.