Mỗi microservice phát triển bằng Spring Boot được tổ chức thành các thành phần cơ bản sau:
• Lớp điều khiển (controller): có nhiệm vụ đóng gói các API để kết xuất ra
bên ngoài cho các đối tượng sử dụng. Lớp này đón nhận các yêu cầu từ phía người dùng, tương tác với lớp dịch vụ và gửi trả lại dữ liệu cho người dùng thông qua REST API.
• Lớp dịch vụ (service): có nhiệm vụ đóng gói các logic nghiệp vụ của bài
toán dựa trên các quy tắc về nghiệp vụ. Nó thực hiện tương tác với kho lưu trữ để lấy dữ liệu và xử lý tập dữ liệu đó theo từng yêu cầu cụ thể. Một số tác vụ khác như kiểm tra tính hợp lệ của dữ liệu theo các quy tắc nghiệp vụ cũng có thể được thực hiện tại tầng này.
• Kho lưu trữ (repository): thực hiện tác vụ kết nối và tương tác với cơ sở dữ
liệu để truy xuất hoặc lưu trữ dữ liệu. Để thực hiện các yêu cầu này, kho lưu trữ sẽ phải liên kết với lớp thực thể. Trong ứng dụng Spring Boot, mỗi kho lưu trữ có thể được triển khai bằng Spring Data JPA33 hoặc dùng kết hợp với một số ORM framework khác như Hibernate34 hoặc MyBatis35.
• Lớp thực thể (entity): mỗi entity được gọi là lớp thực thể đại diện cho một
đối tượng cần quản lý trong miền nghiệp vụ của bài toán. Các thực thể này sẽ được ánh xạ với từng bảng trong cơ sở dữ liệu thông qua kỹ thuật ORM.
• Bộ lọc (filter): mỗi filter được gọi là một bộ lọc, nó đóng vai trò như một
thành phần trung gian thực hiện việc tiền xử lý các yêu cầu từ phía người dùng trước khi chúng được gửi tới lớp điều khiển.
• Thành phần “Bean Factory”: có chức năng quản lý việc khởi tạo các đối
tượng cũng như kiểm soát vòng đời hoạt động của các đối tượng trong ứng dụng.
• Thành phần “Bean Configuration”: được dùng để quản lý cấu hình các đối
tượng (beans) trong ứng dụng, ví dụ quản lý thông tin nguồn dữ liệu (data source), quản lý các thành phần để ánh xạ, chuyển đổi dữ liệu (object mapper) và bất cứ đối tượng nào do lập trình viên tự định nghĩa.
33 https://spring.io/projects/spring-data-jpa 34 https://hibernate.org/
51
• Thành phần “DTO” (Data Transfer Object)36: thực hiện việc trung chuyển dữ liệu giữa các tầng, người ta sử dụng các DTO. Mỗi một DTO có nhiệm vụ đóng gói dữ liệu từ tầng nghiệp vụ để kết xuất ra cho phía người dùng. Như vậy, bằng cách phân lớp như trên, mỗi một microservice được chia tách thành các gói riêng biệt. Các thành phần bên trong ứng dụng sẽ được gắn kết với nhau thông qua cơ chế “tiêm sự phụ thuộc” (DI37). Với cách tổ chức này, mỗi microservice đảm bảo được tính đơn nhiệm, độc lập và làm giảm sự phụ thuộc chặt giữa các thành phần. Tổng quan về các thành phần và mối quan hệ giữa chúng trong một microservice được mô tả trong hình 3.8.
Hình 3.8. Kiến trúc tổng thể của một microservice