Xây dựng API Gateway cho ứng dụng web sử dụng Zuul Proxy của Spring Cloud Netflix

API Gateway là một khái niệm được sử dụng để gọi tên một ứng dụng, là nơi mà các ứng dụng bên ngoài sẽ phải gọi tới để gọi tới một ứng dụng nào đó của hệ thống bên trong. API Gateway sẽ nắm giữ thông tin của các ứng dụng bên trong và tuỳ theo request của người dùng mà nó sẽ forward request đó tới đúng ứng dụng mà chúng ta cần. Chúng ta có nhiều cách khác nhau để hiện thực một ứng dụng API Gateway, nếu ứng dụng của bạn đang sử dụng Spring Cloud Netflix thì hãy sử dụng Zuul Proxy. Trong bài viết này, mình sẽ hướng dẫn các bạn sử dụng Zuul Proxy để tạo API Gateway các bạn nhé!

Điều đầu tiên mình cần nói với các bạn về Zuul Proxy là: Zuul Proxy là một phần của Zuul, một thư viện về routing và server load balancer của Netflix. Nó sẽ cấu hình service id của các service trong Eureka Server với context path tương ứng của service id đó, expose một URL để các ứng dụng bên ngoài có thể access tới, sau đó dựa vào context path mà các ứng dụng đang request tới để forward request tới đúng ứng dụng bên trong.

Để các bạn hiểu rõ hơn, mình sẽ làm một ví dụ sử dụng Eureka Server mà mình đã tạo trong bài viết này sử dụng Spring Cloud Netflix cùng với service “Eureka Client Example” ở bài viết này. Để minh hoạ, mình sẽ thêm một request URL đơn giản “/hello” vào service “Eureka Client Example” như sau:

Kết quả:

Xây dựng API Gateway cho ứng dụng web sử dụng Zuul Proxy của Spring Cloud Netflix

Lúc này, nếu các bạn start ứng dụng này lên, các bạn sẽ thấy thông tin trong Eureka Server như sau:

Xây dựng API Gateway cho ứng dụng web sử dụng Zuul Proxy của Spring Cloud Netflix

OK, giờ mình sẽ tạo một ứng dụng API Gateway cho service “Eureka Client Example” sử dụng Zuul với Eureka Client như sau:

Xây dựng API Gateway cho ứng dụng web sử dụng Zuul Proxy của Spring Cloud Netflix

Việc sử dụng Eureka Client dependency giúp cho Zuul có thể lấy thông tin của các service trong Eureka Server các bạn nhé!

Kết quả:

Xây dựng API Gateway cho ứng dụng web sử dụng Zuul Proxy của Spring Cloud Netflix

Để enable Zuul Proxy cho project này, đầu tiên các bạn cần add annotation @EnableZuulProxy vào class SpringCloudZuulApplication như sau:

Tiếp theo, các bạn cần khai báo thông tin Eureka Server mà Zuul Proxy có thể lấy thông tin của service “Eureka Client Example” trong tập tin application.properties:

Property “eureka.client.fetchRegistry” rất quan trọng các bạn nhé, nó sẽ giúp cho Zuul có thể lấy được thông tin của các service trong Eureka Server.

Để Zuul Proxy có thể forward request từ người dùng tới service “Eureka Client Example”, chúng ta cần cấu hình cho service này trong tập tin application.properties của ứng dụng API Gateway như sau:

Trong đó eurekaclientservice trong property key dùng để phân biệt service này với các service khác. Giá trị “/eurekaclient/**” trong property “zuul.routes.eurekaclientservice.path” dùng để xác định những request bắt đầu với “/eurekaclient/” sẽ được API Gateway forward tới “Eureka Client Example” các bạn nhé!

Bây giờ nếu chạy API Gateway rồi request tới URL “http://localhost:8085/eurekaclient/hello”, các bạn sẽ thấy kết quả tương tự như khi chúng ta request tới service “Eureka Client Example” như sau:

Xây dựng API Gateway cho ứng dụng web sử dụng Zuul Proxy của Spring Cloud Netflix

Trong trường hợp các bạn muốn giữ prefix path của property “zuul.routes.eurekaclientservice.path” thì các bạn cần khai báo thêm property “zuul.routes.eurekaclientservice.strip-prefix” như sau:

Lúc này các bạn có thể request tới Zuul với request “http://localhost:8085/hello” như sau:

Xây dựng API Gateway cho ứng dụng web sử dụng Zuul Proxy của Spring Cloud Netflix

Nếu các bạn có nhiều service và muốn cấu hình một context path chung cho tất cả các service thì có thể cấu hình trong tập tin application.properties một property của Zuul là zuul.prefix với giá trị là context path chung đó.

Nếu bây giờ mình cấu hình context path chung cho tất cả các service trong ví dụ trên là /huongdanjava như sau:

thì kết quả sẽ là:

Xây dựng API Gateway cho ứng dụng web sử dụng Zuul Proxy của Spring Cloud Netflix

6 thoughts on “Xây dựng API Gateway cho ứng dụng web sử dụng Zuul Proxy của Spring Cloud Netflix

  1. Trong zuul Proxy này có thể handle security không anh. Kiểu là phải xác thực trước rồi mới chạy qua 1 service khác, không xác thực thì k được vào

  2. Em muốn người dùng chỉ có thể truy cập api service thông qua getway , mà ko thể đi trực tiếp qua api thì làm ntn v anh ,
    VD : localhost:8080/hello chỉ có thể truy cập được thông qua getway localhost:8085/hello

Add Comment