Эта запись в блоге называется «Обучение от 0 до 1». Netty》От среднего до продвинутогосистема Четвертая запись в блоге из этой серии.,Основное содержание — этопроходить Исходный коди Пример комбинированного анализа,Исследовать Netty Общие константы конфигурации для управления поведением базовых сетевых операций.,Прошлые проблемысистема Для статей, пожалуйста, посетите Блогер Столбец Нетти,Все коды в сообщении блога собраны.существоватьРепозиторий Blogger на GitHubсередина;
В качестве инфраструктуры сетевой связи Netty предоставляет широкий спектр параметров конфигурации, чтобы мы могли контролировать поведение базовых сетевых операций в соответствии с потребностями приложения. Вот несколько примеров общих параметров конфигурации:
CONNECT_TIMEOUT_MILLIS
:соединятьтайм-аут。SO_BACKLOG
:соединять Запрошеноочередьразмер。TCP_NODELAY
:Запрещать Nagle алгоритм уменьшения задержки.SO_SNDBUF
и SO_RCVBUF
:Отправить буферибуфер приемаизразмер。ALLOCATOR
:распределитель памяти,Для выделения объекта ByteBuf.RCVBUF_ALLOCATOR
:распределитель буфера приема,для распространения SocketChannel Буфер для приема данных.В дополнение к приведенным выше примерам, Netty Дополнительные параметры предусмотрены для настройки сетевых операций на разных уровнях, например. SSL/TLS Поддержка, настройки прокси и т.д. Эти параметры можно передать Bootstrap
или ServerBootstrap
Объект option()
метод установки.
При использовании Netty очень важно понимать и правильно настраивать эти параметры, чтобы обеспечить производительность, стабильность и безопасность сетевых коммуникаций. В соответствии с потребностями конкретных приложений мы можем выбрать подходящие значения параметров на основе документации и практического опыта, а также оптимизировать эффективность сетевой связи посредством настройки.
существовать Netty середина,CONNECT_TIMEOUT_MILLIS
Параметр, используемый для установки времени ожидания соединения. Он определяет максимальное время, в течение которого клиент ожидает ответа от сервера при попытке установить соединение.
когда мы используем Netty При создании клиента подключаться,Отправит запрос на соединение на сервер,и дождитесь ответа сервера. Если сервер существует не отвечает в течение указанного таймаута,соединение будет считаться тайм-аутом и не удастся.
установив CONNECT_TIMEOUT_MILLIS
Параметры, которые могут контролировать таймаут соединения. Если лимит времени превышен и соединение не установлено, то Netty бросит ConnectTimeoutException
Исключения, чтобы мы могли соответствующим образом обрабатывать их в нашем коде.
Вот пример кода:
Создайте Bootstrap Экземпляр, используемый для запуска и подключения клиента, вызова option()
метод и передать ChannelOption.CONNECT_TIMEOUT_MILLIS
параметр, установите тайм-аут соединения на 5 секунд, это означает, что когда существование пытается построить соединение сервера, если время соединения соединения превышает 5 секунд, будет выдано исключение тайм-аута соединения.
new Bootstrap().option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);
Создайте ServerBootstrap Экземпляр, используемый для запуска и подключения на стороне сервера. Вот option()
Метод устанавливает параметры уровня сервера, которые влияют на все полученные соединения.
new ServerBootstrap().option(ChannelOption.CONNECT_TIMEOUT_MILLIS,5000);
Создайте ServerBootstrap Экземпляр, используемый для запуска и подключения на стороне сервера. Вот childOption()
Метод устанавливает параметры подуровня соединения, влияющие на каждое принятое соединение. SocketChannel。
new ServerBootstrap().childOption(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);
Хочу больше идти глубжепониматьсоединятьдогонятьчас Принцип настройки,Пожалуйста, переместите Блогер Предыдущая статья:«Анализ исходного кода» (3) Установить таймаут соединения: идти к углублению анализа ChannelFuture.sync() исполнения процесса;
концепцияпредставлять
существоватьNettyсередина,SO_BACKLOG
Параметры, используемые для установки ожидания сокета серверасоединятьочередьизразмер,Он контролирует, когда сервер установил все доступные потоки обработки.,И запрос на соединение и существование продолжает поступать,можно спастисуществоватьочередьсерединаизмаксимумсоединятьчисло。
Конкретно,Когда клиент пытается подключиться к серверу,Сервер переведет соединение в очередь ожидания соединения.,Если ожидание соединенияочередь заполнено,Новые запросы на соединение будут отклонены или проигнорированы.,В результате клиент не может успешно подключиться.
корректируя SO_BACKLOG
Значение параметра может контролировать размер очереди ожидающих соединений, тем самым влияя на количество соединений, которые сервер может принять одновременно. Чем больше значение, тем больше значение параметра. SO_BACKLOG
Это значение позволяет серверу обрабатывать больше одновременных запросов на подключение, но также увеличивает потребление памяти и нагрузку на сервер.
Следует отметить, что,SO_BACKLOG
женьшеньчислоиз Фактическое поведение может отличаться в зависимости от операции.системаварьируются от системы к системе,существоватьопределенные операциисистема Систематически,SO_BACKLOG
Значение параметра усекается до максимального значения, разрешенного операционной системой. Кроме того, если в операционной системе нет ограничения на размер очереди ожидания соединений, то SO_BACKLOG
Для значения параметра не будет явного верхнего предела.
существовать До реализации кода,Давайте сначала поймем TCP Процесс установления соединения показан на рисунке ниже:
существовать Изображение вышесередина,Сначала серверпроходить bind()
и listen()
Функция привязки и порта прослушивания, который передает клиент connect()
Функция отправляет серверу запрос на установление соединения:
syns queue
, и в то же время сервер также отправит SYN+ACK ответный пакет.accept queue
, и в то же время статус сервера меняется на ESTABLISHED。существовать Заканчивать TCP После трехстороннего рукопожатия сервер передает accept()
Функция извлекает информацию о соединении из полной очереди подключений и завершает установление соединения.
Читатели, желающие узнать больше о протоколе TCP, могут прочитать предыдущие записи блоггера:
демо-код
проходить option()
Метод устанавливает полный размер очереди подключений сервера равным 2:
new ServerBootstrap().option(ChannelOption.SO_BACKLOG, 2);
Результаты запуска:
Почему одновременно запускаются три клиента, что явно превышает установленный нами полный размер соединения, но никаких исключений не возникает?
Это потому, что эффективность обработки данных Netty очень превосходна.,Эти три запроса на соединение были обработаны за короткое время.,поэтому Это не вызвало наплыва запросов。
Далее используем точки останова для имитации ситуации накопления запросов, как показано на следующем рисунке:
использовать концепцию достоинства, мы знаем, что сервер в конечном итоге позвонит accept()
Комплексный подходсоединятьочередьсерединавыигратьсоединятьинформация,поэтому,Давайте сделаем точку останова в месте, показанном на картинке выше.,Поддержание совместной информации всегда в режиме совместного существования,Тем самым вызывая блокировку поворота.
Запустите сервер в режиме DEBUG, а затем одновременно запустите три клиента. Результаты следующие:
Вышеуказанные результаты больше соответствуют нашим ожидаемым результатам.
Читатели, которым нужен полный код, посетите блоггера. Github:TestBacklogServer,TestBacklogClient;
потому что это bind()
Метод будет использоваться BACKLOG, поэтому мы начинаем с этого метода, чтобы проверить его настройки по умолчанию.
существовать ServerSocketChannel нашел в классе bind()
метод,проходить Найти метод Функция, найдите ее существование NioSocketChannel.doBind
Метод используется следующим образом:
doBind()
Исходный код выглядит следующим образом:
@Override
protected void doBind(SocketAddress localAddress) throws Exception {
if (PlatformDependent.javaVersion() >= 7) {
javaChannel().bind(localAddress, config.getBacklog());
} else {
javaChannel().socket().bind(localAddress, config.getBacklog());
}
}
Приведите приведенный выше исходный код, мы можем знать BACKLOG иззначение по умолчаниюдасуществовать config
центр, справа config
Проследите и обнаружите, что его значение является вызывающим методом. NioServerSocketChannelConfig
приобретено, в то время как BACKLOG изначальное значение Точносуществовать NioServerSocketChannelConfig
родительский класс DefaultServerSocketChannelConfig
Инициализация в коде следующая:
public class DefaultServerSocketChannelConfig extends DefaultChannelConfig
implements ServerSocketChannelConfig {
private volatile int backlog = NetUtil.SOMAXCONN;
}
Продолжать следить NetUtil
Посмотреть в классе:
/**
* The SOMAXCONN value of the current machine. If failed to get the value, {@code 200} is used as a
* default value for Windows or {@code 128} for others.
*/
public static final int SOMAXCONN;
Как говорится в комментариях, если вы можете получить это из файла конфигурации SOMAXCONN
значение, используйте его напрямую, иначе Windows Операционная система SOMAXCONN
Значение по умолчанию равно 200,И другие Операционная система SOMAXCONN
Значение по умолчанию равно 128。
существовать Netty Средний, TCP_NODELAY это TCP Параметр, используемый для управления возможностью включения Nagle алгоритм. Нэгл алгоритмдасетьоптимизацияалгоритм,Он объединяет небольшие пакеты данных в более крупные пакеты данных для передачи.,Чтобы уменьшить накладные расходы на передачу по сети.
TCP_NODELAY Функция параметра – контролировать, следует ли отключать Nagle алгоритм. когда TCP_NODELAY Параметры установлены на true
, это значит отключено Nagle алгоритм,Данные отправляются немедленно,Вместо ожидания заполнения буфера или задержки истечения таймера,Это важно для приложений, которым требуется низкая задержка.,Например, общение в реальном времени или интерактивные приложения.
Однако,существовать в определенных конкретных сценариях,Если вам нужно минимизировать сетевые передачи,Рассмотрите возможность включения Nagle Алгоритм, скоро TCP_NODELAY Настройки параметровдля false
。
Пример кода выглядит следующим образом:
new ServerBootstrap().childOption(ChannelOption.TCP_NODELAY, true)
существовать Netty середина,SO_SNDBUF
и SO_RCVBUF
— это два параметра, связанные с размером буфера сокета. Они используются для установки размера буфера сокета, используемого для передачи и приема данных в базовой операционной системе.
SO_SNDBUF
(Отправить буфер):это значит отправитьчислов соответствии счасприложение Можетиспользоватьизбуфер сокетаизразмер。Когда приложениепроходитьсокет отправкичислов соответствии счас,Данные сначала будут скопированы в буфер отправки.,Затем он отправляется операционной системой. Если буфер отправки слишком мал,Это может привести к снижению скорости отправки или невозможности отправки. увеличение количества SO_SNDBUF
Это значение может повысить эффективность и производительность отправки данных.SO_RCVBUF
(буфер приема):это означает получениечислов соответствии счасприложение Можетиспользоватьизбуфер сокетаизразмер。При работесистемасистема получаетчислов соответствии счас,Данные будут храниться в буфере приема.,Затем приложение считывает данные из этого буфера. Если буфер приема слишком мал,может привести кчислов соответствии с丢失или Прием идет медленно。проходитьувеличивать SO_RCVBUF
Это значение может повысить эффективность и производительность получения данных.эти двое Параметры значения по По умолчанию обычно определяется операционной системой и может содержать ChannelOption.SO_SNDBUF
и ChannelOption.SO_RCVBUF
возможность продолжить Конфигурация。существовать Netty середина,Можетпроходить ServerBootstrap
и Bootstrap
сорт option()
Методы устанавливают значения этих опций.
Пример кода выглядит следующим образом:
new ServerBootstrap()
.option(ChannelOption.SO_SNDBUF, 1024 * 1024)
.option(ChannelOption.SO_RCVBUF, 1024 * 1024)
new ServerBootstrap()
.childOption(ChannelOption.SO_SNDBUF, 1024 * 1024)
.childOption(ChannelOption.SO_RCVBUF, 1024 * 1024)
существуют В приведенном выше коде,Установите размер буфера отправки и размер буфера приема сервера на 1 МБ.,существоватьклиентсередина,Можетпроходить Bootstrap
класс для установки.
существовать Netty середина,ALLOCATOR
Параметры, используемые для указания распределителя, используемого для выделения памяти. Нетти Предоставляются разные типыизраспределитель,Можно выбрать в соответствии с конкретными потребностями,Используйте подходящий дозатор.,Возможна оптимизация распределения памяти и повышение производительности.
существовать Bootstrap
или ServerBootstrap
середина,Можетпроходить option(ChannelOption.ALLOCATOR, allocator)
установить ALLOCATOR
женьшеньчисло。Чтосередина,allocator
Это реализовано ByteBufAllocator
объект интерфейса.
Теперь необходимо добавить код написания существующего в клиенте,существует Добавить код чтения на сервере,Как показано ниже:
// client
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ctx.writeAndFlush(ctx.alloc().buffer().writeBytes("Hello, World! --sidiot.".getBytes()));
}
// server
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
log.debug(String.valueOf(ctx.alloc().buffer()));
}
Результаты запуска:
PooledUnsafeDirectByteBuf
Точно ALLOCATOR
Параметры значения по По умолчанию, мы продолжим анализировать его исходный код так же, как и раньше, и найдем ChannelConfig
в классе ALLOCATOR
Параметры:
Продолжайте следить и узнавать DefaultChannelConfig
унаследованный ChannelConfig
,И для allocator
Инициализировано:
public class DefaultChannelConfig implements ChannelConfig {
private volatile ByteBufAllocator allocator = ByteBufAllocator.DEFAULT;
}
Продолжайте идти глубже ByteBufAllocator
класс, открытие ByteBufAllocator.DEFAULT
значение определяется ByteBufUtil
Дано классом:
public interface ByteBufAllocator {
ByteBufAllocator DEFAULT = ByteBufUtil.DEFAULT_ALLOCATOR;
}
идти глубже ByteBufUtil
Можно обнаружить, что блок статического кода, реализованный внутри его класса, DEFAULT_ALLOCATOR
Для назначения, если это система Android, по умолчанию используется не объединенный в пул. ByteBuf; в то же время, если пары нет. VM опция установлена, по умолчанию используется пул. ByteBuf:
Затем мы устанавливаем параметры виртуальной машины и устанавливаем для нее тип без объединения. Результаты следующие:
Однако мы использовали прямую память, так что же нам делать, если мы хотим использовать динамическую память?
Мы идем глубже PooledByteBufAllocator.DEFAULT
Исследуя и обнаружил, что он вызывает PlatformDependent.directBufferPreferred()
:
public static final UnpooledByteBufAllocator DEFAULT =
new UnpooledByteBufAllocator(PlatformDependent.directBufferPreferred());
Получает статистическую переменную системы, чтобы определить, использовать ли Прямую память:
продолжатьустановив VM варианты изменения ByteBuf Тип:
АЛЛОКАТОР используется следующим образом:
new ServerBootstrap().childOption(ChannelOption.ALLOCATOR, new PooledByteBufAllocator());
Второй параметр необходимо передать в ByteBufAllocator, используемый для указания сгенерированного ByteBuf Тип:
Объединение & Прямая память:
new PooledByteBufAllocator(true);
Объединение & Куча памяти:
new PooledByteBufAllocator(false);
Нет Объединение & Прямая память:
new UnpooledByteBufAllocator(true);
Нет Объединение & Куча памяти:
new UnpooledByteBufAllocator(false);
Являясь мощной структурой сетевых коммуникаций, Netty предоставляет множество параметров конфигурации, позволяющих нам точно контролировать поведение базовых сетевых операций в соответствии с потребностями приложения.
провести конфигурацию по параметрам в статье,Мы можем оптимизировать время ожидания, управлять полной длиной последовательностей соединений, корректировать стратегию передачи данных, контролировать размер буферов отправки и приема и достигать эффективного распределения памяти. Гибкость и возможность настройки этих параметров конфигурации.,делать Netty Станьте предпочтительной средой для создания высокопроизводительных масштабируемых веб-приложений.
Вот и все исследовать Netty Параметры конфигурации для создания превосходных сетевых приложений Весь контент, надеюсь, этот пост в блоге будет полезен всем!
ссылка:
📝 Последняя глава посвящена:「Анализ исходного кода" (3) Установить таймаут соединения: углубить анализ ChannelFuture.sync() процесса исполнения 💖 Я 𝓼𝓲𝓭𝓲𝓸𝓽, жду вашего рассмотренияПримечание,Творить непросто,Пожалуйста, поддержите меня; 👍 Официальный аккаунт:sidiotтехнологическая станция; 🔥ОтделСписок Столбец:исследовать Netty:источникАнализ кода и обмен кейсами приложений