Краткое описание базовых компонентов Netty — Channel, EventLoop, Bootstrap и т. д.

задняя часть контейнер Netty Bootstrap
Краткое описание базовых компонентов Netty — Channel, EventLoop, Bootstrap и т. д.

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Перехват и обработка исходящих событий.