1. Что такое канал?
Канал очень легко понять по его буквальному значению, то есть «труба». Для подачи воды в тысячи домохозяйств нужны трубопроводы, для отопления тоже нужны трубопроводы, для связи по сети тоже нужны трубопроводы, этот трубопровод наш.Socket
. Мы выяснили, что в водопроводе циркулирует водопроводная вода, а в трубе отопления циркулирует отопление, тоSocket
В обращении находится наш поток байтов.
Сказав так много, что такое Канал? Редактор понимает, что Канал должен подключаться к сетевому сокету и иметьread, write, connect, and bind
Канал компонентов возможностей.
Канал обычно имеет следующие свойства:
- 1. Состояние компонента самого Канала, например, открыт ли он
open
статус, он подключенconnected
условие - 2. За самим каналом будет следовать
ChannelConfig
объект, связанный сChannel
настроить, например接收缓冲区的大小
- 3. За самим каналом будет следовать
ChannelPipeline
Ассоциация объектов, используемая для обработки событий ввода-вывода.events
в НеттиChannel
Дополнительные операции инкапсулированы на основе Java NIO. В Netty все операции ввода/вывода являются асинхронными. Это означает, что мы не можем получить результат операции ввода-вывода сразу после вызова операции ввода-вывода, поэтому Netty предоставляетChannelFuture
, который возвращается после каждого вызова асинхронного ввода-вывода.
В Netty Channel имеет структуру наследования, мы можем вызвать Channel'sparent()
способ получения,parent()
Возврат метода зависит от того, как был создан канал. напримерSocketChannel
поServerSocketChannel
получить, поэтому при вызовеSocketChannel
изparent()
метод вернетServerSocketChannel
Каждый раз при обработке операции Channel мы должны явно вызывать ееclose()
а такжеclose(ChannelPromise)
Освобождение ресурсов, это гарантирует, что все ресурсы будут освобождены правильно~
2. Какие есть типы каналов в Netty? Каков эффект каждого?
В общем, разные протоколы и разные способы использования соответствуют разным типамChannel
. размещен нижеChannel
Диаграмма наследования интерфейса:
- 1,
UnixChannel
: этот тип канала предоставляет доступ только к некоторым операциям, доступным только в Unix-подобных операционных системах. - 2,
DatagramChannel
: обработкаUDP/IP
Канал протокола - 3.
DuplexChannel
: Полнодуплексный канал с двумя конечными точками, которые могут быть закрыты независимо в каждой конечной точке. - 4.
Http2StreamChannel
:служба поддержкиHTTP/2
Канал протокола - 5.
SctpChannel
: обработкаSCTP/IP
Канал протокола - 6.
ServerChannel
: компонент канала, который получает новые соединения, а затем создает дочерние каналы,ServerSocketChannel
хороший пример,ServerSocketChannel
принять соединение, затем создатьSocketChannel
3. Связь между Channel и EventLoopGroup и EventLoop в Netty
ОдинEventLoop
Это простой поток, используемый для обработки всех зарегистрированных в нем событий ввода-вывода, то есть канал должен быть зарегистрирован в EventLoop, аEventLoop
Обычно их несколькоChannel
зарегистрирован, покаEventLoopGroup
являетсяEventLoop
коллекция.
В-четвертых, в НеттиEventLoop
Ожидание диаграммы наследования компонентов потока событий
Xiaobian опубликовал простую диаграмму наследования, как показано ниже:
На самом деле, из рисунка видно, что модель многопоточности в Netty — это, по сути,EventExecutorGroup
,EventExecutorGroup
Унаследовано от JDKScheduledExecutorService
интерфейс, поэтому в Netty мы можем использовать его для выполнения некоторых настроек, таких как задачи синхронизации.
- 1,
EventExecutorGroup
: отвечает за передачуnext()
способ создания серииEventExecutor
, кроме того, также отвечает за управление его созданиемEventExecutor
Жизненный цикл и предоставить метод глобального отключения. - 2,
EventLoopGroup
это особыйEventExecutorGroup
, в основном используется для регистрацииChannel
для последующего использования в цикле событий - 3.
EventExecutor
это особыйEventExecutorGroup
, который предоставляет несколько удобных методов для определения того, находится ли поток вEnentLoop
выполнить в - 4.
MultithreadEventExecutorGroup
Как следует из названия, он позволяет выполнять задачи в несколько потоков.
Пять, в НеттиBootstrap
семья
На самом деле в НеттиBootstrap
Семейство классов запуска не очень большое, оно эквивалентно классу инструментов!Bootstrap
а такжеServerBootstrap
относительно второй главы вышеServerChannel
Всего категорий три, диаграмма классов выглядит следующим образом:
- 1,
Bootstrap
: используется для открытия канала для клиентаChannel
,как правилоbind()
метод используется для создания ссылки без сохранения состояния на основе UDP, для обычной ссылки TCP мы используем егоconnect()
создание метода - 2,
ServerBootStrap
: используется для открытияServerChannel
Шесть, в НеттиChannelHandler
ChannelHandler
Может использоваться для обработки событий ввода-вывода или для получения операций ввода-вывода и указывает указатель наChannelPipeline
следующий вHandler
. вChannelPipeline
заChannelHandler
Предоставляется контейнер.
ChannelInboundHandler
используется для состояния (open close connect
) изменяется, чтобы установить соответствующее действие обратного вызова, короче говоря,ChannelInboundHandler
перехватывать и обрабатывать входящие события,ChannelOutboundHandler
Перехват и обработка исходящих событий.