#探针实现最佳实践
健康检查探针的实现有一些最佳实践,可以避免常见问题。
#探针实现检查清单
# 探针实现检查清单
probe_checklist:
- 检查不应阻塞太久(< 1 秒)
- 检查不应消耗太多资源
- 检查路径应该是幂等的
- 检查应该快速失败
- 检查结果应该缓存#最佳实践
#1. 轻量级检查
LightweightProbe.java
@RestController
@RequestMapping("/health")
public class LightweightHealthController {
// 检查应该只是读取状态,不要执行复杂逻辑
@GetMapping("/live")
public ResponseEntity<String> liveness() {
return ResponseEntity.ok("OK");
}
@GetMapping("/ready")
public ResponseEntity<HealthStatus> readiness() {
HealthStatus status = new HealthStatus();
// 只检查状态标志位,不实际查询
status.setDatabase(dbHealthy.get());
status.setCache(cacheHealthy.get());
if (status.isHealthy()) {
return ResponseEntity.ok(status);
}
return ResponseEntity.status(503).body(status);
}
}#2. 缓存检查结果
CachedHealthCheck.java
@Service
public class CachedHealthCheck {
private final AtomicReference<HealthStatus> cachedStatus = new AtomicReference<>();
private volatile long lastCheckTime = 0;
private static final long CACHE_TTL_MS = 5000;
public HealthStatus getStatus() {
long now = System.currentTimeMillis();
if (now - lastCheckTime > CACHE_TTL_MS) {
refreshStatus();
}
return cachedStatus.get();
}
private void refreshStatus() {
// 实际检查逻辑
// ...
lastCheckTime = System.currentTimeMillis();
}
}#3. 独立端口
dedicated-port.yaml
# 健康检查使用独立端口,避免主端口负载影响检查
containers:
- name: myapp
ports:
- containerPort: 8080
- containerPort: 8081 # 健康检查专用#本章总结
核心要点:
- 探针要轻量快速:不执行复杂逻辑
- 缓存检查结果:避免频繁检查
- 使用独立端口:避免相互影响