Predicate trong ngữ cảnh Java 8 là một hàm biểu diễn điều kiện mang giá trị đúng/sai, nhận một tham số đầu vào và trả về kết quả kiểu boolean. Giao diện này cung cấp nhiều phương thức mặc định để kết hợp các điều kiện phức tạp như AND, OR, NOT. Trong Spring Cloud Gateway, cơ chế Predicate được tận dụng triệt để để thiết lập các quy tắc định tuyến linh hoạt dựa trên các thuộc tính của yêu cầu HTTP.
1. Phân tích theo khoảng thời gian
Spring Cloud Gateway hỗ trợ ba loại điều kiện thời gian: Before, After, và Between. Việc so sánh thời gian sử dụng lớp ZonedDateTime của Java 8, cho phép xác định vùng giờ cụ thể. Ví dụ với múi giờ Trung Quốc: Asia/Shanghai.
- Before: Chỉ định tuyến nếu thời gian yêu cầu nằm trước mốc thời gian đã cho.
- After: Chỉ xử lý yêu cầu sau thời điểm chỉ định.
- Between: Yêu cầu phải nằm trong khoảng thời gian xác định mới được chuyển tiếp.
Cấu hình mẫu:
spring:
cloud:
gateway:
routes:
- id: time_route
uri: http://localhost:2001/
predicates:
- Path=/api/timecheck
- Between=2024-01-01T00:00:00+08:00[Asia/Shanghai], 2024-12-31T23:59:59+08:00[Asia/Shanghai]
Khi thời gian hiện tại ngoài khoảng này, yêu cầu sẽ bị từ chối với mã lỗi 404.
2. Phân tích dựa trên Cookie
Điều kiện Cookie yêu cầu hai tham số: tên cookie và biểu thức chính quy (regex) để kiểm tra giá trị. Nếu cookie trong yêu cầu khớp với cả tên và mẫu regex, tuyến đường sẽ được kích hoạt.
predicates:
- Path=/api/user
- Cookie=sessionId, s-[a-z]+
Thử nghiệm bằng lệnh curl:
curl http://localhost:8080/api/user --cookie "sessionId=s-authenticated"
→ Thành công. Trong khi đó, thiếu cookie hoặc không khớp mẫu sẽ dẫn đến 404.
3. Kiểm tra tiêu đề HTTP (Header)
Sử dụng Header để kiểm tra sự tồn tại và giá trị của một trường trong header theo biểu thức chính quy.
predicates:
- Path=/api/data
- Header=User-Agent, .*Chrome.*
Ví dụ trên chỉ cho phép các trình duyệt có User-Agent chứa "Chrome".
4. Định tuyến theo tên miền (Host)
Điều kiện Host dùng mẫu Ant-style với ký tự * hoặc ** để đại diện cho phần tên miền.
predicates:
- Path=/api/service
- Host=**.example.com
Yêu cầu cần có header Host: api.example.com hoặc sub.example.com mới được định tuyến. Thiếu hoặc sai host đều dẫn đến lỗi 404.
5. Phân biệt theo phương thức HTTP
Dùng Method để giới hạn tuyến đường chỉ chấp nhận một số phương thức nhất định như GET, POST, v.v.
predicates:
- Path=/api/submit
- Method=POST
Một yêu cầu GET tới cùng địa chỉ sẽ không khớp và bị từ chối.
6. So khớp đường dẫn URL (Path)
Path là điều kiện phổ biến nhất, dùng để kiểm tra đường dẫn yêu cầu theo mẫu URI, hỗ trợ ký tự đại diện.
predicates:
- Path=/api/v1/**, /api/v2/users
Hỗ trợ nhiều mẫu, cách nhau bằng dấu phẩy.
7. Kiểm tra tham số truy vấn (Query Parameter)
Điều kiện Query giúp lọc yêu cầu dựa trên tham số trong URL.
- Kiểm tra sự tồn tại:
- Query=debug
→ Bất kỳ URL nào có ?debug=... đều khớp.
- Query=code, c\d{3}
→ Chỉ chấp nhận tham số code có dạng c123, c456, v.v.
- Query=action, save
- Query=version, v[1-2]
→ Yêu cầu phải có cả hai tham số và giá trị phù hợp.
8. Lọc theo địa chỉ IP nguồn (Remote Address)
Dùng RemoteAddr để giới hạn truy cập theo dải IP, hỗ trợ định dạng CIDR (IPv4 hoặc IPv6).
predicates:
- Path=/admin
- RemoteAddr=192.168.1.0/24
Chỉ những máy trong mạng nội bộ 192.168.1.x mới được phép truy cập tuyến đường admin.
9. Kết hợp nhiều điều kiện (Predicate Chaining)
Các điều kiện trong cùng một tuyến đường được kết hợp theo logic AND. Yêu cầu phải thỏa mãn toàn bộ thì tuyến đường mới được áp dụng.
predicates:
- Path=/secure/api
- Method=POST
- Header=Authorization, Bearer .*
- RemoteAddr=10.0.0.0/8
→ Đây là cách xây dựng các tuyến đường an toàn với nhiều lớp kiểm soát.
10. Xử lý trùng lặp tuyến đường
Khi một yêu cầu khớp với nhiều định nghĩa tuyến đường, hệ thống sẽ chọn **tuyến đường đầu tiên** trong cấu hình mà nó khớp. Thứ tự khai báo vì vậy rất quan trọng để đảm bảo hành vi định tuyến mong muốn.