Учебное пособие по Spring Boot 2.0 WebFlux (1) Начало работы

Spring Boot
Учебное пособие по Spring Boot 2.0 WebFlux (1) Начало работы

Статья впервые опубликована из личного паблика: Сяоха изучает Java

Персональный сайт:www.exception.site/webflux

содержание

1. Что такое Spring WebFlux

Во-вторых, преимущества WebFlux и повышение производительности?

3. Сценарии применения WebFlux

В-четвертых, выбрать WebFlux или Spring MVC?

Пять сходств и различий

6. Краткий обзор того, как WebFlux распределяет запросы

7. Быстрый старт

  • 7.1 Добавление зависимостей webflux

  • 7.2 Определение интерфейса

  • 7.3 Тестовый интерфейс

8. Резюме

9. Пример кода GitHub

1. Что такое Spring WebFlux

Следующая картинка взята с официального сайта Spring Boot:

Spring Boot 2.0 WebFlux 教程 | 入门篇
Учебное пособие по Spring Boot 2.0 WebFlux | Начало работы

В сочетании с приведенным выше рисунком, прежде чем понять Spring WebFlux, давайте сравним, что такое Spring MVC, что более полезно для нас, чтобы понять WebFlux.Определение Spring MVC в правой части рисунка выглядит следующим образом:

Spring MVC is built on the Servlet API and uses a synchronous blocking I/O architecture whth a one-request-per-thread model.

В переводе это означает следующее:

Spring MVC построен на API-интерфейсе сервлетов и использует модель синхронного блокирующего ввода-вывода Что такое модель синхронного блокирующего ввода-вывода? То есть каждый запрос соответствует потоку для обработки.

После понимания Spring MVC давайте поговорим о Spring WebFlux:

В левой части изображения выше официальное определение выглядит следующим образом:

Spring WebFlux is a non-blocking web framework built from the ground up to take advantage of multi-core, next-generation processors and handle massive numbers of concurrent connections.

Переведите это следующим образом:

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

Во-вторых, преимущества WebFlux и повышение производительности?

WebFlux использует внутри себя реактивное программирование, основанное на библиотеке Reactor, основанное на асинхронности и управляемом событиями, что позволяет нам повысить пропускную способность и масштабируемость системы без увеличения аппаратных ресурсов.

Увидев это, думаете ли вы, что WebFlux может заставить программу работать быстрее? Чтобы немного оценить, например, после того, как я использую WebFlux, сократится ли время ответа на запрос интерфейса?

Извините, ответ - нет!Вот официальное слово:

Reactive and non-blocking generally do not make applications run faster.

WebFlux не улучшает время отклика интерфейса, а только увеличивает пропускную способность и масштабируемость..

3. Сценарии применения WebFlux

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

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

WebFlux网关
Шлюз WebFlux

В-четвертых, выбрать WebFlux или Spring MVC?

Прежде всего, вам нужно четко указать, что:WebFlux не является заменой Spring MVC.! , хотя WebFlux также может быть запущен в контейнере сервлетов (это должен быть контейнер сервлетов 3.1+), но WebFlux в основном используется в модели асинхронного неблокирующего программирования, тогда как Spring MVC является синхронной блокировкой, если вы в настоящее время находитесь в Фреймворк Spring MVC Если вы используете много асинхронных решений, то WebFlux — это то, что вам нужно, в противном случае использование Spring MVC — ваш первый выбор.

В микросервисной архитектуре Spring MVC и WebFlux могут быть смешаны, как уже упоминалось, для тех служб с интенсивным вводом-выводом (таких как шлюзы), для достижения которых мы можем использовать WebFlux.

WebFlux или Spring MVC — это не проблема!

Мы не можем притворяться ради силы, технологии ради технологии, но также учитывать крутую кривую обучения при переходе на неблокирующее реактивное программирование, стоимость обучения членов команды и многие другие факторы.

Словом, в нужной сцене выбирайте наиболее подходящую технологию.

Пять сходств и различий

WebFlux 适用性
Применимость WebFlux

На приведенном выше рисунке вы можете с первого взгляда увидеть сходства и различия между Spring MVC и Spring WebFlux:

Тот же пункт:

  • Вы можете использовать аннотации Spring MVC, такие как@Controller, что нам удобно для свободного конвертирования между двумя веб-фреймворками;
  • Может использовать контейнер Tomcat, Jetty, Undertow Servlet (Servlet 3.1+);
  • ...

будь осторожен:

  • Поскольку Spring MVC является типом синхронной блокировки, разработчикам удобнее писать функциональный код, отлаживать тесты и т. д. Вообще говоря, если Spring MVC соответствует сценариям, старайтесь не использовать WebFlux;
  • WebFlux по умолчанию использует Netty в качестве сервера;
  • WebFlux не поддерживает MySql;

6. Краткий обзор того, как WebFlux распределяет запросы

Друзья, которые использовали Spring MVC, должны знать, что передний контроллер Spring MVCDispatcherServlet, в то время как WebFluxDispatcherHandler, он достигаетWebHandlerинтерфейс:

WebFlux WebHandler接口
Интерфейс WebFlux WebHandler

приди и посмотриDispatcherHandlerкласс, который обрабатывает запросhandleметод:

WebFlux handle 源码分析
Анализ исходного кода WebFlux

  • ①:ServerWebExchangeИнформация об ответе на каждый HTTP-запрос, включая параметры и т. д., помещается в объект;
  • ②:Определить полное сопоставление интерфейсаmappingsЕсли коллекция пуста, она создает ошибку Not Found;
  • ③:В соответствии с конкретным адресом запроса для получения соответствующегоhandlerMapping;
  • ④:Вызов определенного бизнес-метода, который является методом интерфейса, который мы определили;
  • ⑤:обработать возвращенный результат;

7. Быстрый старт

7.1 Добавление зависимостей webflux

Создайте новый проект Spring Boot. Чтобы узнать о новых шагах, обратитесь к другому сообщению в блоге автора.«Учебник по началу работы с Spring Boot | Графическое объяснение»,существуетpom.xmlфайл добавленwebfluxполагаться:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

7.2 Определение интерфейса

создать новыйcontrollerПакет, используемый для размещения классов внешнего интерфейса, а затем создания другогоHelloWebFluxController.classкласс, определяющий два интерфейса:

package site.exception.springbootwebfluxhello.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import site.exception.springbootwebfluxhello.entity.User;

/**
 * @author 犬小哈 (微信号: 小哈学Java)
 * @site 个人网站: www.exception.site
 * @date 2019/4/15
 * @time 下午9:12
 * @discription
 **/
@RestController
public class HelloWebFluxController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, WebFlux !";
    }

    @GetMapping("/user")
    public Mono<User> getUser() {
        User user = new User();
        user.setName("犬小哈");
        user.setDesc("欢迎关注我的公众号: 小哈学Java");
        return Mono.just(user);
    }


}

User.java:

package site.exception.springbootwebfluxhello.entity;

/**
 * @author 犬小哈 (微信号: 小哈学Java)
 * @site 个人网站: www.exception.site
 * @date 2019/4/15
 * @time 下午9:12
 * @discription
 **/
public class User {

    /**
     * 姓名
     */
    private String name;
    /**
     * 描述
     */
    private String desc;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

В приведенных выше классах контроллеров мы используем все аннотации Spring MVC, которые определяют два интерфейса:

  • GET-запрос/helloинтерфейс, возвратHello, WebFlux !нить.
  • Определен другой запрос GET/userметод, который возвращает формат JSONUserобъект.

Обратите внимание,Userобъект проходит черезMonoОбъект упакован, спросите вы, почему бы не вернуть его напрямую?

В Вебфлукс,MonoЭто неблокирующий способ письма, только так вы сможете играть в WebFlux.неблокирующий + асинхронныйхарактеристики.

Добавлено: в WebFlux, кромеMonoКроме того, есть ещеFlux, оба они могут выступать в роли издателей в реактивном программировании, разница в следующем:

  • Mono: возвращает 0 или 1 элемент, т. е. один объект.
  • Flux: возвращает N элементов, объект списка.

7.3 Тестовый интерфейс

Запустите проект и посмотрите вывод консоли:

启动 WebFlux 项目
Запустите проект WebFlux.

Когда вывод консоли содержитNetty started on port(s): 8080заявление, указывающее, что служба Netty запущена по умолчанию.

Сначала откройте браузер/userИнтерфейс инициирует вызов:

请求 /hello 接口
запрос/привет интерфейс

Вернуть успех.

снова правильно/userПротестируйте интерфейс:

请求 /user 接口
запрос/пользовательский интерфейс

Возврат объекта User в формате JSON также допустим!

8. Резюме

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

Наконец, для начала я написал два простых интерфейса, и тест прошел успешно.

В следующей главе мы узнаем, как добавлять, удалять, изменять и запрашивать базу данных в WebFlux, так что следите за обновлениями!

9. Пример кода GitHub

GitHub.com/для моей любви/…

10. Ссылка

Бесплатная раздача | Интервью и ресурсы для обучения

Недавно я нашел в Интернете хороший ресурс в формате PDF «Java Core Interview Knowledge.pdf», чтобы поделиться с вами не только интервью, но и изучением, вы все стоит того! ! !

Как получить: Подпишитесь на официальный аккаунт:Сяоха изучает Java, закулисный ответресурс, вы можете получить ссылку на ресурс, это каталог и несколько скриншотов:

福利资源截图
Скриншот ресурсов социального обеспечения

福利资源截图
Скриншот ресурсов социального обеспечения

福利资源截图
Скриншот ресурсов социального обеспечения

福利资源截图
Скриншот ресурсов социального обеспечения

福利资源截图
Скриншот ресурсов социального обеспечения

福利资源截图
Скриншот ресурсов социального обеспечения

福利资源截图
Скриншот ресурсов социального обеспечения

Важные вещи говорятся дважды, как это получить: Подпишитесь на официальный аккаунт:Сяоха изучает Java, закулисный ответресурс, как за ссылки на ресурсы! ! !

Добро пожаловать в публичный аккаунт WeChat: Сяоха изучает Java

小哈学Java
Сяоха изучает Java