Firma Cloudflare opublikowała wydanie frameworka Pingora 0.4, przeznaczonego do tworzenia zabezpieczonych, wysoko wydajnych usług sieciowych w języku Rust. Proxy stworzone za pomocą Pingora jest od ponad dwóch lat używane w sieci dostarczania treści Cloudflare jako alternatywa dla nginx i obsługuje ponad 40 milionów zapytań na sekundę. Kod jest napisany w języku Rust i opublikowany na licencji Apache 2.0.
Główne możliwości Pingora:
- Wsparcie dla HTTP/1 i HTTP/2 (w planach HTTP/3), a także możliwość tworzenia usług korzystających z własnych protokołów lub UDP/TCP.
- Wsparcie dla wielowątkowego przetwarzania zapytań w trybie asynchronicznym.
- Możliwość dołączania callbacków i filtrów umożliwiających zarządzanie różnymi etapami przetwarzania zapytania, a także modyfikowanie, przekierowywanie, blokowanie i logowanie zapytań i odpowiedzi.
- Proxy gRPC i WebSocket.
- Modułowe load balancery.
- Możliwość zmiany konfiguracji bez restartu.
- Wsparcie dla aktualizacji kodu aplikacji bez przerywania połączeń.
- Narzędzia do przełączania obciążenia w przypadku awarii (failover).
- Integracja z różnymi systemami monitorującymi i logującymi (Syslog, Prometheus, Sentry, OpenTelemetry).
- Wsparcie dla szyfrowania TLS (wykorzystuje OpenSSL, BoringSSL lub Rustls).
- Gotowe pakiety Rust do tworzenia proxy HTTP, pracy z protokołami sieciowymi, analizy nagłówków HTTP, zliczania i ograniczania ruchu, balansowania obciążenia, pracy z rozproszoną tablicą haszującą Ketama, utrzymywania pamięci podręcznej w pamięci RAM i asynchronicznego przetwarzania czasów oczekiwania.
Wśród zmian w nowej wersji:
- Wstępne wsparcie dla biblioteki kryptograficznej Rustls, wykorzystującej dostawców kryptografii opartych na bibliotekach aws-lc-rs i ring, opartych na BoringSSL.
- Eksperymentalne wsparcie dla platformy Windows.
- Tryb fikcyjnego TLS (dummy TLS), który można stosować w sytuacjach, gdy nie można użyć rzeczywistej implementacji TLS.
- Dodano wsparcie dla modułu gRPC-web do tłumaczenia zapytań klientów gRPC-web na zapytania do serwera gRPC.
- Udostępniono możliwość obsługi połączeń H2C (HTTP/2 na czystym TCP, bez szyfrowania) i HTTP/1 na jednym porcie sieciowym.
- Dodano możliwość podłączenia własnych implementacji funkcji connect() w celu zmiany zachowania podczas nawiązywania połączenia sieciowego, na przykład w celu ustawienia dodatkowych opcji dla gniazdka lub symulacji błędów w testach.
- Dodano możliwość ignorowania odpowiedzi informacyjnych podczas proxy, takich jak odpowiedzi z nagłówkiem „Expect: 100-continue”.
- Dodano wsparcie dla dekompresji odpowiedzi skompresowanych metodą gzip.
- Zrealizowano śledzenie stanu backendu w celach monitoringu.
- Dodano możliwość powiązania z zakresem lokalnych portów.
Źródło: opennet.ru
