Статья впервые опубликована из личного паблика: Сяоха изучает 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 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 или Spring MVC?
Прежде всего, вам нужно четко указать, что:WebFlux не является заменой Spring MVC.! , хотя WebFlux также может быть запущен в контейнере сервлетов (это должен быть контейнер сервлетов 3.1+), но WebFlux в основном используется в модели асинхронного неблокирующего программирования, тогда как Spring MVC является синхронной блокировкой, если вы в настоящее время находитесь в Фреймворк Spring MVC Если вы используете много асинхронных решений, то WebFlux — это то, что вам нужно, в противном случае использование Spring MVC — ваш первый выбор.
В микросервисной архитектуре Spring MVC и WebFlux могут быть смешаны, как уже упоминалось, для тех служб с интенсивным вводом-выводом (таких как шлюзы), для достижения которых мы можем использовать WebFlux.
WebFlux или Spring MVC — это не проблема!
Мы не можем притворяться ради силы, технологии ради технологии, но также учитывать крутую кривую обучения при переходе на неблокирующее реактивное программирование, стоимость обучения членов команды и многие другие факторы.
Словом, в нужной сцене выбирайте наиболее подходящую технологию.
Пять сходств и различий
На приведенном выше рисунке вы можете с первого взгляда увидеть сходства и различия между 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
интерфейс:
приди и посмотриDispatcherHandler
класс, который обрабатывает запросhandle
метод:
-
①:
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 Тестовый интерфейс
Запустите проект и посмотрите вывод консоли:
Когда вывод консоли содержитNetty started on port(s): 8080
заявление, указывающее, что служба Netty запущена по умолчанию.
Сначала откройте браузер/user
Интерфейс инициирует вызов:
Вернуть успех.
снова правильно/user
Протестируйте интерфейс:
Возврат объекта User в формате JSON также допустим!
8. Резюме
В этой статье мы узнали, что такое Spring WebFlux, преимущества и сценарии применения WebFlux, а затем я рассказал о том, что выбрать WebFlux или Spring MVC в нашей производственной среде, и каковы сходства и различия между ними, и понять, как WebFlux распределяет запросы с точки зрения исходного кода.
Наконец, для начала я написал два простых интерфейса, и тест прошел успешно.
В следующей главе мы узнаем, как добавлять, удалять, изменять и запрашивать базу данных в WebFlux, так что следите за обновлениями!
9. Пример кода GitHub
10. Ссылка
- spring.io/
- docs.spring.IO/весна/документы…
- Woohoo. IBM.com/developer Я…
- день открытых дверей cao cao/gossip/sp…
Бесплатная раздача | Интервью и ресурсы для обучения
Недавно я нашел в Интернете хороший ресурс в формате PDF «Java Core Interview Knowledge.pdf», чтобы поделиться с вами не только интервью, но и изучением, вы все стоит того! ! !
Как получить: Подпишитесь на официальный аккаунт:Сяоха изучает Java, закулисный ответресурс, вы можете получить ссылку на ресурс, это каталог и несколько скриншотов:
Важные вещи говорятся дважды, как это получить: Подпишитесь на официальный аккаунт:Сяоха изучает Java, закулисный ответресурс, как за ссылки на ресурсы! ! !