предисловие
Эта серия статей посвящена моей методологии программирования на Java. Серия Responsive InterpretationWebflux
Часть, теперь совместно используемая, предварительная информация Rxjava2, соответствующая интерпретация Reactor была записана и передана видео, и опубликована на станции b, адрес выглядит следующим образом:
Интерпретация исходного кода Rxjava и совместное использование:вооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо
Интерпретация и совместное использование исходного кода Reactor:вооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо
Обмен видео, связанный с интерпретацией исходного кода NIO:вооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо
Статьи, связанные с видеоинтерпретацией исходного кода NIO:
Некоторые сведения об исходном коде BIO to NIO BIO
Некоторые сведения об исходном коде BIO to NIO на NIO
Некоторые сведения об исходном коде BIO to NIO в NIO
Некоторые вещи из BIO в исходный код NIO: Селектор под NIO Некоторые вещи из исходного кода BIO в NIO в разделе NIO Buffer Interpretation on Некоторые вещи из исходного кода BIO в NIO в разделе NIO Buffer Interpretation Next
Среди них Rxjava и Reactor не будут открыты для публики как содержание моей книги.Если вам интересно, вы можете уделить немного времени просмотру видео.Я сделал всестороннюю и подробную интерпретацию двух библиотек, включая концепции дизайна и связанная с ними методология.Я также надеюсь, что вы можете оставить сообщение, чтобы исправить мои ошибки.
Зачем вам нужен Spring WebFlux
Поскольку мы сталкиваемся со все более высокой параллельной обработкой, традиционныеSpring Web MVC
Он не смог удовлетворить наши потребности, то есть нам нужен неблокирующий и через небольшое количество аппаратных ресурсов (вариант через небольшое количество потоков)web
Фреймворк для обработки параллельных задач.Servlet 3.1
Он предоставляет соответствующий API для неблокирующего ввода-вывода. Однако при его использовании остальная часть API сервлета синхронна во время выполнения (например,Filter
) или блокировка (getParameter
,getPart
).
мы знаем,Tomcat
Такие серверы имеютServlet Worker
пул потоков при использованииSpring Web MVC
, обработка запроса будет вDispatcherServlet
процесс, и его внутреннее значение по умолчанию не выполняет асинхронную обработку, поэтому, когдаI/O
Или, когда операция занимает много времени, она может заблокировать текущийServlet
на нитке. (См. в Интернете оSpringMVC
Связанные сообщения в блоге об асинхронных операциях), о его асинхронном преобразовании, я такжеRxJava2
Соответствующее совместное видео примера проекта было преобразовано, и вы можете просмотреть его. Наша цель - принести актуальноеServlet
Поток, в котором он находится, прекращается, чтобы можно было получить больше запросов.
В чем разница между ними?Spring WebFlux
Какой смысл для нас передавать обучение. Я считаю, что все были в контакте сTomcat
После этого я научусьTomcat
файл конфигурацииserver.xml
, откуда мы также знаемConnector
, его основными функциями являются: получение запросов на подключение, созданиеRequest
иResponse
Объект используется для обмена данными с запросчиком; затем назначается поток, чтобы разрешитьServlet
контейнер для обработки этого запроса и размещения полученногоRequest
иResponse
объект переданServlet
. когдаServlet
После обработки запроса он также пройдетConnector
Верните ответ клиенту.
Итак, мы начинаем сConnector
для начала обсудите некоторыеConnector
сопутствующие вопросы, в том числеNIO/BIO
Режим, пул потоков, количество подключений и т. д.
В зависимости от соглашения,Connector
Его можно разделитьHTTP
Connector
,AJP Connector
подождите, здесь только обсуждаетсяHTTP Connector
.
Протокол в соединителе под Tomcat
Connector
При обработке HTTP-запросов различныеprotocol
. разныеTomcat版本
поддерживаетсяprotocol
разные, где типичныеprotocol
включаютBIO、NIO和APR
(Tomcat7
поддержите это3
своего рода,Tomcat8
добавленNIO2
поддержку, находясь вTomcat8.5
иTomcat9.0
, затем удалите правуюBIO
служба поддержки).
Connector
что использоватьprotocol
, в состоянии пройтиTomcat
конфигурационный файлserver.xml
середина<connector>
в элементеprotocol
можно указать свойства или использовать значения по умолчанию. Если не указаноprotocol
, используется значение по умолчаниюHTTP/1.1
, его смысл следующий:Tomcat7
, он автоматически выбирается для использованияBIO
илиAPR
(если найденоAPR
необходимая нативная библиотека, используйтеAPR
, иначе используйтеBIO
);существуетTomcat8
, он автоматически выбирается для использованияNIO
илиAPR
(если найденоAPR
необходимая нативная библиотека, используйтеAPR
, иначе используйтеNIO
).
Будь тоBIO
,все ещеNIO
,Connector
Общий алгоритм обработки запроса такой же:Получить соединение в очередь принятия (когда клиент отправляет запрос на сервер, если клиент и сервер завершают трехэтапное рукопожатие для установления соединения, сервер помещает соединение в очередь принятия); получить запрошенные данные в соединении сгенерировать запрос; вызвать контейнер сервлетов для обработки запроса; вернуть ответ.
Чтобы облегчить ваше понимание, вот связь между соединением и запросом:
- соединение
TCP
слой (транспортный слой), соответствующийsocket
. - запрос
HTTP
уровень (прикладной уровень), должен зависеть отTCP
реализация соединения. - Один
TCP
В соединении может быть несколько передачHTTP
просить.
BIO — это Blocking IO, как видно из названия, блокирующий IO; NIO — это Non-blocking IO, то есть неблокирующий IO. APR — это Apache Portable Runtime, переносимая библиотека времени выполнения Apache, которая может обеспечить высокую масштабируемость и высокую производительность за счет использования локальных библиотек; Apr — это предпочтительный режим для запуска приложений с высокой степенью параллелизма на Tomcat, но apr, apr-utils, tomcat должны быть установлены -native и другие пакеты.
существуетBIO
осуществленныйConnector
, запрос в основном делаетсяJioEndpoint
объект для обработки.JioEndpoint
поддерживаетсяAcceptor
иWorker
,пройти черезAcceptor
перениматьsocket
, то изWorker线程池
Найти обработку холостого потока вsocket
,еслиworker线程池
нет незанятых потоков, тоAcceptor
заблокирует. вWorker
даTomcat
Автономный пул потоков, если он передан<Executor>
Другие пулы потоков настраиваются, принцип тот же, что иWorker
похожий.
существуетNIO
осуществленныйConnector
, основным объектом, обрабатывающим запрос, являетсяNIOEndpoint
объект.NIOEndpoint
Помимо включенияAcceptor
иWorker
Кроме того, до сих пор используетсяPoller
, поток обработки показан на следующем рисунке:
на фотоAcceptor
иWorker
Они существуют в виде пулов потоков соответственно.Poller
Является одним потоком (вот его самое большое отличие от Netty). Обратите внимание, что сBIO
реализации того же, здесь необходимо упомянуть, что вserver.xml
не настроен в<Executor>
, затем сWorker线程池
запустить, если настроено<Executor>
, то исходя изjava.util.concurrent.ThreadPoolExecutor
Пул потоков работает.
На рисунке показано,Acceptor
перениматьsocket
После (здесь, правда, исходя изNIO
изconnector
, Но получаяsocket
все еще традиционныйserverSocket.accept()
способ получитьSocketChannel
объект, затем инкапсулированный вtomcat
изorg.apache.tomcat.util.net.NIOChannel
Реализуйте объект класса и оберните его какPollerEvent对象
), не напрямуюWorker
Нить в процессе запроса, но сначалаPollerEvent对象
отправлено вPoller
,иPoller
реализуетсяNIO
ключ.Acceptor
В направленииPoller
Отправить包装后的请求
Реализовано путем добавления операции очереди, используется типичный узор потребительского производителя. В то же время вPoller
, поддерживаетSelector
объект; когдаPoller
удалить из очередиsocket
после регистрации вSelector
в; затем, пройдяSelector
, выяснить, какие читаемыеsocket
и использоватьWorker
Потоки обрабатывают соответствующий запрос. иBIO
похожий,Worker
Его также можно заменить настраиваемым пулом потоков.
Из вышеописанного процесса видно, чтоNIOEndpoint
Во время обработки запроса либоAcceptor
перениматьsocket
или поток запроса (добавлено вPoller
Очередь синхронная), по-прежнему используется режим блокировки, но в读取socket并交给Worker中的线程
этого процесса, используйте неблокирующийNIO
осознать, что этоNIO
узор сBIO
Основное различие между режимами (другие отличия меньше влияют на производительность). И из-за этой разницы он может значительно повысить эффективность Tomcat в случае большого количества параллелизма.
Большая часть текущегоHTTP
Запрос использует постоянное соединение (HTTP/1.1
дефолтkeep-alive
заtrue
), а длинное соединение означает, чтоTCP
изsocket
После завершения текущего запроса, если не приходит новый запрос,socket
Сразу не выпустит, а подождетtimeout
снова отпустить. При использованииBIO
,读取socket并交给Worker中的线程
Этот процесс является блокирующим, что означает, что вsocket
В ожидании следующего запроса или в ожидании релиза обработайте этоsocket
Рабочие потоки Tomcat всегда будут заняты и не могут быть освобождены, поэтому количество сокетов, которые Tomcat может обрабатывать одновременно, не может превышать максимальное количество потоков, а производительность сильно ограничена. При использовании NIO,读取socket并交给Worker中的线程
Этот процесс является неблокирующим (поPoller
Он поддерживается тем потоком, в котором находится, и не занимает рабочий поток, поэтому Tomcat может обрабатывать его одновременно.socket
Это число не ограничивается максимальным числом потоков, а одновременная производительность значительно повышается, ноPoller
Это также является узким местом его производительности.
Следовательно, сNIO
осуществленныйConnector
С появлением , связь между клиентом и сервером не блокируется, но сервер сservlet
Соединение по-прежнему блокируется, что означает, что каждый запрос блокирует поток, что приводит к модели, в которой мы видим, что один поток обрабатывает один запрос. Следовательно, сServlet
разработка контейнеров,Servlet API
Также требуется неблокирующая поддержка, т.е.Servlet 3.1+
.
оTomcat
ВнизConnector
Для более глубокой интерпретации, если вам интересно, вы можете обратиться к другому моему сообщению в блоге.Две или три вещи от tomcat, начиная с подключения к Servlet