Tài liệu API tập trung trong microservice sử dụng SpringBoot, SpringFox Swagger-UI và Eureka

Tram Ho

Bài viết hướng dẫn cách để dễ dàng document nhiều Spring-based REST application bằng cách sử dụng thư viện SpringFox Swagger-UI trong môi trường microservices

1. Problem

Như các bạn đã biết, rất dễ dàng để có thể document một ứng dụng Spring REST Service bằng cách sử dụng thư viện SpringFox Swagger-UI, nhưng có một vấn đề phát sinh khi làm việc trong môi trường nơi mà chúng ta có rất nhiều REST application mà tiêu biểu là môi trường microservices. Hầu hết chúng ta đều quản lý một Swagger-UI riêng biệt cho từng service, điều đó có nghĩa là mỗi service sẽ cần có một endpoint riêng để truy cập Swagger-UI và chúng ta phải có các URL khác nhau cho các service khác nhau.

2. Giải pháp

Để có thể truy cập tất cả các API document từ một URL duy nhất chúng ta có thể implement theo solution như sau:

  1. Truy xuất tất cả danh sách services đã được đăng ký từ service registry, ở đây là Eureka server
  2. Với mỗi service đã được đăng ký, pull Swagger Definition JSON về centralized API document service và chứa nó trong local. Cụ thể ở đây sẽ sử dụng Concurrent Map để lưu JSON trong local memory
  3. Refresh in-memory context định kỳ để tự động cập nhật JSON definition khi các service được thêm mới, cập nhật, hoặc xóa bỏ khỏi service registry
  4. Cung cấp một endpoint duy nhất để truy cập centralized API document service, nơi tập trung tất cả API document của toàn bộ service trong hệ thống

singleswagger.png

3. Implementation

Ví dụ chúng ta có một hệ thống microservices gồm 2 services chính là Person Service và Employee Service. Bây giờ hãy cùng implement một document service để tập trung tất cả API document từ Person Service và Employee Service. Mô hình dịch vụ sẽ trông như sau:
solution.png

  1. central-docs-eureka-server: Service registry cung cấp bởi Netflix Eureka
  2. employee-service và person-service: 2 REST service chính đã được tích hợp Swagger-UI
  3. documentation-service: service thu thập tất cả API document từ các service khác và cung cấp Document UI với một endpoint duy nhất

final.png

3.1 SwaggerUIConfiguration

Lớp cấu hình Spring đăng ký phiên bản của SwaggerResourcesProvider, lớp này đọc các tệp JSON swagger-api từ ServiceDefinitionsContext

3.2 ServiceDefinitionController

Bổ sung API trả về thông tin JSON definition theo service id từ ServiceDefinitionsContext

3.3 ServiceDefinitionsContext

Component lưu trữ tất cả JSON definition trong memory

3.4 ServiceDescriptionUpdater

Đây là component quan trọng nhất, component này có nhiệm vụ pull tất cả JSON definition từ các service đã được đăng ký trên service registry và lưu trữ chúng trong ServiceDefinitionsContext

4. Tổng kết

Tất cả source code trong bài viết có thể tìm tại Github

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo