Mình đã giới thiệu với các bạn cách xây dựng một API Gateway sử dụng Zuul Proxy của Spring Cloud Netflix. Trong bài viết này, mình giới thiệu với các bạn một cách khác, sử dụng một thư viện khác trong hệ sinh thái Spring framework, đó là Spring Cloud Gateway các bạn nhé!
Nói nôm na về nguyên tắc hoạt động của một API Gateway thì nó sẽ cho phép chúng ta có thể cấu hình để khi một request tới nó thì đối với request này, nó sẽ forward request tới service này, còn request kia nó sẽ forward cho service kia. Spring Cloud Gateway cũng có chức năng như vậy. Spring Cloud Gateway hỗ trợ chúng ta các filter, giúp chúng ta có thể thay đổi một request bất kỳ tới các service bên trong như thêm request parameter, thay đổi request URL, thêm header này nọ, … Chúng ta có thể thêm mới các custom filter, nghĩa là các bạn có thể viết code Java, để thêm bất kỳ các logic xử lý khác trước khi một request thực sự được forward đến target service.
Spring Cloud Gateway cũng hỗ trợ Service Discovery giống như Zuul Proxy của Spring Cloud Netflix. Nhưng trong bài viết này, để đơn giản cho các bạn có một cái nhìn overview về cách Spring Cloud Gateway làm việc, mình sẽ chỉ tạo mới một ví dụ với một project sử dụng Spring Cloud Gateway đóng vai trò là API Gateway và một project khác đóng vai trò là service mà chúng ta cần gọi tới.
Đầu tiên, mình sẽ tạo mới một Spring Boot project implement service mà các bạn cần gọi tới với một API có nội dung như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com.huongdanjava.springcloudgateway.serviceexample; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class SpringCloudGatewayServiceExampleApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudGatewayServiceExampleApplication.class, args); } @GetMapping("/hello") public String hello() { return "Hello !!!"; } } |
Kết quả:
Tiếp theo, mình cũng sẽ tạo mới một Spring Boot project với Spring Cloud Gateway dependency để làm API Gateway.
Kết quả của mình như sau:
Để cấu hình các service trong Spring Cloud Gateway, chúng ta có 2 cách: sử dụng các properties hoặc sử dụng code Java được cung cấp bởi Spring Cloud Gateway. Trong bài viết này, mình sẽ hướng dẫn các bạn sử dụng các properties các bạn nhé!
Các bạn nên sử dụng file application.yaml, sẽ dễ hơn cho việc cấu hình này.
Chúng ta sẽ sử dụng một bộ với ít nhất các properties sau để cấu hình cho một service:
1 2 3 4 5 6 7 8 |
spring: cloud: gateway: routes: - id: <service_name> uri: <service_uri> predicates: - Path=<context_path> |
Chúng ta có thể định nghĩa nhiều service, tương ứng với mỗi service là một phần tử trong routes với định nghĩa id để định danh service, uri là thông tin host, port và predicates là danh sách các request mà API Gateway sẽ catch up và forward request từ người dùng đến service đó. Ví dụ như:
1 2 3 4 5 6 7 8 9 10 11 12 |
spring: cloud: gateway: routes: - id: <service1_name> uri: <service1_uri> predicates: - Path=<context_path> - id: <service2_name> uri: <service2_uri> predicates: - Path=<context_path> |
Trong ví dụ của mình, các bạn có thể cấu hình thông tin service trên trong API Gateway như sau:
1 2 3 4 5 6 7 8 |
spring: cloud: gateway: routes: - id: exampleService uri: http://localhost:8080/ predicates: - Path=/hello |
Vì service trong ví dụ này đã chạy ở port 8080 nên mình sẽ cấu hình cho API Gateway chạy ở port 9080.
Chạy cả 2 API Gateway và service, sau đó request tới API Gateway với request http://localhost:9080/hello, các bạn cũng thấy kết quả như trên: