Это четвертая статья в серии 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)