Часто задаваемые вопросы при изучении WebFlux

Java Java EE
Часто задаваемые вопросы при изучении WebFlux

предисловие

Только лысая голова может стать сильнее.

Текст был включен в мою избранную статью на 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Будьте лаконичны и легко пишите.

无缝与SpringMVC的技术使用

Стоит отметить, что:

Если веб-контейнер использует 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

выгода:Нужно только запустить масштабирование небольшого количества потоков внутри программы вместо горизонтального масштабирования через кластер. Асинхронный можетПредотвращение накопления потока, вызванного блокировкой ввода-вывода/сетевого ввода-вывода.

Давайте посмотрим на сравнение пропускной способности и времени отклика между синхронной блокировкой и асинхронной неблокировкой для одного и того же объема запроса:

吞吐量和RT对比

Примечание:

  • При небольшом количестве запросов (около 3000) многопоточная обработка запросов блокируется синхронно, а пропускная способность и время отклика не отстают. (Соответственно, WebFlux может немного отставать, ведь он сделал еще один шаг обработки-->Делегировать запрос другому потоку для обработки
  • Когда количество запросов велико, количества потоков недостаточно, а синхронная блокировка (MVC) может только ждать, поэтому пропускная способность будет уменьшаться, а время ответа увеличиваться (очередь).

Когда Spring WebFlux имеет дело с большим количеством одновременных запросов, с помощью асинхронного ввода-вывода он может обрабатывать запросы с более высокой пропускной способностью с небольшим количеством стабильных потоков., особенно когда процесс обработки запроса занимает много времени из-за сложной бизнес-блокировки или блокировки ввода-вывода, контраст становится более значительным.

3. Практическое применение WebFlux

WebFlux требует неблокирующего бизнес-кода, если он заблокирован, вам нужно открыть пул потоков, чтобы запустить его самостоятельно. В каких сценариях WebFlux может заменить SpringMVC?

  • Сценарии, в которых требуется меньше памяти и потоков
  • Сценарии, в которых сеть работает медленно или часто возникают проблемы с вводом-выводом

SpringMVC и WebFlux скорее дополняют друг друга, чем заменяют. В блокирующих сценариях SpringMVC по-прежнему остается SpringMVC, а не SpringMVC, когда выходит WebFlux.

SpringMVC和WebFlux

если ты хочешьРаскройте потенциал WebFlux, от Dao до Service, все они должны быть Mono и Flux.В настоящее время официальная среда Reactive уровня данных поддерживает только Redis, Mongo и т. д.нет JDBC.

В настоящее время дляРеляционная база данных,PivotalКоманда с открытым исходным кодомR2DBC(Реактивное подключение к реляционной базе данных), адрес GitHub которого:

В настоящее время R2DBC поддерживает три источника данных:

В общем, поскольку WebFlux является адаптивным, для обеспечения производительности WebFlux код должен быть изменен на адаптивный, а JDBC в настоящее время не поддерживается (по крайней мере, MySQL его не поддерживает), а адаптивные программы нелегко отлаживать. и писать (по сравнению с синхронными программами), поэтому сценариев применения WebFlux сейчас относительно немного.

Итак, я думаю, вУровень шлюзаБолее целесообразно использовать WebFlux (изначально это сцена с большим количеством сетевых операций ввода-вывода)

А теперь вернитесь и посмотрите на картинку официального сайта Spring, не правда ли, она более сердечная?

Spring官网介绍图

Использованная литература:

4. Нужно ли изучать режим программирования Functional Endpoints?

Как упоминалось ранее, WebFlux предоставляет нам два режима: один из них — аннотация SpringMVC, другой — называетсяFunctional Endpointsиз

Lambda-based, lightweight, and functional programming model

В общем, это использование WebFlux с Lambda и потоковое программирование. Если вы спросите меня: нужно ли учиться? На самом деле, я думаю, что могу оставить это в покое.я думаюВ настоящее время сценарии применения WebFlux все еще относительно невелики, и его нетрудно изучить, когда он действительно используется.В любом случае, это просто изучение некоторых API~

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

Ниже приведен пример использования WebFlux через аннотации:

通过注解的方式来使用WebFlux

Следующее черезFunctional EndpointsПример использования WebFlux:

Диспетчер маршрутов, эквивалентный аннотации GetMapping...

路由分发器

UserHandler, эквивалентный UserController:

UserHanler

5. Реальные сценарии использования WebFlux

В общем, поскольку WebFlux является адаптивным, для обеспечения производительности WebFlux код должен быть изменен на адаптивный, а JDBC в настоящее время не поддерживается (по крайней мере, MySQL его не поддерживает), а адаптивные программы нелегко отлаживать. и писать (по сравнению с синхронными программами), и маловероятно, что старые проекты будут напрямую обновлять свои зависимости до Spring 5.0, поэтому сценариев применения WebFlux относительно немного (личное мнение).

Более целесообразно использовать WebFlux для уровня шлюза (изначально это сценарий с большим количеством сетевых операций ввода-вывода).

  • SpringCloud Gateway реализован на базе WebFlux

Наконец

Серверу 89/год и 229/3 года.Идеально купить в подарок себе,или в подарок девушке на Новый год сразу.Так же вкусно купить и собрать проект за интервьюеру посмотреть.Также можно ознакомиться со стеком технологий.Ничего страшного,я пользуюсь у своей девушки 😂). Отсканируйте код или нажмите, чтобы купить

Учебное пособие по сборке, начиная с 0 и шаг за шагом😂

На этот раз основной мотивацией для изучения WebFlux является обмен информацией внутри группы компаний и написание PPT.Java3y) и ответьте «PPT», чтобы получить его.

Эта книга была включена в мои избранные статьи на GitHub, добро пожаловать, звезда:GitHub.com/Zhongf UC очень…

рад вывестигалантерейные товарыОбщедоступный номер технологии Java:Java3y. В публичном аккаунтеБолее 300 оригинальных статейТехнические статьи, обширные видеоресурсы, красивые карты мозга,Следуйте, чтобы получить его!

转发到朋友圈是对我最大的支持!

Большое спасиботалантМы можем видеть здесь, если эта статья хорошо написана, я чувствую себя "три криво"что-тоеслипопросить лайк Пожалуйста, следите за ️ поделитесь пожалуйста 👥 Спросите сообщение 💬Это правда для меняочень полезно! ! !

Творить не легко Ваша поддержка и признание - самая большая мотивация для моего творчества Увидимся в следующей статье!