Nội dung chi tiết
1. Tổng quan kiến trúc hệ thống
1.1. MụcGiới tiêu kiến trúc
Kiến trúc backend được thiết kế nhằm:
Đảm bảo khả năng mở rộng và bảo trì lâu dàiTách biệt rõ trách nhiệm giữa các layerChuẩn hóa cách tổ chức code giữa các moduleHỗ trợ phát triển song song nhiều developerDễ dàng tích hợp các hệ thống ngoài (SSO, Cache, MQ…)
Tất cả các service backend phải tuân thủ kiến trúc chuẩn được định nghĩa trong tài liệu này.
1.2. Mô hình kiến trúc
Thiệu
Hệ thống backendđược xây dựng theo mô hình Enterprise Service Bus (ESB) kết hợp API Management (APIM), sử dụng nền tảng LifeESB làm trung gian điều phối giữa Client và các Backend Service. Tích hợp thêm Apache Kafka để xử lý tải lớn theo mô hình:hình bất đồng bộ.
ModularTênMonolithhệ–thống:LayeredLifeESBArchitectureAPIM: API Manager Message Queue: Apache Kafka (Broker:hdp-master:9092)
Đặc
Một service Spring Boot deploy độc lậpBên trong chia module theo domainMỗi module có đầy đủ layer Controller → Service → RepositoryCó thể tách thành microservice khi cần
1.2.
Sơ đồĐồ tổngKiến thể:
Client (Web / Mobile / External System)
↓
Controller (API Layer)
↓
Service (Business Layer)
↓
Repository (Persistence Layer)
↓
DB
1.3. Các Thành Phần Chính
1.3.1. QuyAPIM tắc— phânAPI lớp (Layered Architecture)Manager
MỗiCổng modulevào phảiduy tuân thủ cấu trúc phân lớp sau:
1.3.1. Controller Layernhất (APISingle Layer)
Entry ChứcPoint) năng:
Nhận request HTTPValidate input DTOGọi service xử lýTrả response chuẩn
Quy định:
Không chứa business logicKhông truy cập DB trực tiếpKhông xử lý transactionKhông map entity
Ví dụ:
1.3.2. Service Layer (Business Layer)
Chức năng:
Chứacho toàn bộbusiness logicĐiều phối repositoryXử lý transactionMapping entity ↔ DTO
Quy định:
Không nhận HttpServletRequestKhông trả Entity ra ngoàiPhải qua DTO/ResponseTransaction đặt tại Service
Ví dụ:
1.3.3. Repository Layer (Persistence Layer)
Chức năng:
Truy cập DBQuery dữ liệuMapping ORM
Quy định:
Không chứa business logicKhông gọi serviceChỉ thao tác entity
Ví dụ:
1.3.4. Entity Layer
Chức năng:
Mapping bảng DBQuanhệORMthống.
Quy định:
Không chứa logic nghiệp vụKhông trả trực tiếp ra APIKhông dùng cho request/response
1.3.5. DTO Layer
Gồm:
Request DTOResponse DTO
Chức năng:
Trao đổi dữ liệu với clientTách biệt entity và API
Quy định:
Controller chỉ nhận/trả DTOKhông expose entity
1.3.6. Mapper Layer
Chức năng:
Chuyển đổi DTO ↔ Entity
Có thể dùng:
MapStructManual mapping
Quy định:
Không đặt trong controllerKhông đặt trong repository
1.4. Quy tắc phụ thuộc (Dependency Direction)
Dependency chỉ được phép đi theo một chiều:
Không được phép:
Repository gọi ServiceService gọi ControllerController gọi Repository trực tiếpDTO gọi Repository
Nguyên tắc:
Layer trên được gọi layer dướiLayer dưới không được gọi layer trên
1.5. Tổ chức module theo domain
Project được tổ chức theo domain thay vì technical layer toàn cục.
Cấu trúc chuẩn:
1.6. Tích hợp hệ thống ngoài
Backend có thể tích hợp các thành phần sau:
SSO / Identity ServerCache (Redis)Message QueueFile StorageExternal API
Quy tắc tích hợp:
Gọi qua ServiceKhông gọi trực tiếp từ ControllerTách client class riêng
Ví dụ:
1.7. Nguyên tắc kiến trúc bắt buộc
Tất cả backend service phải tuân thủ:
Không expose entity ra APIKhông viết business logic trong controllerKhông truy cập DB ngoài repositoryKhông phụ thuộc ngược layerTransaction đặt tại serviceMapping qua DTO
Vi phạm kiến trúc được xem là lỗi nghiêm trọng trong review code.
1.8. Khả năng mở rộng Microservice
Kiến trúc hiện tại cho phép tách module thành microservice khi cần:
Ví dụ:
1.9. Xử lý ngoại lệ toàn cục (Exception Handling Strategy)
1.9.1. Mục tiêu
Chuẩn hóa cơ chế xử lý lỗi toàn hệ thống nhằm:
Đảm bảo response lỗi thống nhất giữa các APIẨn thông tin nội bộ hệ thốngDễ dàng log và truy vết lỗiHỗ trợ frontend xử lý lỗi chính xácTránh trả lỗi không kiểm soát (stacktrace, SQL…)
Tất cả API backend phải sử dụng cơ chế xử lý ngoại lệ toàn cục.
1.9.2. Global Exception Handler
Hệ thống sử dụng Global Exception Handler thông qua @ControllerAdvice.
Chức năng:
Bắt tất cả exception phát sinh từ Controller / ServiceMapping exception → HTTP statusTrả response lỗi chuẩnGhi log lỗi hệ thống
Quy định:
Không xử lý lỗi trực tiếp trong ControllerKhông trả stacktrace ra clientKhông trả message DB/SQLKhông throw Exception chung chung
Ví dụ:
1.9.3. Mapping Exception → HTTP Status
Chuẩn mapping bắt buộc:
Không được trả:
200 với lỗi business500 với lỗi validation500 với not found
1.9.4. Chuẩn format response lỗi
Tất cả API khi lỗi phải trả format thống nhất:
Ý nghĩa:
| Mô tả | |
|---|---|
/v1, /v2) song song |
|
| Portal | Developer Portal để publish và subscribe API |
1.3.2. LifeESB
Lớp tích hợp trung gian, chịu trách nhiệm điều phối luồng dữ liệu.
| Thành phần | File | Chức năng |
|---|---|---|
| Sync API |
|
Gọi
|
| Async API |
|
Đẩy vào Kafka, trả phản hồi ngay cho |
| Inbound |
|
Lắng nghe
|
| Sequence |
|
Logic xử lý
|
| Error |
|
Xử lý lỗi Kafka, đẩy vào error_topic |
| Local Entry |
|
Cấu hình kết nối Kafka tái sử dụng |
1.3.3. Apache Kafka
Message Broker xử lý tải lớn và đảm bảo không mất dữ liệu.
| Topic | Mục đích |
|---|---|
test_topic_01 |
Nhận message từ API Producer (đầu vào) |
processed_topic |
Lưu message đã xử lý thành công |
error_topic |
Lưu message lỗi để review thủ công |
1.3.4. Backend Service
REST API xử lý nghiệp vụ thực tế.
| Thông tin | Giá trị |
|---|---|
| Base URL | http://192.168.0.133:8080 |
| Endpoint chính | POST /api/v1/plannings |
| Xác thực | JWT Bearer Token |
| Framework | Spring Boot |
1.4. Hai Mô Hình Dịch Vụ
1.4.1. Đồng Bộ — Synchronous (Direct API)
Client gọi và chờ kết quả từ Backend.
exceptionClient → APIM → LifeESB (PlanningDirectApi)
├──
ResourceNotFoundException │
├──
ValidationException ▼
├──
BusinessException Backend API [chờ response]
├──
SystemException │
▼
LifeESB → Client [trả kết quả thực]
VíĐặc dụ:điểm:


