Компания Cloudflare опубликовала выпуск фреймворка Pingora 0.4, предназначенного для разработки защищённых высокопроизводительных сетевых сервисов на языке Rust. Построенный при помощи Pingora прокси уже более двух лет используется в сети доставки контента Cloudflare вместо nginx и обрабатывает более 40 млн запросов в секунду. Код написан на языке Rust и опубликован под лицензией Apache 2.0.
Основные возможности Pingora:
- Поддержка HTTP/1 и HTTP/2 (в планах HTTP/3), а также возможность создания сервисов, использующих свои протоколы или UDP/TCP.
- Поддержка многопоточной обработки запросов в асинхронном режиме.
- Возможность прикрепления callback-обработчиков и фильтров, позволяющих управлять различными стадиями обработки запроса, а также изменять, перенаправлять, блокировать и журналировать запросы и ответы.
- Проксирование gRPC и WebSocket.
- Подключаемые балансировщики нагрузки.
- Возможность изменения конфигурации без перезапуска.
- Поддержка обновления кода приложения без разрыва соединений.
- Средства для переключения нагрузки в случае сбоя (failover).
- Интеграция с различными системами мониторинга и ведения логов (Syslog, Prometheus, Sentry, OpenTelemetry).
- Поддержка TLS-шифрования (применяется OpenSSL, BoringSSL или Rustls).
- Готовые Rust-пакеты для создания HTTP-прокси, работы с сетевыми протоколами, разбора заголовков HTTP, учёта и ограничения трафика, балансировки нагрузки, работы с распределённой хэш-таблицей Ketama, поддержания кэша в оперативной памяти и асинхронной обработки таймаутов.
Среди изменений в новой версии:
- Начальная поддержка криптографической библиотеки Rustls, использующей криптопровайдеров на базе библиотек aws-lc-rs и ring, основанных на BoringSSL.
- Экспериментальная поддержка платформы Windows.
- Режим фиктивного TLS (dummy TLS), который можно применять в ситуациях, когда невозможно использовать реальную реализацию TLS.
- Добавлена поддержка модуля gRPC-web для трансляции запросов клиентов gRPC-web в запросы к серверу gRPC.
- Предоставлена возможность обработки соединений H2C (HTTP/2 поверх голого TCP, без шифрования) и HTTP/1 на одном сетевом порту.
- Добавлена возможность подключения собственных реализаций функции connect() для изменения поведения при установке сетевого соединения, например, для выставления дополнительных опций для сокета или симуляции ошибок при тестировании.
- Предоставлена возможность игнорирования информационных ответов при проксировании, таких как ответы с заголовком "Expect: 100-continue".
- Добавлена поддержка распаковки ответов, сжатых методом gzip.
- Реализован учёт состояния бэкенда в целях мониторинга.
- Добавлена возможность привязки к диапазону локальных портов.
Источник: https://www.opennet.ru/opennews/art.shtml?num=62163