2. API Design & Response Standard
2.1. Mục tiêuTiêu chương
Chương
Chương này quy định cấu trúc chuẩn của mỗi moduleintegration flow và trách nhiệm của từng artifact layer nhằm:
Tách biệt rõ ràng các tầng xử lý
trong luồng tích hợpGiảm phụ thuộc giữa các thành phần
artifactDễ bảo trì, mở rộng và
kiểm thử từng layer độc lậptestĐảm bảo tính nhất quán giữa các
moduleflow trong toàn hệ thống
2.2. Khái niệmNiệm / phạmPhạm viVi ápÁp dụng
Dụng
Quy tắc này áp dụng cho:
Tất cả các
moduleintegration flow trong thư mụcmodules/artifacts/**Cả Core Team và Partner Team
Tất cả các
chứcluồngnăngtích hợp mới được phát triển
Cấu trúcTrúc chuẩnArtifact mỗi module
Chuẩn
modules/<module-name>/
integration controller/flow
service/
repository/
entity/
dto/
Ý nghĩa từngcác thành phần
Ý Nghĩa Từng Artifact Layer
| Layer | Artifact | Vai trò |
| Ví dụ |
||
|---|---|---|---|---|---|---|
| API
|
apis/*.xml |
Nhận request từ client và trả |
PlanningDirectApi.xml |
|||
| Mediation
|
sequences/*-inboundSequence.xml |
Xử lý logic, điều phối luồng |
|
|
||
| Error
|
sequences/*-inboundErrorSequence.xml |
Xử lý và cô lập lỗi |
|
Load_balance_example-inboundErrorSequence.xml |
||
| Consumer
|
inbound-endpoints/*.xml |
Nhận message từ Kafka topic |
|
|
||
| Connection
|
local-entries/*.xml |
Cấu hình kết nối dùng chung |
|
|||
| Endpoint Layer | endpoints/*.xml |
Định |
Backend
|
2.3. Quy địnhĐịnh chínhChính
Trách Nhiệm Từng Layer
TráchAPI nhiệmLayer từng layer(apis/)
Controller
Nhận request HTTP từ client
(hoặc từ WSO2 APIM Gateway)
Gọi servicebackend tươngtrực ứng
tiếp hoặc publish message lên Kafka
Trả response chuẩn về client
Không xử lý logic nghiệp vụ
Service
Xử lý logic nghiệp vụ
Điều phối repository
Chuyển đổi entity ↔ DTO
Repository
Truy cập database
Thực hiện các thao tác CRUD
Không chứa logic nghiệp vụ
Entity
Mapping với bảng database
Không chứa logic nghiệp vụ phức tạp
DTO
Mediation Layer (sequences/*-inboundSequence.xml)
- Xử
Modellý message nhận từ Kafka consumer
- Điều phối lời gọi đến backend API
- Phân loại kết quả theo HTTP status code (2xx / 4xx / 5xx)
- Publish kết quả vào
processed_topic hoặc error_topic
- Không xử lý lỗi kỹ thuật (dành cho
request/response
Error
Không gắn trực tiếp với entity
Layer)
Error Layer (sequences/*-inboundErrorSequence.xml)
- Bắt lỗi kỹ thuật khi consume message từ Kafka
- Log đầy đủ thông tin:
ERROR_CODE, ERROR_MESSAGE, ORIGINAL_PAYLOAD
- Đóng gói và publish message lỗi vào
error_topic
- Không retry — chỉ ghi nhận và chuyển sang error topic
Consumer Layer (inbound-endpoints/)
- Kết nối đến Kafka broker và subscribe topic
- Khai báo
sequence (luồng thành công) và onError (luồng lỗi)
- Không chứa logic xử lý
Connection Layer (local-entries/)
- Lưu thông tin kết nối Kafka dùng chung toàn hệ thống
- Chỉ Core Team được phép chỉnh sửa
Quy tắcTắc bắtBắt buộc
- Buộc
apis/)Nhận request HTTP từ client
Gọi servicebackend tươngtrực ứng
Trả response chuẩn về client
Không xử lý logic nghiệp vụ
Xử lý logic nghiệp vụ
Điều phối repository
Chuyển đổi entity ↔ DTO
Truy cập database
Thực hiện các thao tác CRUD
Không chứa logic nghiệp vụ
Mapping với bảng database
Không chứa logic nghiệp vụ phức tạp
sequences/*-inboundSequence.xml)Modellý message nhận từ Kafka consumer
processed_topic hoặc error_topicError
Không gắn trực tiếp với entity
sequences/*-inboundErrorSequence.xml)ERROR_CODE, ERROR_MESSAGE, ORIGINAL_PAYLOADerror_topicinbound-endpoints/)sequence (luồng thành công) và onError (luồng lỗi)local-entries/)- Buộc
Controller API Layer không được chứa logic nghiệp vụ
phức tạp
Mọi
Khôngresponse trả trựcvề tiếpclient Entityphải ratheo cấu trúc JSON chuẩn
Error sequence phải luôn publish message vào error_topic
Mediation sequence phải phân loại HTTP status (2xx / 4xx / 5xx)
Cấu Trúc Response Chuẩn
Thành công:
Thành công kèm data:
Lỗi từ API
Layer:
Lỗi Luônthuật dùng(Error DTOSequence choghi request/response
vào error_topic):
Response chuẩn toàn hệ thống: ApiResponse<T>
2.4. Cách Thực Hiện / Quy Trình
Quy Trình Phát Triển Một Integration Flow Mới
Bước 1: Khai báo Connection (nếu chưa có)
Tạo hoặc tái sử dụng
Chỉ Core Team thực hiện /bước quy trình
Quy trình phát triển một chức năng mới
Bước 1: Tạo DTOnày.
Ví dụ:
UserCreateRequest
UserResponse
Bước 2: Tạo EntityInbound Endpoint
MappingTạo vớifile bảng database:inbound-endpoints/<flow-name>.xml:
UserEntity
Bước 3: Tạo RepositoryError Sequence
UserRepositoryTạo file sequences/<flow-name>-inboundErrorSequence.xml:
Bước 4: Tạo ServiceInbound Sequence
UserServiceTạo file sequences/<flow-name>-inboundSequence.xml:
Xử lý logic:
Validate dữ liệuGọi repositoryMapping entity → DTO
Bước 5: Tạo ControllerAPI (nếu cần điểm vào HTTP)
UserControllerTạo file apis/<flow-name>Api.xml:
Nhận requestGọi service
2.5. Ví dụ minh họa
Ví dụ sai (vi phạm quy tắc)
Controller chứa logic:
@GetMapping("/users")
public List<UserEntity> getAll() {
returnVí userRepository.findAll();Dụ Đúng — Inbound Sequence phân loại HTTP Status
}Đúng vì:
Ví Dụ Đúng — Error Sequence đóng gói lỗi chuẩn
Ví Dụ Sai — Không phân loại HTTP Status
Sai vì:
Trả Entity trực tiếpKhông dùng ServiceKhông dùng ApiResponse
Ví dụ đúng
@GetMapping("/users")
public ApiResponse<List<UserResponse>> getAll() {
return ApiResponse.ok(userService.getAll());
}
Service:
public List<UserResponse> getAll() {
return userRepository.findAll()
.stream()
.map(this::toResponse)
.toList();
}
Ví Dụ Sai — API trả về raw data không theo chuẩn
Sai vì:
[Chỗ này thêm ảnh: Screenshot log WSO2 MI cho thấy STATUS, HTTP_STATUS, PAYLOAD được log đúng chuẩn]
2.6. Checklist ápÁp dụngDụng
Trước khi commit moduleintegration flow mới:
- liệu
Cónàyđủ:
thuộc phạm vi quản lý của Core Team — mọi thay đổi phải được Core Team phê duyệt. controller/service/repository/entity/dto/Controller không chứa logic nghiệp vụKhông trả Entity ra APITất cả API trả về ApiResponse<T>DTO tách biệt với Entity
Tài

