YARP Proxying WebSockets và SPDY
Giới thiệu
YARP cho phép proxy các kết nối WebSocket và SPDY theo mặc định. Tính năng này hoạt động với cả hai cách tiếp cận direct forwarding (chuyển tiếp trực tiếp) và full pipeline (pipeline đầy đủ).
WebSockets là một giao thức streaming (truyền phát) hai chiều được xây dựng trên HTTP/1.1 hoặc được tương thích sang HTTP/2.
SPDY là tiền thân của HTTP/2 và thường được sử dụng trong các môi trường Kubernetes.
HTTP/1.1 Upgrades (Nâng cấp HTTP/1.1)
WebSockets và SPDY được xây dựng trên HTTP/1.1 sử dụng một tính năng gọi là connection upgrades (nâng cấp kết nối). YARP proxy yêu cầu ban đầu, và nếu máy chủ đích phản hồi với 101 Switching Protocols, sẽ nâng cấp kết nối thành một luồng hai chiều không trong suốt (opaque) sử dụng giao thức mới. YARP không hỗ trợ nâng cấp sang các giao thức khác như HTTP/2 theo cách này.
HTTP/2
YARP hỗ trợ WebSockets over HTTP/2 (WebSockets qua HTTP/2) bắt đầu từ .NET 7 và YARP 2.0. Kestrel là máy chủ ASP.NET Core duy nhất sẽ chấp nhận các yêu cầu WebSocket HTTP/2 đến và tính năng đó được bật tự động. Các trình duyệt có thể phát hiện tính năng hỗ trợ này được máy chủ quảng cáo và tự động chuyển sang HTTP/2.
Các phiên bản giao thức đến và đi không cần phải khớp nhau. Yêu cầu WebSocket đến có thể là HTTP/1.1 hoặc HTTP/2. Không có cấu hình cụ thể cho WebSockets đối với các yêu cầu đi, YARP sẽ sử dụng Version và VersionPolicy của ForwarderRequestConfig để xác định phiên bản đi sẽ dùng. Các giá trị này mặc định là HTTP/2 và RequestVersionOrLower.
WebSockets yêu cầu các HTTP header khác nhau cho HTTP/2, vì vậy YARP sẽ thêm và xóa các header này khi cần thiết khi chuyển đổi giữa các phiên bản khác nhau.
Sau khi bắt tay (handshake) ban đầu, WebSockets hoạt động theo cùng một cách trên cả hai phiên bản HTTP.
Timeout (Thời gian chờ)
Http Request Timeouts (.NET 8+) có thể áp dụng timeout cho tất cả các yêu cầu theo mặc định hoặc theo policy. Các timeout này sẽ bị vô hiệu hóa sau khi bắt tay WebSocket hoàn tất. Chúng vẫn sẽ áp dụng cho các yêu cầu gRPC. Để biết thêm cấu hình, xem Timeouts.