предисловие
Только лысая голова может стать сильнее.
Текст был включен в мою избранную статью на GitHub, Welcome Star.:GitHub.com/Zhongf UC очень…
Просмотрите мое введение в WebFlux в предыдущей статье.Если вы ее не читали, то рекомендуем прочитать эту статью еще раз.Последняя статья отняла у меня много сил~~
Начнем с другой картинки, содержимое все отредактировано:
В этой статье в основном написаны некоторые вопросы, которые у меня были о WebFlux, когда я был новичком.Интересно, были ли у вас какие-либо соответствующие вопросы, когда вы читали предыдущую статью?
На этот раз основной мотивацией для изучения WebFlux является обмен информацией внутри группы компаний и написание PPT.Java3y) и ответьте «PPT», чтобы получить его.
1. Асинхронная неблокировка уже может быть достигнута, зачем использовать WebFlux?
Я считаю, что студенты, обладающие соответствующими знаниями, знают, что,Servlet 3.1
Он уже поддерживает асинхронную неблокировку.
мы можем использоватьАсинхронный способ самоподдерживающегося пула потоков
- Грубо говоря, поток Tomcat обрабатывает запрос, а затем распределяет запрос в самоподдерживающийся поток для обработки, и поток запроса Tomcat возвращает
@WebServlet(value = "/nonBlockingThreadPoolAsync", asyncSupported = true)
public class NonBlockingAsyncHelloServlet extends HttpServlet {
private static ThreadPoolExecutor executor = new ThreadPoolExecutor(100, 200, 50000L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(100));
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
AsyncContext asyncContext = request.startAsync();
ServletInputStream inputStream = request.getInputStream();
inputStream.setReadListener(new ReadListener() {
@Override
public void onDataAvailable() throws IOException {
}
@Override
public void onAllDataRead() throws IOException {
executor.execute(() -> {
new LongRunningProcess().run();
try {
asyncContext.getResponse().getWriter().write("Hello World!");
} catch (IOException e) {
e.printStackTrace();
}
asyncContext.complete();
});
}
@Override
public void onError(Throwable t) {
asyncContext.complete();
}
});
}
}
Блок-схема выглядит следующим образом:
Источник для примера выше:
Простой способ, мы также можем использовать JDK 8 при условииCompletableFuture
Класс, этот класс может легко обрабатывать асинхронные вызовы.
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
long t1 = System.currentTimeMillis();
// 开启异步
AsyncContext asyncContext = request.startAsync();
// 执行业务代码(doSomething 指的是处理耗费时间长的方法)
CompletableFuture.runAsync(() -> doSomeThing(asyncContext,
asyncContext.getRequest(), asyncContext.getResponse()));
System.out.println("async use:" + (System.currentTimeMillis() - t1));
}
Для обработки сложной логики либо обратный вызов, либо CompletableFuture вКодировать сложнее(Объем кода большой и его нелегко понять), а WebFlux использует реактивный поток Reactor, которыйПредоставляет серию API для обработки логики, это очень удобно.
важнее:
- WebFlux можно использовать как SpringMVC, что может значительно снизить стоимость обучения.
- WebFlux также можно использоватьFunctional Endpointsспособ программирования, в общем, лучше, чем
回调/CompletableFuture
Будьте лаконичны и легко пишите.
Стоит отметить, что:
Если веб-контейнер использует Tomcat, то он использует Reactor.наведение мостовсервлет асинхронный API Если веб-контейнер Netty, то используется Netty, который, естественно, поддерживает Reactive
Официальная рекомендация — использовать Netty для запуска WebFlux.
Во-вторых, проблема производительности WebFlux.
Из прошлой статьи мы узнали, что браузер вызывает интерфейс с медленной обработкой, независимо от того, является ли интерфейс синхронным или асинхронным.Время возврата в браузер постоянно.
- Синхронизация: сервер получает запрос, а поток обрабатывает запрос до тех пор, пока запрос не будет обработан и возвращен в браузер.
- Асинхронный: сервер получает запрос, поток обрабатывает запрос, а затемназначенный потокДля обработки запроса поток запроса непосредственно простаивает.
На официальном сайте также говорится:
Reactive and non-blocking generally do not make applications run faster
Преимущества использования асинхронной неблокировки:
The key expected benefit of reactive and non-blocking is the ability to scale with a small, fixed number of threads and less memory.That makes applications more resilient under load, because they scale in a more predictable way
выгода:Нужно только запустить масштабирование небольшого количества потоков внутри программы вместо горизонтального масштабирования через кластер. Асинхронный можетПредотвращение накопления потока, вызванного блокировкой ввода-вывода/сетевого ввода-вывода.
Давайте посмотрим на сравнение пропускной способности и времени отклика между синхронной блокировкой и асинхронной неблокировкой для одного и того же объема запроса:
Примечание:
- При небольшом количестве запросов (около 3000) многопоточная обработка запросов блокируется синхронно, а пропускная способность и время отклика не отстают. (Соответственно, WebFlux может немного отставать, ведь он сделал еще один шаг обработки
-->
Делегировать запрос другому потоку для обработки - Когда количество запросов велико, количества потоков недостаточно, а синхронная блокировка (MVC) может только ждать, поэтому пропускная способность будет уменьшаться, а время ответа увеличиваться (очередь).
Когда Spring WebFlux имеет дело с большим количеством одновременных запросов, с помощью асинхронного ввода-вывода он может обрабатывать запросы с более высокой пропускной способностью с небольшим количеством стабильных потоков., особенно когда процесс обработки запроса занимает много времени из-за сложной бизнес-блокировки или блокировки ввода-вывода, контраст становится более значительным.
3. Практическое применение WebFlux
WebFlux требует неблокирующего бизнес-кода, если он заблокирован, вам нужно открыть пул потоков, чтобы запустить его самостоятельно. В каких сценариях WebFlux может заменить SpringMVC?
- Сценарии, в которых требуется меньше памяти и потоков
- Сценарии, в которых сеть работает медленно или часто возникают проблемы с вводом-выводом
SpringMVC и WebFlux скорее дополняют друг друга, чем заменяют. В блокирующих сценариях SpringMVC по-прежнему остается SpringMVC, а не SpringMVC, когда выходит WebFlux.
если ты хочешьРаскройте потенциал WebFlux, от Dao до Service, все они должны быть Mono и Flux.В настоящее время официальная среда Reactive уровня данных поддерживает только Redis, Mongo и т. д.нет JDBC.
В настоящее время дляРеляционная база данных,PivotalКоманда с открытым исходным кодомR2DBC(Реактивное подключение к реляционной базе данных), адрес GitHub которого:
В настоящее время R2DBC поддерживает три источника данных:
В общем, поскольку WebFlux является адаптивным, для обеспечения производительности WebFlux код должен быть изменен на адаптивный, а JDBC в настоящее время не поддерживается (по крайней мере, MySQL его не поддерживает), а адаптивные программы нелегко отлаживать. и писать (по сравнению с синхронными программами), поэтому сценариев применения WebFlux сейчас относительно немного.
Итак, я думаю, вУровень шлюзаБолее целесообразно использовать WebFlux (изначально это сцена с большим количеством сетевых операций ввода-вывода)
А теперь вернитесь и посмотрите на картинку официального сайта Spring, не правда ли, она более сердечная?
Использованная литература:
4. Нужно ли изучать режим программирования Functional Endpoints?
Как упоминалось ранее, WebFlux предоставляет нам два режима: один из них — аннотация SpringMVC, другой — называетсяFunctional Endpoints
из
Lambda-based, lightweight, and functional programming model
В общем, это использование WebFlux с Lambda и потоковое программирование. Если вы спросите меня: нужно ли учиться? На самом деле, я думаю, что могу оставить это в покое.я думаюВ настоящее время сценарии применения WebFlux все еще относительно невелики, и его нетрудно изучить, когда он действительно используется.В любом случае, это просто изучение некоторых API~
Благодаря основам лямбда-выражения и потокового потока не проблема изучить его, когда он фактически используется.~
Ниже приведен пример использования WebFlux через аннотации:
Следующее черезFunctional Endpoints
Пример использования WebFlux:
Диспетчер маршрутов, эквивалентный аннотации GetMapping...
UserHandler, эквивалентный UserController:
5. Реальные сценарии использования WebFlux
В общем, поскольку WebFlux является адаптивным, для обеспечения производительности WebFlux код должен быть изменен на адаптивный, а JDBC в настоящее время не поддерживается (по крайней мере, MySQL его не поддерживает), а адаптивные программы нелегко отлаживать. и писать (по сравнению с синхронными программами), и маловероятно, что старые проекты будут напрямую обновлять свои зависимости до Spring 5.0, поэтому сценариев применения WebFlux относительно немного (личное мнение).
Более целесообразно использовать WebFlux для уровня шлюза (изначально это сценарий с большим количеством сетевых операций ввода-вывода).
- SpringCloud Gateway реализован на базе WebFlux
Наконец
Учебное пособие по сборке, начиная с 0 и шаг за шагом😂
На этот раз основной мотивацией для изучения WebFlux является обмен информацией внутри группы компаний и написание PPT.Java3y) и ответьте «PPT», чтобы получить его.
Эта книга была включена в мои избранные статьи на GitHub, добро пожаловать, звезда:GitHub.com/Zhongf UC очень…
рад вывестигалантерейные товарыОбщедоступный номер технологии Java:Java3y. В публичном аккаунтеБолее 300 оригинальных статейТехнические статьи, обширные видеоресурсы, красивые карты мозга,Следуйте, чтобы получить его!
Большое спасиботалантМы можем видеть здесь, если эта статья хорошо написана, я чувствую себя "три криво"что-тоеслипопросить лайк Пожалуйста, следите за ️ поделитесь пожалуйста 👥 Спросите сообщение 💬Это правда для меняочень полезно! ! !
Творить не легко Ваша поддержка и признание - самая большая мотивация для моего творчества Увидимся в следующей статье!