Cấu Hình Envoy Proxy Làm Edge Gateway Hỗ Trợ HTTP/3 Và gRPC-Web Cho Microservices Trên VPS Ubuntu
1. Giới thiệu về Edge Gateway và bộ đôi HTTP/3 & gRPC-Web
Trong kiến trúc Microservices hiện đại, việc quản lý luồng dữ liệu đi vào hệ thống (North-South traffic) đóng vai trò quyết định đến hiệu năng và độ bảo mật. Edge Gateway xuất hiện như một điểm tiếp nhận duy nhất, chịu trách nhiệm định tuyến, cân bằng tải và bảo mật luồng thông tin này. Trong số các giải pháp hiện nay, Envoy Proxy nổi lên như một lựa chọn hàng đầu nhờ hiệu năng vượt trội, kiến trúc mở rộng dựa trên các bộ lọc (filters) và khả năng hỗ trợ các công nghệ mạng thế hệ mới cực kỳ mạnh mẽ.
Bài viết này sẽ hướng dẫn bạn cách triển khai Envoy Proxy làm Edge Gateway trên môi trường VPS Ubuntu, đồng thời kích hoạt hai công nghệ tiên tiến:
- HTTP/3 (QUIC): Giao thức mạng thế hệ mới chạy trên nền tảng UDP, loại bỏ hoàn toàn vấn đề nghẽn đầu hàng (Head-of-Line Blocking) của HTTP/2, giúp tăng tốc độ tải trang và tối ưu trải nghiệm người dùng trên thiết bị di động khi mạng chập chờn.
- gRPC-Web: Giải pháp cho phép các ứng dụng trình duyệt (Browser-based apps như React, Angular, Vue) có thể giao tiếp trực tiếp với các dịch vụ gRPC ở backend thông qua Envoy Proxy mà không cần tầng dịch thuật trung gian phức tạp.
Lưu ý: Để triển khai thực tế thành công, bạn cần chuẩn bị một VPS Ubuntu (20.04 hoặc 22.04 LTS), một tên miền hợp lệ đã trỏ về IP của VPS và chứng chỉ SSL/TLS (có thể sử dụng Let's Encrypt).---
2. Chuẩn bị môi trường và Cài đặt Envoy Proxy trên Ubuntu
Mặc dù bạn có thể cài đặt Envoy trực tiếp bằng trình quản lý gói APT, việc sử dụng Docker và Docker Compose được khuyến khích mạnh mẽ đối với kiến trúc Microservices để đảm bảo tính đóng gói và dễ dàng quản lý phiên bản.
Bước 1: Cập nhật hệ thống và cài đặt Docker
Hãy chạy các lệnh sau để đảm bảo hệ thống Ubuntu của bạn được cập nhật và cài đặt sẵn Docker:
sudo apt update && sudo apt upgrade -y
sudo apt install docker.io docker-compose -y
sudo systemctl enable --now docker
Bước 2: Chuẩn bị chứng chỉ SSL/TLS
Vì HTTP/3 bắt buộc phải có mã hóa TLS, bạn cần cấu hình chứng chỉ SSL. Giả sử bạn đã có các tệp chứng chỉ đặt tại thư mục /etc/letsencrypt/live/[example.com/](https://example.com/) bao gồm fullchain.pem và privkey.pem.
3. Xây dựng File Cấu Hình Envoy Proxy (envoy.yaml)
Cấu hình của Envoy được tổ chức dựa trên các thành phần cốt lõi: Listeners (Nơi tiếp nhận kết nối), Filters (Xử lý dữ liệu) và Clusters (Các dịch vụ backend). Dưới đây là file cấu hình hoàn chỉnh hỗ trợ cả HTTP/3 và gRPC-Web.
Hãy tạo một file tên là envoy.yaml với nội dung sau:
static_resources:
listeners:
# 1. LISTENER CHO HTTP/3 (UDP)
- name: http3_listener
address:
socket_address:
protocol: UDP
address: 0.0.0.0
port_value: 443
udp_listener_config:
downstream_socket_config:
max_rx_datagram_size: 1500
filter_chains:
- transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": [type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext](https://type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext)
common_tls_context:
tls_certificates:
- certificate_chain: { filename: "/etc/envoy/certs/fullchain.pem" }
private_key: { filename: "/etc/envoy/certs/privkey.pem" }
alpn_protocols: ["h3"]
filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": [type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager](https://type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager)
stat_prefix: ingress_http3
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: api_service
domains: ["*"]
routes:
- match: { prefix: "/" }
route: { cluster: grpc_backend_cluster }
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": [type.googleapis.com/envoy.extensions.filters.http.router.v3.Router](https://type.googleapis.com/envoy.extensions.filters.http.router.v3.Router)
# 2. LISTENER CHO HTTP/1.1 VÀ HTTP/2 (TCP)
- name: http2_listener
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 443
filter_chains:
- transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": [type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext](https://type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext)
common_tls_context:
tls_certificates:
- certificate_chain: { filename: "/etc/envoy/certs/fullchain.pem" }
private_key: { filename: "/etc/envoy/certs/privkey.pem" }
alpn_protocols: ["h2", "http/1.1"]
filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": [type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager](https://type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager)
stat_prefix: ingress_http2
codec_type: AUTO
# Khai báo Alt-Svc header để thông báo cho trình duyệt biết có hỗ trợ HTTP/3
response_headers_to_add:
- header: { key: "alt-svc", value: "h3=\":443\"; ma=86400" }
route_config:
name: local_route
virtual_hosts:
- name: api_service
domains: ["*"]
cors:
allow_origin_string_match:
- safe_regex: { google_re2: {}, regex: ".*" }
allow_methods: "GET, PUT, DELETE, POST, OPTIONS"
allow_headers: "keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout"
max_age: "1728000"
expose_headers: "grpc-status,grpc-message"
routes:
- match: { prefix: "/" }
route: { cluster: grpc_backend_cluster, cors: {} }
http_filters:
# Kích hoạt bộ lọc gRPC-Web
- name: envoy.filters.http.grpc_web
typed_config:
"@type": [type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb](https://type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb)
- name: envoy.filters.http.cors
typed_config:
"@type": [type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors](https://type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors)
- name: envoy.filters.http.router
typed_config:
"@type": [type.googleapis.com/envoy.extensions.filters.http.router.v3.Router](https://type.googleapis.com/envoy.extensions.filters.http.router.v3.Router)
clusters:
- name: grpc_backend_cluster
connect_timeout: 0.25s
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
http2_protocol_options: {}
load_assignment:
cluster_name: grpc_backend_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: grpc_backend_service
port_value: 9000
---
4. Phân tích các thành phần cấu hình quan trọng
Để vận hành và tùy biến hệ thống một cách tối ưu, doanh nghiệp cần hiểu rõ cơ chế hoạt động của các khối cấu hình trên:
Cấu hình Song song TCP và UDP
Do HTTP/3 hoạt động trên nền UDP trong khi các trình duyệt cũ vẫn sử dụng TCP (cho HTTP/1.1 và HTTP/2), chúng ta bắt buộc phải mở hai Listener riêng biệt trên cùng một cổng 443. Một Listener lắng nghe luồng TCP và một Listener lắng nghe luồng UDP.
Cơ chế Alt-Svc (Alternative Services)
Khi người dùng truy cập trang web lần đầu tiên qua giao thức TCP truyền thống, Envoy sẽ bổ sung một Header đặc biệt vào phản hồi:
alt-svc: h3=":443"; ma=86400
Header này đóng vai trò chỉ dẫn cho trình duyệt biết rằng hệ thống có hỗ trợ HTTP/3 (h3) tại cổng 443. Ở các yêu cầu tiếp theo, trình duyệt sẽ tự động nâng cấp kết nối lên UDP để đạt tốc độ tối ưu.
Tích hợp bộ lọc gRPC-Web và CORS
Trình duyệt web không thể tạo ra các kết nối gRPC thuần túy do hạn chế về quyền kiểm soát các frame HTTP/2 cấp thấp. Bộ lọc envoy.filters.http.grpc_web đóng vai trò như một chiếc cầu nối. Nó tiếp nhận các request dạng mã hóa Base64 hoặc nhị phân từ trình duyệt, chuyển đổi chúng thành các gRPC request hợp lệ để gửi tới backend, và ngược lại.
Bên cạnh đó, cấu hình CORS (Cross-Origin Resource Sharing) cực kỳ quan trọng nhằm cho phép ứng dụng Frontend đặt tại một tên miền khác có thể gọi API một cách an toàn mà không bị trình duyệt chặn lại.
---5. Triển khai Hệ thống Bằng Docker Compose
Để khởi chạy Envoy cùng dịch vụ backend minh họa, hãy tạo tệp docker-compose.yml tại cùng thư mục:
version: '3.8'
services:
envoy-gateway:
image: envoyproxy/envoy:v1.28.0
container_name: envoy_edge_gateway
volumes:
- ./envoy.yaml:/etc/envoy/envoy.yaml:ro
- /etc/letsencrypt/live/[example.com/fullchain.pem:/etc/envoy/certs/fullchain.pem:ro](https://example.com/fullchain.pem:/etc/envoy/certs/fullchain.pem:ro)
- /etc/letsencrypt/live/[example.com/privkey.pem:/etc/envoy/certs/privkey.pem:ro](https://example.com/privkey.pem:/etc/envoy/certs/privkey.pem:ro)
ports:
- "80:80"
- "443:443/tcp"
- "443:443/udp"
networks:
- microservices_net
restart: always
grpc_backend_service:
image: your-grpc-backend-image:latest
container_name: grpc_backend_service
networks:
- microservices_net
expose:
- "9000"
networks:
microservices_net:
driver: bridge
Khởi chạy hệ thống bằng lệnh:
sudo docker-compose up -d
Lưu ý quan trọng về tường lửa: Đảm bảo rằng bạn đã mở cả cổng TCP và UDP trên hệ thống tường lửa của Ubuntu (UFW) bằng cách chạy lệnh:---
sudo ufw allow 443/tcp && sudo ufw allow 443/udp
6. Kiểm tra và Đánh giá hiệu năng
Sau khi triển khai, việc xác minh cấu hình hoạt động đúng chuẩn là bước bắt buộc:
- Kiểm tra HTTP/3: Bạn có thể sử dụng các công cụ trực tuyến như http3check.net hoặc sử dụng lệnh Curl thế hệ mới:
Nếu tiêu đề phản hồi trả về thành công và trình duyệt hiển thị giao thức là "h3" trong tab Network (Developer Tools), bạn đã cấu hình thành công.curl --http3 [https://example.com](https://example.com) -I - Kiểm tra gRPC-Web: Từ ứng dụng Client (ví dụ sử dụng thư viện
grpc-webcủa phía Frontend), hãy thử thực hiện một lời gọi hàm từ xa (RPC call). Nếu không gặp lỗi CORS và dữ liệu trả về đúng định dạng, hệ thống kết nối đã thông suốt.
7. Lời kết
Việc kết hợp Envoy Proxy, HTTP/3 và gRPC-Web mang đến một giải pháp Edge Gateway toàn diện, mạnh mẽ cho hệ thống Microservices doanh nghiệp. Mô hình này không chỉ giúp giảm thiểu độ trễ mạng đến mức tối đa nhờ giao thức mạng UDP mà còn đơn giản hóa kiến trúc kết nối giữa Frontend và Backend. Triển khai giải pháp này trên VPS Ubuntu là bước đi chiến lược giúp doanh nghiệp tối ưu chi phí hạ tầng trong khi vẫn đảm bảo trải nghiệm người dùng ở mức cao nhất.
