Khởi động & cấu hình lõi
Starter nền tảng cho service Spring Boot: cung cấp cấu hình mặc định cho async executor, Jackson, CORS, i18n, metrics và che dấu dữ liệu nhạy cảm, kèm context tĩnh để truy cập bean/property ở nơi không tiện inject. Đây là dependency nền của hầu hết thư viện khác trong bộ.
Khi nào sử dụng
- Mọi service Spring Boot trong hệ sinh thái — nên thêm dependency này đầu tiên để có các cấu hình mặc định thống nhất.
- Cần thread pool async dùng chung, tự động mang context theo luồng sang thread con.
- Cần thống nhất định dạng ngày/giờ khi (de)serialize JSON (
dd/MM/yyyy, ISO...) mà không phải khai báo lại. - Cần che dấu số điện thoại, email, CCCD... khi trả response cho client.
- Cần đọc thông điệp i18n dùng chung (
error.notFound,error.system...) hoặc lấy bean/property từ static context. - Cần bật nhanh CORS, metrics/tracing, hoặc bỏ qua kiểm tra SSL ở môi trường phát triển.
Cài đặt
Thêm dependency vào pom.xml, không cần khai báo version vì BOM đã quản lý:
<dependency>
<groupId>vn.govex.cloud</groupId>
<artifactId>govex-cloud-core</artifactId>
</dependency>
Hướng dẫn khai báo parent/BOM và Maven repository xem tại Cài đặt.
Cấu hình
Các property thật của dependency (prefix govex):
| Property | Mô tả | Mặc định |
|---|---|---|
govex.app-code | Mã định danh ứng dụng, dùng phân biệt nguồn dữ liệu giữa các service | — |
govex.async.core-pool-size | Số luồng lõi của thread pool async | Số processor của JVM |
govex.async.max-pool-size | Số luồng tối đa của pool | Gấp đôi core pool size |
govex.async.queue-capacity | Sức chứa queue tác vụ đang chờ | 500 |
govex.async.await-termination | Chờ tác vụ đang chạy hoàn thành khi shutdown | true |
govex.async.await-termination-period | Thời gian chờ tối đa khi shutdown | 60s |
govex.async.pool-name | Tiền tố tên luồng trong pool | Govex-Async- |
govex.http.cache.time-to-live-in-days | Thời gian sống của cache HTTP (ngày) | 1461 |
govex.cors.* | Nhóm CORS: allowed-origins, allowed-methods, allowed-headers, exposed-headers, allow-credentials, max-age, allowed-origin-patterns, allow-private-network | Mặc định của Spring |
govex.log.enabled | Bật/tắt ghi log nghiệp vụ | false |
govex.log.level | Mức log tối thiểu | info |
govex.log.save-log | Lưu log vào kho dữ liệu | false |
govex.log.show-args | Ghi lại tham số đầu vào của request | true |
govex.log.show-response | Ghi lại dữ liệu trả về của request | true |
govex.trace.enabled | Bật/tắt trace | false |
govex.ssl.bypass | Bỏ qua kiểm tra chứng thư SSL — chỉ dùng khi phát triển | false |
Sử dụng
Khởi động ứng dụng
Dùng StartupSpringApplication thay cho SpringApplication để nhận banner, profile mặc định và log tiện ích khi khởi động:
@SpringBootApplication
public class CustomerApplication {
public static void main(String[] args) {
new StartupSpringApplication(CustomerApplication.class)
.banner()
.defaultProfileIfNotExists()
.run(args);
}
}
Ví dụ application.yml
govex:
app-code: customer-service
async:
core-pool-size: 8
max-pool-size: 16
queue-capacity: 500
pool-name: Customer-Async-
cors:
allowed-origins:
- https://portal.example.vn
allow-credentials: true
log:
enabled: true
Truy cập bean/property từ static context
// Lấy bean khi không tiện inject (utility class, static method...)
RedissonClient redisson = ServiceApplicationContext.getBean(RedissonClient.class);
RedissonClient optional = ServiceApplicationContext.findBean(RedissonClient.class); // null nếu không có bean
// Đọc property, tên ứng dụng và profile
String value = ServiceApplicationContext.getProperty("govex.app-code");
String appName = ServiceApplicationContext.getApplicationName();
String[] profiles = ServiceApplicationContext.getActiveProfiles();
Che dấu dữ liệu nhạy cảm
public class UserDTO {
@Sensitive(type = SensitiveType.PHONE)
private String phone;
@Sensitive(type = SensitiveType.EMAIL)
private String email;
@Sensitive(type = SensitiveType.ID_CARD)
private String idCard;
}
Khi serialize response, các field trên được che dấu theo SensitiveType tương ứng (PHONE, EMAIL, ID_CARD, ADDRESS, BANK_CARD, PASSWORD). Muốn đổi cách che dấu hoặc tắt hẳn, khai báo bean SensitiveService riêng.
Thông điệp i18n
String notFound = messageUtils.getMessage("error.notFound");
String badRequest = messageUtils.getMessage("error.badRequest", params);
Các mã dùng chung có sẵn: error.system, error.notFound, error.forbidden, error.unauthorized, error.badRequest.
Ghi đè bean mặc định
Các bean auto-configuration đều có @ConditionalOnMissingBean; khai báo bean cùng loại trong ứng dụng để thay thế:
@Bean
public SensitiveService sensitiveService() {
return new MySensitiveService();
}
Lưu ý
govex.ssl.bypass=truechỉ dành cho môi trường phát triển — bundlebypass-sslchấp nhận mọi chứng thư máy chủ, không dùng ở production.govex.async.*nhường quyền nếu ứng dụng đã khai báoExecutor/AsyncConfigurerriêng; khi đó thread pool mặc định không còn được tạo.- Nhóm
govex.cors.*chỉ tác động khi classpath cóspring-web/spring-webmvc. - Các property
govex.log.*vàgovex.trace.enabledlà cấu hình chung cho tính năng ghi log/trace của hệ thống. - Dependency kéo sẵn
govex-cloud-commonvàgovex-cloud-mapstruct; không cần khai báo lại.