【Серия NIO】—— Нетти

задняя часть Архитектура сервер Netty

Это четвертая статья в серии NIO, пожалуйста, продолжайте обращать внимание:

  1. 【Серия NIO】—— Секрет TCP
  2. 【Серия NIO】—Модель IO
  3. 【Серия NIO】—Модель реактора

Если вы читали предыдущие три статьи, мы разобрали основные принципы и использование NIO с самого нижнего уровня, что помогло нам понять, что такое NIO, какие проблемы он решает и какие у него недостатки.

В принципе, появление NIO улучшило и ускорило метод обработки сетевого ввода-вывода, но это может помочь нам решить проблему чтения и записи только на уровне ввода-вывода.На уровне программного обеспечения нам нужна лучшая модель архитектуры программирования для решения проблема масштабируемости и высокого параллелизма. Netty используется для решения этих проблем.В этой статье мы подробно познакомим вас с точками знаний Netty.


1. Что такое нетти

1. Что такое

Берем официальные слова:

Netty — это высокопроизводительная асинхронная среда сетевых приложений, управляемая событиями. На основе Netty можно быстро разрабатывать и развертывать высокопроизводительные, высокодоступные сетевые серверные и клиентские приложения.

Проще говоря, это фреймворк для веб-приложений, который помогает решить три проблемы в веб-разработке:

  • Чтение и запись сетевых операций ввода-вывода, таких как TCP-соединение Socket.

  • Кодирование и декодирование протоколов прикладного уровня, таких как протокол HTTP

  • Архитектура с высокой степенью параллелизма

Так в чем же его преимущества?

  • Быстро — мощная производительность, высокий уровень параллелизма, низкая задержка

  • Простота — высокая расширяемость, простой в использовании API, низкий порог разработки.

  • Non-blocking — неблокирующий, поддерживает NIO


2. В чем разница

Для тех из нас, кто привык к веб-контейнерам, первый вопрос: что умеет netty и почему его следует использовать. Поскольку Netty — это инфраструктура сетевых приложений, очевидно, что tomcat также может помочь нам решить эту проблему, зачем использовать Netty?

Разница между netty и tomcat в основном заключается в следующих моментах:

  • Tomcat — это «HTTP-сервер», точнее контейнер приложения «Servlet/JSP», который в основном решает передачу и доступ на уровне протокола HTTP.

  • HTTP — это протокол прикладного уровня.Помимо HTTP, протоколы прикладного уровня включают POP и IMAP для почтового протокола, а также другие протоколы, такие как FTP, LDAP, SSH и TLS/SSL.

  • Netty может не только поддерживать HTTP, но и поддерживать большинство протоколов на прикладном уровне, таких как FTP, LDAP, SSH, TLS/SSL и т. д. Кроме того, он также поддерживает пользовательские протоколы прикладного уровня. является достаточно гибким.

  • Хотя Netty классифицируется как седьмой уровень [прикладной уровень] OSI, его существование должно помочь вам поддерживать третий уровень [транспортный уровень], такой как разработка сетевых протоколов, ориентированных на TCP, UDP и SCTP. поддерживается. Так что его можно назвать коммуникативным компонентом.

  • В принципе, сетевые коммуникационные компоненты Tomcat также могут использовать Netty, но до сервлета 3.0 это была полностью синхронная модель блокировки Tomcat должен следовать спецификации сервлета, поэтому он не может максимизировать характеристики NIO, в то время как Netty не нужно следовать спецификации сервлета. , что позволяет максимально использовать возможности NIO., более высокая производительность.


2. Зачем использовать Нетти

Три основные функции Netty (быстро, просто, без блокировки) можно подробно разложить на следующие функции:

  • Поддержка NIO, асинхронного программирования

  • Высокая производительность, высокий уровень параллелизма, низкая задержка, меньшее использование ресурсов и памяти обеспечивают более быструю поддержку производительности, лучшую в области NIO.

  • Зрелый и стабильный, все проблемы TCP, о которых вы только могли подумать, были решены, особенно ошибки NIO, и решены отлично.

  • Поддерживает не только http, но также поддерживает различные протоколы приложений и сетевые протоколы, такие как TCP/UDP/UDT/SCTP/FTP/SMTP и т. д.

  • Мощные функции, готовые процессоры различных кодеков, поддержка различных протоколов основных приложений.

  • API прост в использовании, а порог освоения низкий.


1.Fast

Почему это быстро, вы можете обратиться к предыдущей статье (【Серия NIO】—Модель реактора) представил модель Reactor IO.


Netty реализует эту модель Reactor на основе NIO.Поток Boss используется для установления соединений, а SubReactor используется для чтения и записи ввода-вывода и обработки задач. Эта многопоточная модель поддерживает большое количество одновременных подключений при полном использовании производительности ЦП.


Каков конкретный эффект, давайте посмотрим на тестовые данные:

Вышеупомянутое находится вtechempowerИз теста webFrame на простой текстовый ответ мы видим, что netty занимает второе место по скорости отклика.Несмотря на то, что в последние годы высокопроизводительная веб-инфраструктура постоянно подвергалась сомнению, рейтинг netty упал, но он все еще может сохранять первое место. .


Вышеизложенное относится к официальному тестовому случаю dubbo, учитывая сравнение сериализации протокола TPS, мы видим, что dubbo, использующий netty, является одним из лучших с точки зрения tps.


2. Меньше использования памяти

Поскольку Netty приходится иметь дело с большим количеством сетевых пакетов, будет создаваться и уничтожаться большое количество сетевых объектов, что оказывает сильное давление на JVM.

Netty в основном использует два решения для снижения нагрузки на JVM:

  • Пул объектов ByteBufAllocator. Пул экземпляров ByteBuf для повышения производительности и минимизации фрагментации памяти, последний возвращает новый экземпляр при каждом вызове.

  • Нулевая копия. Поддерживает использование DirectBuffer для выделения памяти посредством собственного вызова JVM, что позволяет избежать копирования содержимого буфера в (или из) промежуточного буфера до (или после) каждого вызова собственной операции ввода-вывода.

Ниже приведен стресс-тест приложения twitter, соответствующий Netty4 с использованием пула объектов:


3.Легкое, быстрое развитие

Мы знаем, что программирование, связанное с сетью, будет более сложным.В дополнение к набору параметров TPC, которые необходимо установить, есть также множество проблем с чтением и записью ввода-вывода.В то же время, чтобы улучшить также используется возможность параллелизма, многопоточность, что приводит к проблемам безопасности потоков, которые часто создают большие проблемы и сложности для разработчиков.

Netty сделала упрощенный пакет для этих трудностей, в дополнение к упрощению использования API, например: запуск конфигурации TCP-сервера, чтение и запись пакета данных buffByte и т. д. Кроме того, на основе событийного режима сетевые события обрабатываются последовательно, что не только обеспечивает высокую эффективность, но и снижает сложность программирования.

Почему сериализация улучшит производительность netty:

  • Последовательный дизайн без блокировки, последовательные операции выполняются в потоке ввода-вывода, чтобы избежать снижения производительности, вызванного многопоточной конкуренцией.

  • Настраивая параметры потоков пула потоков NIO, можно запускать несколько сериализованных потоков для параллельного выполнения.Эта конструкция последовательных потоков с частичной блокировкой обеспечивает лучшую производительность, чем модель с несколькими рабочими потоками в очереди.

  • Уменьшите переключение контекста синхронизации и данные состояния


Ниже приведена цепочка ответственности, которую ChannelPipeline использует для обработки сетевых событий, отвечая за управление и выполнение обработчиков ChannelHandler. Сетевые события проходят через ChannelPipeline как поток событий. Он поддерживает режим подключаемого модуля и имеет широкие возможности расширения.


4. Надежный и стабильный

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

Netty продолжает добавлять некоторые функции надежности в итерациях версий, чтобы удовлетворить растущие потребности пользователей в надежности и надежности. Например, ошибка выбора холостого хода NIO, такая как отключение и повторное подключение TCP, обнаружение поддержания активности и другие проблемы, Netty решила их за вас.

В частности, после того, как Netty 4.0 была запущена, она была принята различными крупными производителями в качестве коммуникационного компонента, что является проверкой ее надежности и признанием сообществом ее стабильности. Ниже приведены некоторые компании, использующие netty.


3. Как использовать

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

В качестве примера возьмем простой TCPServer.


необходимость:

Клиент: получает содержимое, введенное пользователем, отправляет его на сервер, а также получает и отображает содержимое, возвращенное сервером.

Сервер: прослушивает порт 8088, получает и отображает содержимое, отправленное Клиентом, и отправляет соответствующий ответ Клиенту.


Код:

      // step 1 设置boss 和 work
      EventLoopGroup bossGroup = new NioEventLoopGroup();
      EventLoopGroup workerGroup = new NioEventLoopGroup();
      try {
          // step 2 服务启动辅助类
          ServerBootstrap b = new ServerBootstrap(); 
          // 设置线程池
          b.group(bossGroup, workerGroup)
              // step3 设置channel
              .channel(NioServerSocketChannel.class) 
              // setp4 设置channel hanlder
              .childHandler(new ChildChannelHandler())
              //设置发送和接受缓冲区大小
              .option(ChannelOption.SO_SNDBUF,256)
              .option(ChannelOption.SO_RCVBUF,256)
              // 小封包自动连接
              .option(ChannelOption.TCP_NODELAY,true)
              .childOption(ChannelOption.SO_KEEPALIVE, true)
              .handler(new LoggingHandler(LogLevel.INFO));
          // step 7 Bind 监听端口.
          ChannelFuture f = b.bind(PORT).sync(); 
          logger.info("tcp server start success... ");
          f.channel().closeFuture().sync();
      } finally {
      }

ChildChannelHander расширяет стратегию выполнения Pipeline:

protected void initChannel(SocketChannel channel) throws Exception {
      ChannelPipeline pipeline = channel.pipeline();
      pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));
      pipeline.addLast("frameEncoder", new LengthFieldPrepender(4));
      pipeline.addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));
      pipeline.addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));
      pipeline.addLast(new TcpHelloServerHandler());
​
  }


Через приведенный выше код нам, наверное, нужно пройти 7 шагов для создания сервера TCP Server.Кажется, что шагов больше 7. На самом деле по количеству кода это уже очень мало.

На приведенной выше блок-схеме выполнения мы видим:

  • ServerBootstrap — это вспомогательный класс запуска службы (начальной загрузки), который использует конструктор без параметров (режим Builder) для предоставления системного метода для установки параметров, связанных с запуском.

  • EventLoopGroup: пул потоков Netty Reactor, отвечающий за поддержание набора расписаний EventLoop, обычно bossEventLoop используется для поддержки соединений, а subEventLoop используется для поддержки операций ввода-вывода всех зарегистрированных каналов для обработки определенных пользователем задач и запланированных задач.

  • Канал: инкапсулирует родную библиотеку классов NIO для Java.Обычным пользователям не нужно заботиться о базовых деталях реализации и принципах работы.Они должны только указать, какой канал использовать для подключения устройств ввода-вывода (сокетов), обеспечения и поддержки устройств ввода-вывода. для асинхронных операций ввода-вывода (таких как чтение, запись, подключение и привязка)

  • ChildChannelHandler, используемый для настройки стратегии выполнения ChannelPipeline. Ключевой интерфейс, используемый для расширения, позволяет пользователям выполнять большую часть настройки функций, таких как кодирование и декодирование сообщений, сердцебиение, аутентификация безопасности, аутентификация TSL/SSL, управление потоком и т. д.


Четвертый, последний

Выше мы объяснили преимущества и основное введение Netty в трех аспектах: что такое Netty, как ее использовать и почему она используется.Я должен иметь общее представление о Netty. В дальнейшем мы проведем дополнительный анализ высокопроизводительной архитектуры Netty и эффективного многопоточного программирования в сочетании с исходным кодом. Мы не только фокусируемся на том, как реализован исходный код, но и объединяем всю архитектуру для анализа концепции дизайна и изучения того, как пишется надежный код. Если вы заинтересованы, пожалуйста, продолжайте обращать внимание.

Для получения дополнительных знаний об архитектуре, пожалуйста, обратите внимание на мой публичный аккаунт, большой код ожидания (cool_wier)