Quay lại danh sách
Tin tức công nghệ

Cấu Hình Envoy Proxy Làm Edge Gateway Hỗ Trợ HTTP/3 Và gRPC-Web Cho Microservices Trên VPS Ubuntu

29 tháng 5, 2026

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:

  1. 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.
  2. 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-envoy

Khở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.com

Lư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: 8080

Giả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_add truyền tiêu đề alt-svc: h3=":443"; ma=86400 về 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.yaml

Nế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 envoy

Kiể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.

Cấu Hình Envoy Proxy Làm Edge Gateway Hỗ Trợ HTTP/3 Và gRPC-Web Cho Microservices Trên VPS Ubuntu | DPTCloud