Больше отличных статей.
«Микросервисы — это не все, а лишь подмножество определенного домена».
С таким количеством компонентов мониторинга всегда найдется подходящий для вас
«С Нетти, что мы разрабатываем? 》
«Вероятно, это наиболее подходящая спецификация Redis».
«Портрет программиста, десять лет взлетов и падений»
Самая полезная серия:
«Наиболее часто используемый набор навыков «vim» в производственной среде Linux.
«Наиболее часто используемый набор навыков «Sed» в производственной среде Linux.
«Наиболее часто используемый набор навыков «AWK» в производственной среде Linux.
В мире Java netty, несомненно, является специальностью для разработки сетевых приложений. Вам не нужно уделять слишком много внимания сложной модели nio и деталям базовой сети.Используя его богатые интерфейсы, вы можете легко реализовать сложные коммуникационные функции.
По сравнению с сетевым модулем golang, netty все еще слишком раздут. Но фреймворк классов Java именно такой, принадлежащий к типу языков программирования, которые не могут существовать без IDE.
В последней версии netty модули разделены на очень мелкие детали.Если вы не знаете, что содержит каждый модуль, используйте его напрямую.netty-all
Вот и все.
Чисто с точки зрения использования, netty очень прост, его можно разработать, освоив модели ByteBuf, Channel, Pipeline и Event. Вы обнаружите, что знания, связанные с сетью, в интервью нет необходимости говорить. Но Netty сильно отличается от других режимов разработки, главное его асинхронность. Следствием асинхронности является другая модель программирования, а также трудности с отладкой и более высокие требования к коду, потому что стоимость ошибок не такая же, как стоимость ошибок в бизнес-коде.
Но от проекта, хоть воробей маленький и полный, от бизнес уровня до сервисного шлюза, а также различные технические гарантии, в том числе мониторинг и настройка — это все факторы, которые необходимо учитывать. Сама Netty составляет очень небольшую долю.
В этой статье объясняется общий контент, связанный с использованием netty для разработки, а затем прикрепляется конфигурация Linux, поддерживающая соединения 100 Вт на одной машине. Эта статья не посвящена основам netty.Разработка протокола
Самое главное в развитии сети — это ее формат связи и протокол. Наши общие protobuf, json, avro, mqtt и т. д. принадлежат этому столбцу. Протокол состоит из трех элементов: синтаксиса, семантики и синхронизации.
Я видел много промежуточных программных приложений, использующих протокол Redis, в то время как серверная часть — это mysql, tidb и т. д.
Наш часто используемый Redis использует текстовый протокол, mysql и т. д. реализуют двоичный протокол. То же самое верно и для netty, просто реализуйте набор кодеков (унаследуйте серию Decoder или Encoder). Netty по умолчанию реализует протоколы dns, haproxy, http, http2, memcache, mqtt, redis, smtp, socks, stomp, xml и др. Можно сказать, что он очень полный, и очень круто использовать его напрямую.
Возможная структура продукта была бы примерно такой, обеспечивая единообразный вид внешнего мира, но другое основное хранилище:
Текстовый протокол относительно интуитивно понятен и прост в отладке, но безопасность не очень хороша, в то время как бинарный протокол должен полагаться на журналы, wireshark и другие методы анализа, что усложняет разработку. Здесь обрабатывается легендарная липкая распаковка. Причина залипания пакетов в основном связана с вмешательством буфера, поэтому необходимо согласовать сводку передачи и другую информацию обеих сторон.Netty в определенной степени решает эту проблему.У каждого студента, который хочет разработать сетевое приложение, есть семя мечты о перепроектировании протокола, зарытое в его сердце. Однако можно сказать, что дизайн протокола очень сложен, и для глубокого развития соответствующего бизнеса мы также должны учитывать его масштабируемость. Если нет особой необходимости, рекомендуется использовать существующий протокол.
Функция управления подключением
При разработке Netty очень важна функция управления соединениями. Качество связи, состояние системы и некоторые функции черной технологии зависят от функции управления соединением.
Будь то сервер или клиент, после того, как netty создаст соединение, он получитChannel
Объект. Все, что нам нужно сделать, это управлять им, я называл этоConnectionManager
.
Класс управления будет кэшировать некоторые объекты памяти для подсчета текущих данных. Например, функции, ориентированные на соединение: количество отправленных и полученных пакетов, скорость отправки и получения пакетов, количество ошибок, время повторного соединения, задержка вызова, состояние соединения и т. д. Это часто используется в javaconcurrent包
Связанные классы часто являются источником ошибок.
Но нам нужно больше, и класс управления даст каждому соединению больше функциональности. Например, после создания соединения, если вы хотите разогреть некоторые функции, эти состояния могут участвовать в принятии решений о маршрутизации. Обычно очень важной функцией является добавление пользователей или другой метаинформации к соединению, чтобы иметь возможность фильтровать некоторые соединения в соответствии с условиями в нескольких измерениях и выполнять пакетные операции, такие как оттенки серого, защита от перегрузки и т. д.
Фон управления может видеть информацию о каждом подключении.После фильтрации одного или нескольких подключений вы можете начать запись трафика, мониторинг информации и отладку точек останова для этих подключений, и вы можете испытать ощущение контроля над всем.
Функция управления также может видеть все рабочее состояние системы и своевременно корректировать стратегию балансировки нагрузки; в то же время она может предоставлять базу данных для расширения и сокращения.
Обнаружение сердцебиения
Необходим пульс уровня протокола приложения, что является совершенно иной концепцией, чем поддержка активности tcp.
Сердцебиение уровня протокола прикладного уровня определяет живучесть обеих сторон и качество соединения.keepalive
Проверяется живучесть самого соединения. Более того, время ожидания по умолчанию последнего слишком велико, что совершенно не подходит для современных сетевых сред.
GCM
Ждать. Механизм поддержания активности будет динамически переключаться в различных сценариях приложений, таких как активация программы и в фоновом режиме, стратегия обучения ротации отличается.
Встроенная Netty путем добавленияIdleStateHandler
производитьIDLE
События для удобного контроля сердцебиения. С чем вам придется иметь дело, так это с логикой тайм-аута сердцебиения, например, с отложенным повторным подключением. Однако время обучения вращению фиксировано и не может быть изменено динамически, а расширенные функции необходимо настраивать.
В некоторых клиентах, таких как Android, частое сердцебиение будет тратить много сети и энергии, и его стратегия сердцебиения будет более сложной.
граница
Изящный механизм выхода
Мягкое завершение работы Java обычно достигается путем регистрации JDK ShutdownHook.
Runtime.getRuntime().addShutdownHook();
обычно проходятkill -15
Выполните завершение процесса Java, чтобы выполнить некоторую очистку, прежде чем процесс умрет.
Примечание: kill -9 немедленно уничтожит процесс, не давая шанса последним словам, что более опасно.
В то время как netty делает много изящных выходов,EventLoopGroup
изshutdownGracefully
методы выполняют некоторую настройку состояния nio, но во многих случаях этого недостаточно. Он отвечает только за корректное завершение автономной среды.
Трафик также может продолжать поступать через внешнюю маршрутизацию, что приводит к недействительным запросам. Моя обычная практика заключается в том, чтобы сначала удалить локальный экземпляр на внешнем маршруте, обрезать трафик, а затем выполнить корректное завершение работы самой сети. Эта схема очень проста и хорошо работает даже без механизмов повторных попыток, при условии, что соответствующие интерфейсы должны быть открыты заранее на уровне маршрутизации.
функция обработки исключений
Netty чрезвычайно важен для обработки исключений из-за его асинхронного метода разработки и механизма событий. Чтобы обеспечить высокую надежность соединения, многие исключения необходимо молча игнорировать или не воспринимать в пользовательском режиме.
Исключение netty будет распространяться по конвейеру, поэтому его можно обрабатывать на любом уровне, но в соответствии с привычками программирования оно обычно выбрасывается на самый внешний уровень для централизованной обработки.
Чтобы в максимальной степени различать информацию об исключении, обычно определяется большое количество классов исключений, и разные ошибки будут вызывать разные исключения. После возникновения исключения вы можете выбрать отключение и повторное подключение в соответствии с различными типами (например, нарушение кодека некоторых двоичных протоколов) или запланировать другие узлы.
Функциональные ограничения
командный режим
Сетевые приложения должны делать сетевые приложения, любая связь стоит дорого. существует«Сетевая глава Linux« Оставшаяся жизнь на необитаемом острове »(5)»В , мы говорили о сервере с миллионами подключений, для трансляции 1kb сообщения требуется пропускная способность 1000M, так что не все можно разместить в сетевом приложении.
Разумной идеей для большого сетевого приложения является отправка значений, связанных с指令
. После того, как клиент получит инструкцию, он использует другие методы, такие как http, для получения больших файлов. Многие идеи дизайна IM подобны этому.
Командный режим также обеспечивает масштабируемость и стабильность системы связи. Команда добавления может быть настроена и вступает в силу немедленно, и серверу не нужно перезапускать код.
Гарантия стабильности
Трафик сетевых приложений, как правило, очень большой, что не подходит для включения полных логов. Приложение должно обращать внимание только на журнал основного события, обращать внимание на поток обработки в ненормальных условиях, и журнал должен быть распечатан соответствующим образом.
Сетевые приложения также не подходят для вызова других медленных API или любого интерфейса, который блокирует ввод-вывод. Для некоторых событий в реальном времени данные не должны выдаваться через вызывающий интерфейс, но можно использовать другие асинхронные каналы, такие как высокоскоростной mq.
Кэширование, вероятно, является наиболее часто используемым компонентом веб-приложений. Кэш в jvm может хранить какие-то статистические данные по одной машине, а redis и т.д. хранить некоторую глобальную статистику и данные промежуточного состояния.
В сетевых приложениях широко используются redis, kv и высокопроизводительный mq для быстрого реагирования на запросы пользователей. Короче говоря, старайтесь поддерживать коммуникационный уровень как можно более чистым, и вы избавите себя от многих забот.Одна машина поддерживает 1 миллион подключений Конфигурация Linux
Одна машина, поддерживающая 1 миллион подключений, возможна, но проблемы с пропускной способностью могут стать серьезным узким местом. Включение сжатых двоичных протоколов экономит часть полосы пропускания, но усложняет разработку.
и"Ресурсы процесса LWP исчерпаны, ресурс временно недоступен"Конфигурация ES, упомянутая в, такая же, и оптимизация имеет схожие идеи. Эта конфигурация может сэкономить вам несколько дней, пожалуйста, примите ее!
оптимизация ОС
Изменить максимальное количество дескрипторов файлов для процесса
ulimit -n 1048576
Изменить максимальное количество файлов, которые может выделить один процесс
echo 2097152 > /proc/sys/fs/nr_open
Измените файл /etc/security/limits.conf.
* soft nofile 1048576
* hard nofile 1048576
* soft nproc unlimited
root soft nproc unlimited
Не забудьте очистить конфигурацию /etc/security/limits.d/*
Оптимизация сети
Открытым/etc/sysctl.conf
, добавить конфигурацию
а затем выполнить, используяsysctl
вступить в силу
#单个进程可分配的最大文件数
fs.nr_open=2097152
#系统最大文件句柄数
fs.file-max = 1048576
#backlog 设置
net.core.somaxconn=32768
net.ipv4.tcp_max_syn_backlog=16384
net.core.netdev_max_backlog=16384
#可用知名端口范围配置
net.ipv4.ip_local_port_range='1000 65535'
#TCP Socket 读写 Buffer 设置
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.core.optmem_max=16777216
net.ipv4.tcp_rmem='1024 4096 16777216'
net.ipv4.tcp_wmem='1024 4096 16777216'
#TCP 连接追踪设置
net.nf_conntrack_max=1000000
net.netfilter.nf_conntrack_max=1000000
net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
#TIME-WAIT Socket 最大数量、回收与重用设置
net.ipv4.tcp_max_tw_buckets=1048576
# FIN-WAIT-2 Socket 超时设置
net.ipv4.tcp_fin_timeout = 15
Суммировать
Разработка netty ориентирована не на саму сеть, а на обеспечение высокой надежности и стабильности сервисов. При этом много работы сосредоточено на мониторинге и отладке, снижении стоимости исправления ошибок.
Углубленное понимание Netty - это уметь глубоко выкопать глубоко для устранения неполадок, когда система сталкивается с трудными проблемами или для улучшения требовательных результатов. Однако для большинства разработчиков приложений стоимость начала NETTY немала, и выкапывая нижний слой не будет генерировать большую прибыль.
Это всего лишь инструмент, что еще с ним можно сделать. 0.jpeg