Khoá học ngắn về API gateway

Envoy, Kong và OpenResty đặt cạnh nhau

Ba gateway này làm cùng hai việc: chọn một route cho mỗi request, rồi ghép đường dẫn gửi lên backend. Khoá học đưa cho cả ba đúng cùng một cấu hình, gửi đúng cùng những đường dẫn, và ghi lại chỗ ba bên trả lời khác nhau. Không so cái nào tốt hơn — chỉ đo xem chuyển từ cái này sang cái kia thì cái gì đổi.

Hai bài, hai chỗ khác nhau đáng nhớ Cùng một mẫu regex /b$: Envoy khớp mỗi /b, Kong cũng vậy, nhưng OpenResty khớp cả /a/b — ba ngữ nghĩa regex khác nhau trên cùng một chuỗi. Và cùng ý định “bỏ tiền tố”, Envoy với OpenResty gửi lên backend //x/y còn Kong gửi /x/y.

Lộ trình

Mỗi bài khoảng 12–15 phút đọc, kèm phòng thí nghiệm chạy ngay trên trình duyệt.

Cách đo

Bốn container trên một mạng Docker: một backend nginx trả về đúng $request_uri nó nhận được, và ba gateway cùng trỏ vào đó. Mọi con số trong khoá là một lần curl thật qua một trong ba gateway, không có thư viện client nào ở giữa.

docker network create apilab
docker run -d --name apilab-echo   --network apilab nginx:1.27-alpine
docker run -d --name apilab-envoy  --network apilab envoyproxy/envoy:v1.31-latest …
docker run -d --name apilab-kong   --network apilab -e KONG_DATABASE=off kong:3.9
docker run -d --name apilab-or     --network apilab openresty/openresty:alpine

Phần lớn cấu hình được viết thành từng cặp hai thứ tự ngược nhau, để tách phần do gateway sắp xếp khỏi phần do thứ tự viết. Đây là cách duy nhất phát hiện ra rằng Envoy không sắp lại gì trong khi hai gateway kia đều sắp.

Hai engine JavaScript trong khoá được đối chiếu lại với chính những số liệu đó: bộ chọn route khớp 74/74 kết quả curl, bộ ghép đường dẫn khớp 16/16.

Có chỗ không đoán được, và khoá nói thẳng Khi hai regex cùng mức ưu tiên chồng nhau, Kong vẫn chọn ra một cái — nhưng cái nào thì không suy ra được từ thứ tự viết lẫn độ dài mẫu, đo hai chiều đều thế. Tương tự với hai route trùng mẫu: nginx từ chối khởi động, còn Envoy và Kong im lặng chọn một cái theo hai quy tắc khác nhau. Bài 1 dành hẳn một mục cho những chỗ như vậy thay vì lờ đi.