Spring Boot Actuator là thành phần cốt lõi giúp vận hành các ứng dụng Spring Boot một cách ổn định trong môi trường sản xuất, đặc biệt khi triển khai trên nền tảng Kubernetes. Cơ chế kiểm tra sức khỏe (health probing) của Actuator được thiết kế để đồng bộ hóa với hai loại probe chuẩn của Kubernetes: liveness và readiness, từ đó hỗ trợ tự động cân bằng tải, phát hiện sự cố và thực hiện khởi động lại hoặc chuyển hướng lưu lượng một cách chính xác.
Phân biệt liveness và readiness
Trong Kubernetes, hai probe này đảm nhiệm vai trò khác nhau:
- Liveness probe: Xác định liệu tiến trình ứng dụng còn đang chạy hay không — tương đương với việc kiểm tra tiến trình Java chưa bị treo hoặc crash. Kết quả chỉ phụ thuộc vào trạng thái nội tại của ứng dụng (ví dụ: vòng đời Spring Context), không phụ thuộc vào các hệ thống bên ngoài như cơ sở dữ liệu hay dịch vụ REST.
- Readiness probe: Đánh giá khả năng tiếp nhận yêu cầu HTTP từ bên ngoài. Trạng thái này phản ánh cả trạng thái khởi tạo hoàn tất (application context fully refreshed) lẫn tính sẵn sàng của các phụ thuộc bắt buộc (ví dụ: kết nối tới Redis, khả năng gọi API bên thứ ba).
Chu kỳ sống và trạng thái tương ứng
| Giai đoạn | Trạng thái liveness | Trạng thái readiness | Mô tả |
|---|---|---|---|
| Khởi tạo (Starting) | BROKEN |
REFUSING_TRAFFIC |
Ứng dụng chưa sẵn sàng; K8S có thể khởi động lại nếu probe thất bại liên tục. |
| Context đã tải xong (Started) | CORRECT |
REFUSING_TRAFFIC |
Spring Context đã sẵn sàng, nhưng các tác vụ khởi tạo tùy chỉnh (ví dụ: preload cache) chưa hoàn tất. |
| Sẵn sàng phục vụ (Ready) | CORRECT |
ACCEPTING_TRAFFIC |
Ứng dụng có thể xử lý yêu cầu — readiness probe trả về UP. |
| Đang tắt dần (Graceful shutdown) | CORRECT |
REFUSING_TRAFFIC |
K8S ngừng gửi traffic mới, nhưng vẫn cho phép xử lý các request đang chạy. |
Các endpoint giám sát quan trọng
Actuator cung cấp nhiều endpoint qua giao diện HTTP hoặc JMX. Các endpoint thường dùng bao gồm:
/actuator/health: Tổng quan sức khỏe tổng thể./actuator/health/livenessvà/actuator/health/readiness: Dành riêng cho Kubernetes./actuator/env: Liệt kê biến môi trường và cấu hình runtime./actuator/beans: Hiển thị toàn bộ bean được quản lý bởi Spring Container./actuator/info: Thông tin tùy chỉnh (ví dụ: version build, commit hash).
Để kích hoạt các endpoint cần thiết, thêm vào application.yml:
management:
endpoints:
web:
exposure:
include: info, health, env, beans
endpoint:
health:
show-details: always
probes:
enabled: true
endpoints:
enabled-by-default: false
endpoint:
health:
group:
liveness:
include: livenessState
readiness:
include: readinessState, db, redis, customApi
Tích hợp HealthIndicator tùy chỉnh
Để mở rộng khả năng kiểm tra, bạn có thể triển khai interface HealthIndicator. Ví dụ sau kiểm tra khả năng truy cập một dịch vụ REST bên ngoài thông qua WebClient (thay vì RestTemplate cũ):
@Component
public class ExternalServiceHealthCheck implements HealthIndicator {
private final WebClient webClient;
public ExternalServiceHealthCheck(WebClient.Builder builder) {
this.webClient = builder.baseUrl("https://api.example.com").build();
}
@Override
public Health health() {
try {
Mono<String> response = webClient.get()
.uri("/status")
.retrieve()
.bodyToMono(String.class)
.timeout(Duration.ofSeconds(3));
String body = response.block();
return Health.up()
.withDetail("response", body.substring(0, Math.min(100, body.length())))
.build();
} catch (Exception e) {
return Health.down()
.withDetail("error", e.getMessage())
.withException(e)
.build();
}
}
}
Khi triển khai, endpoint /actuator/health/readiness sẽ tự động bao gồm kết quả từ ExternalServiceHealthCheck, giúp Kubernetes tránh gửi traffic đến phiên bản chưa sẵn sàng.
Quản lý nhóm kiểm tra (Health Groups)
Actuator cho phép tổ chức các HealthIndicator thành nhóm logic. Ví dụ:
- Nhóm
databasegồmDataSourceHealthIndicatorvàHikariHealthIndicator. - Nhóm
cachegồmRedisHealthIndicatorvàCacheManagerHealthIndicator.
Định nghĩa nhóm trong cấu hình:
management:
endpoint:
health:
group:
database:
include: db, hikaricp
cache:
include: redis, cachemanager
Sau đó truy cập /actuator/health/database hoặc /actuator/health/cache để kiểm tra từng nhóm độc lập.
Triển khai trong Kubernetes
Trong file deployment.yaml, cấu hình probe như sau:
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 60
periodSeconds: 30
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 20
periodSeconds: 15
Việc phân tách rõ ràng giữa hai probe đảm bảo rằng K8S chỉ gửi lưu lượng đến các pod đã hoàn tất khởi tạo và có đầy đủ phụ thuộc hoạt động.