TÀI LIỆU BÀN GIAO KỸ THUẬT DỰ ÁN LGSP SERVICE

Hệ thống trục liên thổng của tỉnh
Nền tảng: WSO2 Micro Integrator 4.4.0

CHƯƠNG I: TỔNG QUAN VÀ THIẾT KẾ HỆ THỐNG LGSP

Sơ bộ hệ thống LGSP

CHƯƠNG I: TỔNG QUAN VÀ THIẾT KẾ HỆ THỐNG LGSP

TRANG 1: Bối cảnh dự án và Tầm nhìn tích hợp

1.1. Hiện trạng và Thách thức

Trong kỷ nguyên số, các cơ quan nhà nước tại địa phương thường vận hành các hệ thống phần mềm độc lập (Silos). Điều này dẫn đến việc dữ liệu bị chia cắt, không đồng bộ và gây khó khăn cho người dân khi thực hiện thủ tục hành chính liên thông. Dự án LGSP (Local Government Service Platform) ra đời để giải quyết các nút thắt này.

1.2. Tầm nhìn của trục LGSP

CHƯƠNG I: TỔNG QUAN VÀ THIẾT KẾ HỆ THỐNG LGSP

TRANG 2: Công nghệ và Các thành phần lõi

2.1. Nền tảng WSO2 Micro Integrator (MI) 4.4.0

Hệ thống sử dụng WSO2 MI - một nền tảng mã nguồn mở mạnh mẽ nhất thế giới về ESB. Các ưu điểm chính:

2.2. Các thành phần phụ thuộc (Middleware)

CHƯƠNG I: TỔNG QUAN VÀ THIẾT KẾ HỆ THỐNG LGSP

TRANG 3: Phân tích bài toán liên thông LGSP - NGSP

3.1. Mô hình kết nối Liên thông Quốc gia (NGSP)

Dự án thực hiện vai trò là Gateway trung gian giữa Địa phương và Trung ương:

  1. Hướng đi lên (Upstream): Các app địa phương gọi API qua LGSP -> LGSP thực hiện ký số/xác thực -> Gửi lên NDXP/NGSP.
  2. Hướng đi xuống (Downstream): Dữ liệu từ các Bộ/Ngành gửi về qua NGSP -> LGSP tiếp nhận -> Phân phối về đúng phòng ban/sở ngành tương ứng.

3.2. Đảm bảo tính tin cậy tuyệt đối (Guaranteed Delivery)

Đối với văn bản điện tử (EDXML), hệ thống không chỉ gọi API mà còn thực hiện:

CHƯƠNG I: TỔNG QUAN VÀ THIẾT KẾ HỆ THỐNG LGSP

TRANG 4: Chi tiết Cơ sở dữ liệu vận hành (Core Schema)

Hệ thống yêu cầu các bảng dữ liệu sau trong ESB_DB để có thể vận hành các tính năng nâng cao:

4.1. Quản lý trạng thái Khóa (sync_lock)

Bảng này cực kỳ quan trọng để đảm bảo tính duy nhất của các tiến trình đồng bộ (Task).

4.2. Quản lý Lập lịch Task động (job_schedule)

Cho phép Admin cấu hình lịch chạy mà không cần sửa code WSO2.

CREATE TABLE `job_schedule` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `service_code` varchar(100) NOT NULL COMMENT 'Mã nghiệp vụ (Vd: DM_TTHC)',
  `cron_expression` varchar(50) NOT NULL COMMENT 'Ví dụ: 0 0 * * * ? (Chạy mỗi giờ)',
  `sequence_name` varchar(100) NOT NULL COMMENT 'Tên Sequence xử lý chính',
  `sync_endpoint_path` text COMMENT 'URL API đích',
  `last_run` datetime DEFAULT NULL COMMENT 'Lần chạy thành công cuối cùng',
  `status` tinyint(1) DEFAULT '1' COMMENT '1: Kích hoạt, 0: Tái kích hoạt',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

4.3. Quản lý Nhật ký truy cập (api_logs)

CREATE TABLE `api_logs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `api_name` varchar(100) DEFAULT NULL,
  `request_time` datetime DEFAULT NULL,
  `log_level` varchar(20) DEFAULT NULL,
  `message` text DEFAULT NULL,
  `serviceCode` varchar(100) DEFAULT NULL,
  `systemCode` varchar(100) DEFAULT NULL,
  `headers` text DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 

 

CHƯƠNG II: KIẾN TRÚC VÀ CÁC LOẠI HÌNH DỊCH VỤ

Cấu trúc dự án và loại hình hiện có

CHƯƠNG II: KIẾN TRÚC VÀ CÁC LOẠI HÌNH DỊCH VỤ

TRANG 1: Dịch vụ API REST (Gateway Layer)

1.1. Cấu trúc và Vị trí

Các định nghĩa API nằm tại: src/main/wso2mi/artifacts/apis. Mỗi API trong dự án LGSP đóng vai trò là một Gateway, thực hiện bảo mật, ghi log và điều phối yêu cầu.

1.2. Luồng xử lý tiêu biểu (Ví dụ: GuiNhanVanBan API)

Hệ thống sử dụng các Mediator mạnh mẽ để xử lý nghiệp vụ:

1.3. Cơ chế Logging Tập trung

Mọi API đều gọi đến DatabaseLogSequence và ResultLogSequence để:

CHƯƠNG II: KIẾN TRÚC VÀ CÁC LOẠI HÌNH DỊCH VỤ

TRANG 2: Tầng Dịch vụ Dữ liệu (Data Services - DSS)

2.1. Khái niệm và Vai trò

Dự án sử dụng các file cấu hình .dbs (tại src/main/wso2mi/artifacts/data-services) để trực tiếp thao tác với cơ sở dữ liệu mà không cần viết code Java/Spring.

2.2. Các dịch vụ trọng yếu

2.3. Ưu điểm triển khai

CHƯƠNG II: KIẾN TRÚC VÀ CÁC LOẠI HÌNH DỊCH VỤ

TRANG 3: Hệ thống Proxy và Cầu nối Hệ thống cũ (Legacy)

3.1. Proxy Services

Dành cho các hệ thống backend cũ sử dụng giao thức SOAP/XML. Các Proxy này nằm tại src/main/wso2mi/artifacts/proxy-services.

3.2. Điều hướng Động (Dynamic Routing)

Sử dụng switch mediator dựa trên thuộc tính REST_METHOD (GET, POST, PUT, DELETE) để quyết định gọi URL tương ứng, giúp giảm thiểu số lượng API cần quản lý.

CHƯƠNG II: KIẾN TRÚC VÀ CÁC LOẠI HÌNH DỊCH VỤ

TRANG 4: Trục Tin nhắn RabbitMQ & Kafka (Messaging Layer)

4.1. Hệ thống RabbitMQ (Reliable Messaging)

Được cấu hình thông qua MessageStore và MessageProcessor:

4.2. Hệ thống Kafka (Event Streaming)

Sử dụng KafkaProducerAPI để đẩy các sự kiện dữ liệu lớn:

CHƯƠNG III: CƠ CHẾ ĐỒNG BỘ DỮ LIỆU TỰ ĐỘNG

Xử lý đồng bộ dữ liệu lớn

CHƯƠNG III: CƠ CHẾ ĐỒNG BỘ DỮ LIỆU TỰ ĐỘNG

TRANG 1: Sơ đồ luồng hoạt động tổng quát (Sequence Diagram)

Hệ thống đồng bộ của LGSP không chạy theo lịch cứng mà chạy theo cơ chế "Quét và Đánh giá" (Scan & Evaluate) dựa trên cấu hình linh hoạt trong Database.

image.png

Sau khi Task kích hoạt, hệ thống sẽ đi qua một chuỗi các Sequence có nhiệm vụ chuyên biệt để đảm bảo tính an toàn và linh hoạt.

1.1. Bước 1: Quản lý Luồng (ManagerEvaluateTasksSequence)

Đây là sequence "cửa ngõ". Nhiệm vụ chính:

1.2. Bước 2: Đánh giá Cron (EvaluateSingleTaskSequence)

Với mỗi Task được tách ra, bộ Evaluator sẽ:

1.3. Bước 3: Bộ định tuyến động (RunTaskSequence)

Sequence này đóng vai trò là "Cầu giao điện" tổng. Nó thực hiện:

sequence_lgsp.jpg

 

1.4. Cơ chế nạp dữ liệu động (Dynamic Batch Insert)

Trong dự án LGSP, thay vì viết hàng trăm câu lệnh INSERT cho hàng trăm loại danh mục khác nhau, chúng ta sử dụng cơ chế Dynamic SQL thông qua 2 Stored Procedure phối hợp. Cơ chế này cho phép hệ thống tự động nhận diện cấu trúc tệp JSON trả về từ đối tác và nạp vào bảng tương ứng trong Database.

1.4.1. Sơ đồ luồng xử lý tại Database

Biểu đồ không có tiêu đề (2).jpg

1.4.2. Phân tích Procedure bộ điều phối: sp_batch_insert_data

Nhiệm vụ chính: Phân rã mảng dữ liệu (Array Parsing).

1.4.3. Phân tích Procedure thực thi động: sp_insert_generic_data

Đây là chìa khóa của sự linh hoạt. Nó thực hiện Tự động nhận diện cấu trúc bảng (Table Discovery).

1.4.4. Các bảng cấu hình phụ thuộc

Để 2 Procedure này hoạt động, bạn cần cấu hình bảng mapping

CREATE TABLE endpoint_mappings (
    id INT AUTO_INCREMENT PRIMARY KEY,
    endpoint_path VARCHAR(200) NOT NULL, -- Đường dẫn API (Vd: /api/v1/don-vi)
    table_name VARCHAR(100) NOT NULL,    -- Tên bảng trong Database
    status TINYINT DEFAULT 1             -- 1: Kích hoạt
);

CHƯƠNG III: CƠ CHẾ ĐỒNG BỘ DỮ LIỆU TỰ ĐỘNG

TRANG 2: Bộ máy điều phối Task (Orchestrator)

2.1. MultiEndpointSyncTask (Điểm khởi đầu)

Nằm tại: src/main/wso2mi/artifacts/tasks/MultiEndpointSyncTask.xml.

2.2. ManagerEvaluateTasksSequence (Bộ quản lý)

Đây là "bộ não" điều phối toàn bộ quá trình:

  1. Kiểm tra Khóa (sync_lock): Hệ thống gọi syncLockDataService/getLock. Nếu một luồng đồng bộ khác đang chạy, luồng mới sẽ tự động hủy để tránh tình trạng "Race Condition" (nhiều tiến trình cùng ghi vào một bảng dữ liệu).
  2. Lấy cấu hình Task: Truy vấn lên tới 200 Task đang ở trạng thái kích hoạt (status='1') từ bảng job_schedule.
  3. Lặp (Iterate): Sử dụng thẻ <iterate> của WSO2 để chia nhỏ danh sách Task cho các luồng xử lý song song, tối ưu hóa hiệu suất CPU.
CHƯƠNG III: CƠ CHẾ ĐỒNG BỘ DỮ LIỆU TỰ ĐỘNG

TRANG 3: Phân tích Logic Đánh giá Cron Expression (JS Engine)

3.1. Tại sao cần JavaScript?

WSO2 MI mặc định không có hàm so sánh thời gian với biểu thức Cron phức tạp (như 0 0/15 * * * ?). Do đó, dự án sử dụng JavaScript (Nashorn Engine) để gọi trực tiếp các thư viện Java của Quarkz.

3.2. Chi tiết mã nguồn Evaluator

Tại EvaluateSingleTaskSequence.xml, hệ thống thực hiện các bước:

  1. Lấy cron_expression và last_run (chuỗi string) từ Database.
  2. Chuyển đổi last_run sang đối tượng Date của Java.
  3. Sử dụng class org.quartz.CronExpression để tính toán thời điểm chạy tiếp theo (nextRun).
  4. So sánh: Nếu nextRun nhỏ hơn hoặc bằng thời gian hiện tại (now), hệ thống xác định Task này đã đến hạn chạy (shouldRun = true).
CHƯƠNG III: CƠ CHẾ ĐỒNG BỘ DỮ LIỆU TỰ ĐỘNG

TRANG 4: Thực thi và Cập nhật trạng thái (Runner)

4.1. RunTaskSequence (Bộ thực thi)

Ngay khi nhận được tín hiệu shouldRun = true, Runner sẽ thực hiện:

4.2. Hoàn tất và Giải phóng

Sau khi nghiệp vụ đồng bộ hoàn thành (thành công hoặc thất bại):

CHƯƠNG IV: CẤU HÌNH VÀ MÔI TRƯỜNG VẬN HÀNH

Cấu hình tích hợp các công nghệ

CHƯƠNG IV: CẤU HÌNH VÀ MÔI TRƯỜNG VẬN HÀNH

TRANG 1: Toàn tập cấu hình Deployment.toml

Tệp deployment/deployment.toml là file cấu hình duy nhất của WSO2 Micro Integrator. Mọi thông số từ Port, Memory đến Database đều được quản lý tại đây.

1.1. Cấu hình Server cơ bản

1.2. Cấu hình Connection Pool (HikariCP)

Mặc định WSO2 MI sử dụng HikariCP để quản lý kết nối Database. Các tham số tối ưu cần lưu ý:

CHƯƠNG IV: CẤU HÌNH VÀ MÔI TRƯỜNG VẬN HÀNH

TRANG 2: Quản lý Datasources và Kết nối Cơ sở dữ liệu

Dự án LGSP yêu cầu 3 nguồn dữ liệu chính được định nghĩa trong block [[datasource]]:

2.1. Nguồn dữ liệu ESB_DB

Đây là nơi lưu trữ "trạng thái" của trục tích hợp.

2.2. Nguồn dữ liệu LGSP_NOIBO

2.3. Nguồn dữ liệu NIFI_DB

CHƯƠNG IV: CẤU HÌNH VÀ MÔI TRƯỜNG VẬN HÀNH

TRANG 3: Broker và Messaging Configuration (RabbitMQ/Kafka)

3.1. Cấu hình RabbitMQ (Transport)

Để sử dụng được mô hình "Store-and-Forward" (Gửi văn bản điện tử), bạn cần kích hoạt:

3.2. Cấu hình Kafka (Streaming)

Dùng cho việc đẩy Log Analytics:

CHƯƠNG IV: CẤU HÌNH VÀ MÔI TRƯỜNG VẬN HÀNH

TRANG 4: Bảo mật, Keystores và Certificates

LGSP là hệ thống chính quyền, yêu cầu bảo mật HTTPS và mã hóa dữ liệu.

4.1. Quản lý Keystores

Nằm tại repository/resources/security/:

4.2. Bảo mật mật khẩu (Secret Management)

Thay vì viết mật khẩu DB dạng Clear-text trong deployment.toml, ta nên dùng công cụ Secure Vault của WSO2 để mã hóa: