You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jakarta EE 10在K8S中自定义就绪/存活探针启动时不可用求助

解决方案

一、修复自定义MicroProfile健康检查不生效问题

1. 确保WildFly启用MicroProfile Health扩展

WildFly 27默认未开启该扩展,需通过以下方式启用:

  • 启动参数方式:启动时添加参数
    ./standalone.sh -c standalone.xml -Dwildfly.extensions.modules=org.wildfly.extension.microprofile.health-smallrye
    
  • 配置文件方式:修改standalone.xml,添加扩展配置
    在<extensions>节点下加入:
    <extension module="org.wildfly.extension.microprofile.health-smallrye"/>
    
    然后在<profile>节点下添加子系统配置:
    <subsystem xmlns="urn:wildfly:microprofile-health-smallrye:6.0">
        <health-checks>
            <readiness-enabled>true</readiness-enabled>
            <liveness-enabled>true</liveness-enabled>
        </health-checks>
    </subsystem>
    

2. 修正健康检查逻辑(区分存活/就绪探针)

存活探针仅需确认JVM正常运行,就绪探针需关联缓存初始化状态,拆分代码如下:

缓存初始化Bean(控制就绪状态)

import jakarta.annotation.PostConstruct;
import jakarta.ejb.Startup;
import jakarta.ejb.Singleton;

@Startup
@Singleton
public class CacheInitializer {
    // 用volatile保证多线程可见性
    private volatile boolean cacheReady = false;

    @PostConstruct
    public void initCache() {
        // 替换为实际缓存初始化逻辑
        try {
            Thread.sleep(30000); // 模拟耗时初始化
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw new RuntimeException("缓存初始化失败", e);
        }
        cacheReady = true;
    }

    public boolean isCacheReady() {
        return cacheReady;
    }
}

存活探针检查类

import jakarta.enterprise.context.ApplicationScoped;
import org.eclipse.microprofile.health.HealthCheck;
import org.eclipse.microprofile.health.HealthCheckResponse;
import org.eclipse.microprofile.health.Liveness;

@ApplicationScoped
@Liveness
public class LivenessCheck implements HealthCheck {
    @Override
    public HealthCheckResponse call() {
        // 存活探针仅确认进程存活,直接返回UP
        return HealthCheckResponse.named("jvm-liveness").up().build();
    }
}

就绪探针检查类

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.eclipse.microprofile.health.HealthCheck;
import org.eclipse.microprofile.health.HealthCheckResponse;
import org.eclipse.microprofile.health.Readiness;

@ApplicationScoped
@Readiness
public class ReadinessCheck implements HealthCheck {

    @Inject
    private CacheInitializer cacheInitializer;

    @Override
    public HealthCheckResponse call() {
        if (cacheInitializer.isCacheReady()) {
            return HealthCheckResponse.named("cache-readiness").up().build();
        } else {
            return HealthCheckResponse.named("cache-readiness")
                    .down()
                    .withData("reason", "缓存初始化中")
                    .build();
        }
    }
}

二、解决启动阶段自定义端点不可访问问题

MicroProfile Health的原生端点(/health/live、/health/ready)在WildFly启动早期即可访问,无需等待应用完全部署,因此优先使用原生端点而非自定义JAX-RS端点。

1. 验证端点可用性

启动WildFly后,直接访问以下路径:

  • 存活探针:http://localhost:8080/health/live
  • 就绪探针:http://localhost:8080/health/ready

缓存初始化期间,/health/ready返回HTTP 503(未就绪),初始化完成后返回HTTP 200(就绪)。

2. Kubernetes探针配置

修改K8s Deployment的探针配置,指向正确的端点:

livenessProbe:
  httpGet:
    path: /health/live
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 10
readinessProbe:
  httpGet:
    path: /health/ready
    port: 8080
  initialDelaySeconds: 10
  periodSeconds: 5
  failureThreshold: 3

三、关键注意事项

  • 避免在同一个类上同时标注@Liveness和@Readiness,两者职责需明确分离:
    • 存活探针:监控应用进程是否存活,不依赖业务初始化状态
    • 就绪探针:监控应用是否完成所有初始化,可处理业务请求
  • 缓存初始化逻辑需保证线程安全,使用volatile或同步机制保证状态可见性
  • WildFly独立模式下,MicroProfile Health端点默认绑定到应用端口(8080),而非管理端口(9990),无需通过管理接口访问

内容的提问来源于stack exchange,提问作者Gerry Askefalk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:06:04