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à Vai trò của Envoy Proxy trong Kiến trúc Microservices
Trong kiến trúc Microservices, việc quản lý lưu lượng mạng phân tán từ phía máy khách (client) đến các dịch vụ nội bộ là một thách thức lớn. Hệ thống đòi hỏi một điểm đầu mối duy nhất để xử lý định tuyến, bảo mật, và tối ưu hóa hiệu năng. Điểm đầu mối này được gọi là Edge Gateway.
Một Edge Gateway mạnh mẽ không chỉ làm nhiệm vụ Reverse Proxy thông thường mà còn phải hỗ trợ các công nghệ mạng hiện đại nhằm giảm thiểu độ trễ và tối ưu hóa băng thông. Envoy Proxy, một dự án mã nguồn mở ban đầu được phát triển bởi Lyft, đã trở thành tiêu chuẩn công nghiệp cho vị trí này nhờ vào kiến trúc hướng sự kiện hiệu năng cao, khả năng cấu hình linh hoạt và hỗ trợ xuất sắc các giao thức thế hệ mới như HTTP/3 (QUIC) và gRPC-Web.
Envoy Proxy hoạt động ở cả Lớp 3/4 (TCP/UDP) và Lớp 7 (HTTP), mang lại khả năng kiểm soát lưu lượng chuyên sâu mà hiếm có giải pháp proxy truyền thống nào đạt được.
2. Tại sao chọn HTTP/3 và gRPC-Web cho Hệ thống Hiện đại?
Ưu thế vượt trội của HTTP/3 (QUIC)
Khác với HTTP/2 dựa trên nền tảng TCP, HTTP/3 sử dụng giao thức QUIC (Quick UDP Internet Connections) chạy trên nền UDP. Điều này mang lại hai lợi ích cốt lõi cho môi trường doanh nghiệp:
- Giải quyết vấn đề Head-of-Line Blocking (HoL): Trong HTTP/2, nếu một gói tin TCP bị mất, toàn bộ kết nối sẽ bị nghẽn. Với HTTP/3, các luồng dữ liệu (streams) hoạt động độc lập; việc mất gói tin ở một luồng không ảnh hưởng đến các luồng khác.
- Kết nối lại nhanh chóng (Connection Migration): Khi người dùng di chuyển từ mạng Wi-Fi sang mạng di động (4G/5G), kết nối HTTP/3 không bị ngắt quãng nhờ cơ chế định danh bằng Connection ID thay vì IP và Port.
gRPC-Web: Cầu nối Microservices đến Trình duyệt
Mặc dù gRPC (dựa trên HTTP/2 và Protocol Buffers) là lựa chọn tối ưu cho giao tiếp Inter-service (giữa các microservices với nhau) nhờ tốc độ thực thi cao và dung lượng thông điệp nhỏ, các trình duyệt web hiện tại lại không hỗ trợ đầy đủ các tính năng HTTP/2 bắt buộc của gRPC. gRPC-Web xuất hiện như một giải pháp dịch chuyển, cho phép các ứng dụng Frontend (React, Angular, Vue) tương tác trực tiếp với các dịch vụ gRPC thông qua một proxy trung gian như Envoy.
3. Chuẩn bị Môi trường trên VPS Ubuntu
Để triển khai giải pháp này, bạn cần chuẩn bị một VPS chạy hệ điều hành Ubuntu 22.04 LTS hoặc Ubuntu 24.04 LTS sạch. Ngoài ra, các điều kiện tiên quyết bao gồm:
- Một tên miền (Domain) đã được trỏ bản ghi A (và AAAA nếu có) về IP công khai của VPS.
- Mở các cổng mạng cần thiết trên tường lửa (UFW): Cổng
80/TCP(HTTP),443/TCP(HTTP/2, gRPC-Web) và quan trọng nhất là443/UDP(cho HTTP/3).
Cài đặt Envoy Proxy
Chúng ta sẽ cài đặt phiên bản Envoy chính thức từ kho lưu trữ của nhà phát triển:
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
curl -sL '[https://deb.dl.getenvoy.io/public/gpg.key](https://deb.dl.getenvoy.io/public/gpg.key)' | sudo gpg --dearmor -o /usr/share/keyrings/getenvoy-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/getenvoy-keyring.gpg] [https://deb.dl.getenvoy.io/public/deb/ubuntu](https://deb.dl.getenvoy.io/public/deb/ubuntu) $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.dist.d/getenvoy.list
sudo apt-get update
sudo apt-get install -y getenvoy-envoyKhởi tạo Chứng chỉ SSL/TLS với Let's Encrypt
HTTP/3 bắt buộc phải có mã hóa TLS. Chúng ta sử dụng Certbot để cấp phát chứng chỉ miễn phí:
sudo apt-get install -y certbot
sudo certbot certonly --standalone -d yourdomain.comLưu ý thay thế yourdomain.com bằng tên miền thực tế của doanh nghiệp bạn. Chứng chỉ thu được sẽ nằm tại thư mục /etc/letsencrypt/live/[yourdomain.com/](https://yourdomain.com/).
4. Xây dựng Cấu hình Envoy Proxy toàn diện
Dưới đây là tệp cấu hình toàn diện của Envoy (/etc/envoy/envoy.yaml) được thiết kế chuyên biệt để hỗ trợ song song HTTP/3, gRPC-Web và định tuyến đến các microservices nội bộ.
static_resources:
listeners:
# 1. LISTENER CHO HTTP/3 (UDP)
- name: listener_http3
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:
- 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: HTTP3
route_config:
name: local_route
virtual_hosts:
- name: api_service
domains: ["yourdomain.com"]
routes:
- match: { prefix: "/grpc." }
route: { cluster: grpc_backend_cluster, timeout: 0s }
- match: { prefix: "/" }
route: { cluster: web_backend_cluster }
http_filters:
- 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.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)
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/letsencrypt/live/[yourdomain.com/fullchain.pem](https://yourdomain.com/fullchain.pem)" }
private_key: { filename: "/etc/letsencrypt/live/[yourdomain.com/privkey.pem](https://yourdomain.com/privkey.pem)" }
tls_params:
tls_minimum_protocol_version: TLSv1_3
# 2. LISTENER CHO HTTP/2 & gRPC-Web (TCP)
- name: listener_http2_tcp
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 443
filter_chains:
- 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_tcp
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: api_service
domains: ["yourdomain.com"]
response_headers_to_add:
- header: { key: "alt-svc", value: 'h3=":443"; ma=86400' }
routes:
- match: { prefix: "/grpc." }
route: { cluster: grpc_backend_cluster, timeout: 0s }
- match: { prefix: "/" }
route: { cluster: web_backend_cluster }
http_filters:
- 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.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)
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/letsencrypt/live/[yourdomain.com/fullchain.pem](https://yourdomain.com/fullchain.pem)" }
private_key: { filename: "/etc/letsencrypt/live/[yourdomain.com/privkey.pem](https://yourdomain.com/privkey.pem)" }
alpn_protocols: ["h2", "http/1.1"]
clusters:
# BACKEND CHO gRPC SERVICES
- name: grpc_backend_cluster
connect_timeout: 0.25s
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
typed_extension_protocol_options:
envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
"@type": [type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions](https://type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions)
explicit_http_config:
http2_protocol_options: {}
load_assignment:
cluster_name: grpc_backend_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.1
port_value: 50051
# BACKEND CHO WEB SERVICES (REST/GRAPHQL/STATIC)
- name: web_backend_cluster
connect_timeout: 0.25s
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: web_backend_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.1
port_value: 8080Giải thích các thành phần cốt lõi trong cấu hình:
- Alt-Svc Header: Trong thành phần TCP Listener, dòng
response_headers_to_addtruyền tiêu đềalt-svc: h3=":443"; ma=86400về trình duyệt. Đây là cơ chế bắt buộc để thông báo cho Client biết rằng máy chủ có hỗ trợ HTTP/3 qua cổng UDP 443 nhằm kích hoạt nâng cấp giao thức trong các lần yêu cầu tiếp theo. - envoy.filters.http.grpc_web: Bộ lọc này tự động chặn bắt các gói tin có định dạng gRPC-Web từ trình duyệt, tiến hành giải mã (decode) và chuyển đổi thành luồng gRPC thuần túy truyền đến các cụm dịch vụ phía sau (Backend Clusters).
- Explicit HTTP2 Protocol Options: Cấu hình này bắt buộc Envoy giao tiếp với dịch vụ gRPC nội bộ (cổng 50051) bằng giao thức HTTP/2 tiêu chuẩn.
5. Vận hành và Kiểm tra Hệ thống
Sau khi đã lưu tệp cấu hình, hãy thực hiện kiểm tra tính hợp lệ của cú pháp trước khi khởi động dịch vụ bằng lệnh:
envoy --mode validate -c /etc/envoy/envoy.yamlNếu thông báo hiển thị cấu hình hợp lệ, tiến hành khởi động lại Envoy Proxy:
sudo systemctl restart envoy
sudo systemctl enable envoyKiểm tra HTTP/3 Hoạt động
Để xác minh HTTP/3 đã hoạt động chính xác trên cổng UDP, bạn có thể sử dụng công cụ dòng lệnh curl phiên bản mới hỗ trợ HTTP/3 hoặc truy cập trang web kiểm tra trực tuyến như http3check.net. Với lệnh curl, chạy cú pháp sau:
curl -I --http3 [https://yourdomain.com](https://yourdomain.com)Nếu thành công, phản hồi từ máy chủ sẽ trả về HTTP/3 cùng với tiêu đề alt-svc chứng minh cấu hình Edge Gateway hoàn toàn chính xác.
6. Kết luận
Việc kết hợp Envoy Proxy, HTTP/3, và gRPC-Web tạo nên một hạ tầng Edge Gateway tối ưu bậc nhất hiện nay cho kiến trúc Microservices trên VPS Ubuntu. Giải pháp này không chỉ giải quyết bài toán hiệu năng nhờ tận dụng tối đa sức mạnh của giao thức UDP trên nền QUIC mà còn mở đường cho các ứng dụng Frontend giao tiếp trực tiếp, mượt mà với hệ thống Backend gRPC tốc độ cao. Đầu tư cấu hình hệ thống Gateway vững chắc ngay từ đầu là bước đi chiến lược giúp doanh nghiệp đảm bảo tính sẵn sàng và khả năng mở rộng quy mô tải trong tương lai.
