开发自助重启
说明:有时候研发产线需要重启,为了保证安全、或者说提升效率,最好有一个统一的研发自助重启页面。
这个功能可应用的发布有一些类似之处。那么这个功能具体应该如何实现呢?
chat
健康和就绪URL
Q:
java 的应用在启动之后,如何知道服务时可用的?
以 springboot 为例,一般都是有健康URL和就绪URL的,详细介绍一下
这是服务治理和容器编排中非常关键的概念。
以 Spring Boot 应用为例,服务在**“刚启动”并不等于“可用”**,我们需要更细粒度地控制 何时开始接流量、何时认为健康。
🌱 核心概念:健康检查 vs 就绪检查
| 类型 | 含义 | 作用 | Spring Boot 中的常见路径 | 
|---|---|---|---|
| 健康检查(Liveness) | 服务“活着”吗?程序有没有挂? | 用于判断是否需要重启服务 | /actuator/health | 
| 就绪检查(Readiness) | 服务“准备好”了吗?能接请求吗? | 控制是否允许接收外部流量 | /actuator/health/readiness | 
☘️ Spring Boot 中的具体实现(以 Spring Boot 2.3+ 为例)
Spring Boot 2.3 之后内置了对 Liveness / Readiness 的支持:
# 开启健康端点
management.endpoint.health.probes.enabled=true
# 对外暴露 health 接口
management.endpoints.web.exposure.include=health,info
# 设置是否细分 Liveness/Readiness
management.health.livenessState.enabled=true
management.health.readinessState.enabled=true
🔎 对应的 URL(默认)
| 类型 | URL 路径 | 
|---|---|
| 健康检查 | /actuator/health | 
| Liveness | /actuator/health/liveness | 
| Readiness | /actuator/health/readiness | 
📦 应用状态生命周期(Spring Boot 内部状态)
Spring Boot 会自动根据 bean 初始化、依赖注入等过程设置内部状态:
| 状态阶段 | 描述 | 
|---|---|
| LivenessState.CORRECT | 应用存活(正常) | 
| ReadinessState.ACCEPTING_TRAFFIC | 应用就绪,可以处理请求 | 
| ReadinessState.REFUSING_TRAFFIC | 应用启动中或不可接流量 | 
✨ 示例:手动控制 Readiness 状态
Spring Boot 提供了接口让你手动控制是否“准备好”
@Component
public class MyInitListener {
    @Autowired
    private ApplicationAvailability availability;
    @PostConstruct
    public void init() throws InterruptedException {
        // 模拟启动加载任务
        Thread.sleep(3000); // 假设加载缓存、DB连接等耗时任务
        // 标记服务已准备好
        availability.setReadinessState(ReadinessState.ACCEPTING_TRAFFIC);
    }
}
🛡️ Kubernetes 中使用方式(集成探针)
你可以将 Spring Boot 的健康/就绪接口,作为 K8s 容器探针配置的目标:
livenessProbe:
  httpGet:
    path: /actuator/health/liveness
    port: 8080
  initialDelaySeconds: 10
  periodSeconds: 15
readinessProbe:
  httpGet:
    path: /actuator/health/readiness
    port: 8080
  initialDelaySeconds: 20
  periodSeconds: 10
作用:
- Liveness 失败时,Pod 会被 K8s 自动重启;
- Readiness 失败时,Pod 不会接收流量(不会被加入 Service 的 endpoints);
🧩 附加:自定义健康检查项(HealthIndicator)
你可以添加业务层级的健康检查,比如 Redis、数据库、外部服务等:
@Component
public class RedisHealthIndicator implements HealthIndicator {
    @Override
    public Health health() {
        try {
            // 执行 ping 或 get
            return Health.up().withDetail("Redis", "OK").build();
        } catch (Exception e) {
            return Health.down().withDetail("Redis", "ERROR").build();
        }
    }
}
加入后,访问 /actuator/health 会看到:
{
  "status": "UP",
  "components": {
    "redis": {
      "status": "UP",
      "details": { "Redis": "OK" }
    }
  }
}
✅ 总结
| 检查项 | 说明 | 
|---|---|
| 🧠 健康检查(Liveness) | 判断程序是否挂掉,控制是否需要重启 | 
| 🚦 就绪检查(Readiness) | 判断服务是否准备好接流量 | 
| 🛠 集成探针 | 可以通过 K8s 探针进行自动流量控制 | 
| 🧩 支持自定义检查 | 可结合数据库、缓存等业务状态做判断 | 
| 🔧 可编程控制 | 应用可以根据自己的业务逻辑手动切换状态 | 
