Phân tích kiến trúc và cấu hình định tuyến trong Spring Cloud Gateway

Spring Cloud Gateway hoạt động dựa trên ba thành phần cốt lõi: Route (Tuyến đường), Predicate (Điều kiện khớp) và Filter (Bộ lọc). Việc hiểu rõ cơ chế tương tác giữa các thành phần này là chìa khóa để thiết kế một hệ thống gateway hiệu quả.

1. Cấu trúc cơ bản của Gateway

Route (Tuyến đường) Đây là đơn vị xây dựng cơ bản nhất. Mỗi route bao gồm một ID duy nhất, URI đích đến, cùng với tập hợp các điều kiện khớp (predicates) và bộ lọc (filters). Khi một yêu cầu HTTP đi vào, nếu thỏa mãn tất cả các điều kiện khớp của một route cụ thể, yêu cầu đó sẽ được chuyển tiếp theo định nghĩa của route này.

Predicate (Điều kiện khớp) Lấy cảm hứng từ java.util.function.Predicate trong Java 8, thành phần này cho phép định nghĩa các quy tắc logic để xác định xem một yêu cầu có nên được xử lý bởi route hiện tại hay không. Các điều kiện có thể dựa trên nhiều thuộc tính của request như Header, tham số truy vấn (query parameters), hoặc đường dẫn URL (Path). Nếu kết quả đánh giá trả về true, quá trình định tuyến sẽ diễn ra.

Filter (Bộ lọc) Dựa trên giao diện GatewayFilter của Spring Framework, bộ lọc can thiệp vào quá trình xử lý request trước khi nó được gửi đến dịch vụ đích hoặc sau khi nhận phản hồi. Chức năng chính bao gồm biến đổi dữ liệu, thêm/xóa header, ghi log, hoặc thực hiện các thao tác bảo mật.

2. Cơ chế Định tuyến Động (Dynamic Routing)

Thay vì hard-code địa chỉ IP hoặc cổng của các microservice, Spring Cloud Gateway tích hợp chặt chẽ với Service Discovery (như Eureka hoặc Consul). Khi bật tính năng này, Gateway tự động tạo các route dựa trên tên dịch vụ đăng ký trong registry. Điều này giúp giảm thiểu cấu hình thủ công và tăng khả năng mở rộng.

Dưới đây là ví dụ cấu hình YAML minh họa việc kích hoạt định tuyến động và xác định các rule cụ thể:

server:
  port: 9527

spring:
  application:
    name: api-gateway-service
  cloud:
    gateway:
      # Bật tính năng tự động tạo route từ danh sách dịch vụ đã đăng ký
      discovery:
        locator:
          enabled: true 
      routes:
        - id: order-processing-route
          # Sử dụng scheme 'lb' để chỉ định Load Balancer
          uri: lb://order-service-cluster
          predicates:
            - Path=/api/v1/orders/**   # Chỉ những request có path bắt đầu bằng /api/v1/orders/ mới khớp
        
        - id: user-profile-route
          uri: lb://user-management-service
          predicates:
            - Path=/api/v1/users/profile/**

eureka:
  client:
    service-url:
      defaultZone: http://registry-server:8761/eureka/

Trong cấu hình trên, tiền tố lb:// đóng vai trò quan trọng. Nó báo hiệu cho Gateway sử dụng cơ chế cân bằng tải (Load Balancing) để chọn một instance cụ thể từ nhóm dịch vụ mục tiêu, thay vì gọi trực tiếp tới một địa chỉ tĩnh. Mặc định, chiến lược phân phối thường là Round-Robin (vòng tròn).

3. Chi tiết về Predicate và Logic Kết hợp

Mục đích chính của Predicate là ánh xạ các mẫu request phức tạp sang các route tương ứng. Ngoài việc khớp đường dẫn (Path), Spring Cloud Gateway cung cấp nhiều loại predicate khác nhau để kiểm tra các điều kiện kỹ thuật sâu hơn.

Ví dụ về cấu hình predicate khớp với method GET và tồn tại một header cụ thể:

predicates:
  - Method=GET
  - Header=X-Request-Id, \d+

Các interface Predicate thường cung cấp các phương thức mặc định để kết hợp nhiều điều kiện lại với nhau thông qua các toán tử logic như AND, OR, NOT. Điều này hữu ích trong việc xác thực dữ liệu đầu vào hoặc phân luồng traffic dựa trên phiên bản API (ví dụ: phân biệt request cũ và mới).

4. Ứng dụng và Quy tắc của Filter

Filters được áp dụng theo thứ tự ưu tiên. Nếu có nhiều filter được khai báo cho một route, chúng sẽ được thực thi tuần tự. Dưới đây là bảng tổng hợp một số filter phổ biến dùng để biến đổi request/response:

Tên Filter Ví dụ Cấu hình Mô tả chức năng
PrefixPath - PrefixPath=/internal Thêm prefix /internal vào phía trước đường dẫn gốc. Ví dụ: /data trở thành /internal/data.
RewritePath - RewritePath=/old/(?.*), /new/${path} Ghi đè toàn bộ đường dẫn request. Thường dùng để map API version cũ sang mới mà không cần sửa code phía client.
SetPath - SetPath=/tenant/{id}/resource Thay thế đường dẫn bằng một template, cho phép chèn biến từ URI gốc vào vị trí {id}.
AddRequestHeader - AddRequestHeader=X-Gateway-ID, GW-01 Chèn một cặp Key-Value vào Header của request gửi tới backend service.

Lưu ý rằng việc sắp xếp thứ tự các filter rất quan trọng. Một filter "Add Request Header" phải chạy trước filter "Authorization" nếu bộ phận xác thực phụ thuộc vào header vừa được thêm vào. Ngược lại, các filter xử lý response (như nén gzip) thường nằm ở giai đoạn cuối cùng của chuỗi xử lý.

Thẻ: Spring Cloud Gateway Microservices Dynamic Routing Predicate filter

Đăng vào ngày 3 tháng 10 lúc 12:26