Найти в Дзене
Записки о Java

Сетевые технологии для Java - разработчика: что нужно знать и уметь (Java 11+)

Стек: Java 11, NIO, Netty, Spring Boot, TCP/UDP, HTTP/2, TLS, Linux
Цель: дать структурированную программу знаний, чтобы разработчик мог проектировать, отлаживать и оптимизировать сетевые взаимодействия в enterprise- и high-load-системах. Вы можете писать идеальный код, но если не понимаете, как данные путешествуют от клиента к серверу, вы: 💡 Разработчик — это не только “кодит”, но и “понимает стек до дна”. server: ssl: key-store: classpath:keystore.p12 key-store-password: secret Запросы висят 30+ сек Нет таймаута на чтение Всегда задавайте socketTimeout Высокий TIME_WAIT Частое открытие/закрытие соединений Используйте connection pooling DNS-кэш не обновляется JVM кэширует DNS навсегда по умолчанию -Dsun.net.inetaddr.ttl=5 Снижение скорости при высокой нагрузке Backpressure не настроен Используйте реактивные стримы или ограничение очередей Сертификат не доверенный Самоподписанный сертификат Или добавьте в truststore, или настройте custom SSLC
Оглавление
Рисунок: сетевые технологии для Java разработчика
Рисунок: сетевые технологии для Java разработчика

Стек: Java 11, NIO, Netty, Spring Boot, TCP/UDP, HTTP/2, TLS, Linux
Цель: дать структурированную программу знаний, чтобы разработчик мог проектировать, отлаживать и оптимизировать сетевые взаимодействия в enterprise- и high-load-системах.

Почему разработчику нужны сетевые знания?

Вы можете писать идеальный код, но если не понимаете, как данные путешествуют от клиента к серверу, вы:

  • не сможете отладить таймауты и зависания,
  • не поймёте, почему микросервисы «теряют» запросы,
  • не сможете масштабировать систему,
  • будете слепо доверяться фреймворкам, не зная их ограничений.
💡 Разработчик — это не только “кодит”, но и “понимает стек до дна”.

Программа знаний: 5 уровней сетевой компетенции

Уровень 1. Основы: TCP/IP, HTTP, DNS

Что знать:

  • Модель OSI и TCP/IP стек: физический, канальный, сетевой, транспортный, прикладной уровни.
  • Разница между TCP и UDP:TCP — надёжный, с подтверждением, с порядком.
    UDP — быстрый, без гарантий, для VoIP, DNS, стриминга.
  • HTTP/1.1: методы, статусы, заголовки, keep-alive, pipelining.
  • DNS: как разрешается имя → IP, кэширование, TTL.
  • TLS/SSL: handshake, сертификаты, шифрование на транспортном уровне.

Практика (Java 11):

  • Работа с java.net.Socket, ServerSocket.

server:

ssl:

key-store: classpath:keystore.p12

key-store-password: secret

Уровень 2. Уровень приложения: HTTP/2, REST, gRPC, WebSockets

Что знать:

  • HTTP/2: мультиплексирование, binary framing, header compression, server push.
  • REST: идиомы, идемпотентность (GET, PUT, DELETE), статус-коды.
  • gRPC: protobuf, двунаправленные стримы, контракты.
  • WebSockets: full-duplex, @ServerEndpoint (в Spring: WebSocketHandler).
  • Content Negotiation: Accept, Content-Type.

Практика (Java 11):

  • Использование HttpClient (встроен в Java 11!):
Рисунок: пример использования HttpClient в JAVA
Рисунок: пример использования HttpClient в JAVA
  • Реализация WebSocket-сервера на Spring:
Рисунок: пример реализации WebSocket на JAVA
Рисунок: пример реализации WebSocket на JAVA

Уровень 3. Транспортный уровень: сокеты, NIO, таймауты, буферизация

Что знать:

  • Blocking I/O (java.io) vs Non-blocking I/O (java.nio).
  • Selectors, Channels, Buffers в NIO.
  • Таймауты: connect, read, write — почему они критичны.
  • TCP-настройки: SO_TIMEOUT, SO_REUSEADDR, TCP_NODELAY.
  • Backpressure: как не захлебнуться в данных.

Практика (Java 11):

  • Настройка таймаутов в RestTemplate:
Рисунок: настройка таймаутов
Рисунок: настройка таймаутов
  • Работа с AsynchronousSocketChannel:
Рисунок: работа с AsynchronousSocketChannel
Рисунок: работа с AsynchronousSocketChannel

Уровень 4. Высокая нагрузка и отказоустойчивость

Что знать:

  • Connection pooling: почему нельзя создавать Socket на каждый запрос.
  • Load balancing: round-robin, least connections, sticky sessions.
  • Service discovery: Consul, Eureka, Kubernetes DNS.
  • Circuit Breaker, Retry, Timeout — шаблоны отказоустойчивости (Resilience4j).
  • Idempotency: как избежать дублей при повторах.
  • Rate limiting: токен-бакет, leaky bucket.

Практика (Java 11 + Spring Boot):

  • Настройка WebClient с таймаутами и retry:
Рисунок: настройка WebClient с таймаутами и retry
Рисунок: настройка WebClient с таймаутами и retry
  • Использование Resilience4j для retry:
Рисунок: использование Resilience4j для retry
Рисунок: использование Resilience4j для retry

Уровень 5. Отладка, мониторинг, Linux

Что знать:

  • Инструменты: netstat / ss — состояние сокетов,
    tcpdump / Wireshark — анализ трафика,
    curl -v — отладка HTTP,
    telnet / nc — проверка открытых портов.
  • Метрики:количество открытых соединений,
    время ответа,
    ошибка TIME_WAIT, CLOSE_WAIT.
  • JVM и сети: настройка DNS cache: -Dsun.net.inetaddr.ttl=5,
    проблемы с /etc/hosts и IPv6.

Типичные проблемы разработчика и как их решать

Запросы висят 30+ сек

Нет таймаута на чтение

Всегда задавайте socketTimeout

Высокий TIME_WAIT

Частое открытие/закрытие соединений

Используйте connection pooling

DNS-кэш не обновляется

JVM кэширует DNS навсегда по умолчанию

-Dsun.net.inetaddr.ttl=5

Снижение скорости при высокой нагрузке

Backpressure не настроен

Используйте реактивные стримы или ограничение очередей

Сертификат не доверенный

Самоподписанный сертификат

Или добавьте в truststore, или настройте custom SSLContext

Заключение: разработчик, это и сетевой инженер в душе

Как Java разработчик, вы должны:

  • Понимать, как работает сеть под вашим кодом,
  • Уметь настроить, отладить и оптимизировать сетевые вызовы,
  • Проектировать системы, устойчивые к сетевым сбоям,
  • Говорить на одном языке с DevOps.
🛠️ Запомните:
Хороший код — это не только чистая архитектура, но и осознанная работа с сетью.