13、Helidon健康检查与MicroProfile版本演进

Helidon健康检查与MicroProfile版本演进

1. Helidon健康检查介绍

Helidon健康检查是MicroProfile健康规范的一种实现,提供了一组注解(如 @Liveness @Readiness @Startup ),用于在应用程序中构建自定义健康检查,使应用更加健壮。

1.1 HealthCheck接口

HealthCheck 接口定义了 call() name() path() type() 等方法,用于构建自定义健康检查。通过实现该接口,我们可以创建自己的健康检查逻辑。

1.2 构建示例应用

为了演示Helidon健康检查的实际应用,我们来看一个小示例应用。该应用包含七个主要类: Message SimpleGreetResource SystemResource SimpleHealthCheck SystemLivenessCheck SystemReadinessCheck SystemStartupCheck
- Message 类是一个标准的Java对象(POJO),包含 message greeting 两个字符串的getter和setter方法。
- SimpleGreetResource 类定义了端点 /simple-greeting /simple-greeting/{name}

2. 依赖配置

在应用中使用Helidon健康检查,需要添加相应的依赖。以下是Maven和Gradle的依赖配置:
- Maven依赖

<dependency>
    <groupId>io.helidon.microprofile.health</groupId>
    <artifactId>helidon-microprofile-health</artifactId>
    <version>4.1.0</version>
</dependency>
  • Gradle依赖
implementation group: 'io.helidon.microprofile.health', name:  'helidon-microprofile-health', version: '4.1.0'
3. 系统资源类

SystemResource 类定义了一个端点 /properties ,用于返回计算机工作站的所有系统属性。代码如下:

@RequestScoped
@Path("properties")
public class SystemResource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getProperties() {
        return Response.ok(System.getProperties()).build();
    }
}
4. 不同类型的健康检查类
4.1 系统存活检查(System Liveness Check)

SystemLivenessCheck 类用于检查堆内存使用情况,并与可用系统内存进行比较。如果当前内存使用量小于最大内存的90%,服务状态为 UP ,否则为 DOWN

@Liveness
@ApplicationScoped
public class SystemLivenessCheck implements HealthCheck {
    @Override
    public HealthCheckResponse call() {
        MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
        long memoryUsed = memoryBean.getHeapMemoryUsage().getUsed();
        long memoryMax = memoryBean.getHeapMemoryUsage().getMax();
        return HealthCheckResponse
               .named(name())
               .withData("resource", SystemResource.class.getSimpleName())
               .withData("type", type().toString())
               .withData("memory bean", memoryBean.toString())
               .withData("memory used", memoryUsed)
               .withData("memory max", memoryMax)
               .status(memoryUsed < memoryMax * 0.9)
               .build();
    }
    public String name() {
        return "System Liveness Check";
    }
    public HealthCheckType type() {
        return HealthCheckType.LIVENESS;
    }
}
4.2 系统就绪检查(System Readiness Check)

SystemReadinessCheck 类比较系统属性 java.vm.name 的值与指定值是否相等。如果相等,服务状态为 UP ,否则为 DOWN

@Readiness
@ApplicationScoped
public class SystemReadinessCheck implements HealthCheck {
    private static final String READINESS_CHECK = SystemResource.class.getSimpleName() + " Readiness Check";
    @Override
    public HealthCheckResponse call() {
        if (!System.getProperty("java.vm.name").equals("OpenJDK 64-Bit Server VM")) {
            return HealthCheckResponse.down(READINESS_CHECK);
        }
        return HealthCheckResponse.up(READINESS_CHECK);
    }
}
4.3 系统启动检查(System Startup Check)

SystemStartupCheck 类检查CPU使用率。如果当前CPU使用率小于95%,服务状态为 UP ,否则为 DOWN

@Startup
@ApplicationScoped
public class SystemStartupCheck implements HealthCheck {
    @Override
    public HealthCheckResponse call() {
        OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
        double cpuUsed = bean.getCpuLoad();
        String cpuUsage = String.valueOf(cpuUsed);
        return HealthCheckResponse
               .named(name())
               .withData("resource", SystemResource.class.getSimpleName())
               .withData("type", type().toString())
               .withData("bean", bean.toString())
               .withData("cpu usage", cpuUsage)
               .status(cpuUsed < 0.95)
               .build();
    }
    public String name() {
        return "System Startup Check";
    }
    public HealthCheckType type() {
        return HealthCheckType.STARTUP;
    }
}
5. 构建和执行应用

以下是构建和执行应用的步骤:
1. 构建应用 :使用Maven将应用打包为JAR文件。

~ » mvn clean package
  1. 运行应用 :使用 java 命令调用JAR文件。
~ » java -jar target/health.jar
6. 测试应用

在应用服务器运行后,我们可以测试不同的端点,查看健康检查的JSON响应。
- 默认/health端点

~ » curl -s http://localhost:8080/health | json_pp
{
    "checks": [],
    "status": "UP"
}
  • 自定义/health端点
~ » curl -s http://localhost:8080/health | json_pp
{
    "status": "UP",
    "checks": [
        {
            "name": "Simple Health Check",
            "status": "UP"
        },
        {
            "status": "UP",
            "name": "System Liveness Check",
            "data": {
                "resource": "SystemResource",
                "memory used": 31880440,
                "type": "LIVENESS",
                "memory max": 2147483648,
                "memory bean": "sun.management.MemoryImpl@e044b4a"
            }
        },
        {
            "data": {
                "user": "Barry",
                "admin": "Mike"
            },
            "name": "Health Check with Data",
            "status": "UP"
        },
        {
            "status": "UP",
            "name": "SystemResource Readiness Check"
        },
        {
            "status": "UP",
            "name": "System Startup Check",
            "data": {
                "bean": "com.sun.management.internal.OperatingSystemImpl@1f651cd8",
                "resource": "SystemResource",
                "type": "STARTUP",
                "cpu usage": "0.07406470881682645"
            }
        }
    ]
}
  • /health/live端点
~ » curl -s http://localhost:8080/health/live | json_pp
{
    "status": "UP",
    "checks": [
        {
            "status": "UP",
            "name": "Simple Health Check"
        },
        {
            "data": {
                "resource": "SystemResource",
                "memory bean": "sun.management.MemoryImpl@e044b4a",
                "type": "LIVENESS",
                "memory max": 2147483648,
                "memory used": 32929016
            },
            "name": "System Liveness Check",
            "status": "UP"
        },
        {
            "data": {
                "admin": "Mike",
                "user": "Barry"
            },
            "name": "Health Check with Data",
            "status": "UP"
        }
    ]
}
  • /health/ready端点
~ » curl -s http://localhost:8080/health/ready | json_pp
{
    "status": "UP",
    "checks": [
        {
            "status": "UP",
            "name": "SystemResource Readiness Check"
        }
    ]
}
  • /health/started端点
~ » curl -s http://localhost:8080/health/started | json_pp
{
    "status": "UP",
    "checks": [
        {
            "data": {
                "bean": "com.sun.management.internal.OperatingSystemImpl@1f651cd8",
                "type": "STARTUP",
                "cpu usage": "0.03344554240416983",
                "resource": "SystemResource"
            },
            "status": "UP",
            "name": "System Startup Check"
        }
    ]
}
  • /properties端点
~ » curl -s http://localhost:8080/properties | json_pp
{
    "java.vm.version": "21+35-2513",
    "java.library.path": "/Users/mpredli01/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.",
    "jersey.config.allowSystemPropertiesProvider": "true",
    "java.vendor": "Oracle Corporation",
    "java.vendor.url.bug": "https://bugreport.java.com/bugreport/",
    "sun.cpu.endian": "little",
    "sun.java.command": "target/health.jar",
    "jersey.config.client.ignoreExceptionResponse": "true",
    "line.separator": "\n",
    "user.home": "/Users/mpredli01",
    "user.name": "mpredli01",
    "path.separator": ":",
    "java.class.path": "target/health.jar",
    "stdout.encoding": "UTF-8",
    "java.vm.name": "OpenJDK 64-Bit Server VM",
    "java.vendor.url": "https://java.oracle.com/",
    "os.version": "10.15.7",
    "java.class.version": "65.0",
    "java.vm.info": "mixed mode, sharing",
    "user.timezone": "America/New_York",
    "os.name": "Mac OS X",
    "java.vm.specification.vendor": "Oracle Corporation",
    "java.home": "/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home",
    "native.encoding": "UTF-8",
    "sun.io.unicode.encoding": "UnicodeBig",
    "user.language": "en",
    "user.country": "US",
    "file.encoding": "UTF-8",
    "java.vm.vendor": "Oracle Corporation",
    "apple.awt.application.name": "Main",
    "sun.jnu.encoding": "UTF-8",
    "sun.management.compiler": "HotSpot 64-Bit Tiered Compilers",
    "java.runtime.name": "OpenJDK Runtime Environment",
    "java.runtime.version": "21+35-2513",
    "file.separator": "/",
    "stderr.encoding": "UTF-8",
    "java.io.tmpdir": "/var/folders/tt/7lxy2q7d55jbvvv1pnjj05cm0000gn/T/",
    "socksNonProxyHosts": "local|*.local|169.254/16|*.169.254/16",
    "sun.java.launcher": "SUN_STANDARD",
    "java.specification.name": "Java Platform API Specification",
    "java.version.date": "2023-09-19",
    "java.specification.version": "21",
    "java.vm.specification.name": "Java Virtual Machine Specification",
    "ftp.nonProxyHosts": "local|*.local|169.254/16|*.169.254/16",
    "java.vm.specification.version": "21",
    "http.nonProxyHosts": "local|*.local|169.254/16|*.169.254/16",
    "os.arch": "x86_64",
    "jdk.debug": "release",
    "user.dir": "/usr/local/publications/helidon-book/health",
    "java.vm.compressedOopsMode": "Zero based",
    "java.version": "21",
    "sun.boot.library.path": "/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home/lib",
    "java.specification.vendor": "Oracle Corporation",
    "sun.arch.data.model": "64"
}
7. MicroProfile版本演进

MicroProfile自2016年以来不断发展,每个版本都引入了新的规范或对现有规范进行了更新。以下是各版本的简要介绍:
| 版本 | 发布时间 | 新增规范 | 规范图 | 兼容实现 |
| ---- | ---- | ---- | ---- | ---- |
| 1.0 | 2016年9月19日 | JSR - 346: Contexts and Dependency Injection (CDI) 1.1
JSR - 353: Java API for JSON Processing (JSON - P) 1.0
JSR - 339: Java API for RESTful Web Services (JAX - RS) 2.0 | CDI 1.1
JSON - P 1.0
JAX - RS 2.0 | WildFly Swarm 2016.8.1
TomEE 7.1.0
WebSphere Liberty 16.0.0.3
KumuluzEE 2.1.0 |
| 1.1 | 2017年8月8日 | Config | CDI 1.2
JSON - P 1.0
JAX - RS 2.0
Config 1.0 | Fujitsu Launcher 1.0
Payara Micro 5.174
Hammock 2.0
Helidon 0.9.4
Payara Server 5.174
KumuluzEE 2.5.2 |
| 1.2 | 2017年9月 | Fault Tolerance
Metrics
JWT Propagation
Health Check | Fault Tolerance 1.0
Metrics 1.0
JWT Propagation 1.0
Health Check 1.0
CDI 1.2
JSON - P 1.0
JAX - RS 2.0
Config 1.1 | Open Liberty 17.0.0.3
Payara Server 5.181
WebSphere Liberty 17.0.0.3
Payara Micro 5.181
WildFly Swarm 2017.12.1
KumuluzEE 3.0.0
Red Hat OpenShift Application Runtimes 1.0
Helidon 1.0 |
| 1.3 | 2018年3月16日 | Open Tracing
Open API
Rest Client | Open Tracing 1.0
Open API 1.0
Rest Client 1.0
Fault Tolerance 1.0
Metrics 1.1
JWT Propagation 1.0
Health Checks 1.0
CDI 1.2
JSON - P 1.0
JAX - RS 2.0
Config 1.2 | Helidon 1.2.0
Payara Micro 5.182
Open Liberty 18.0.0.1
Thorntail 2.1.0.Final
WebSphere Liberty 18.0.0.1
TomEE 8.0.0 - M1
Payara Server 5.182
KumuluzEE 3.2.0 |
| 1.4 | 2018年6月29日 | 无(更新部分规范) | Open Tracing 1.1
Open API 1.0
Rest Client 1.1
Fault Tolerance 1.1
Metrics 1.1
JWT Propagation 1.1
Health Check 1.0
CDI 1.2
JSON - P 1.0
JAX - RS 2.0
Config 1.3 | Helidon 1.2.0
Open Liberty 18.0.0.3
Payara Server 5.183
WebSphere Liberty 18.0.0.3
Payara Micro 5.183
KumuluzEE 3.2.0 |
| 2.0 | 2018年6月29日 | Java API for JSON Binding (JSON - B) | Open Tracing 1.1
Open API 1.0
Rest Client 1.1
Config 1.3
Fault Tolerance 1.1
Metrics 1.1
JWT Propagation 1.1
Health Check 1.0
CDI 2.0
JSON - P 1.1
JAX - RS 2.1
JSON - B 1.0 | Helidon 1.2.0
WebSphere Liberty 18.0.0.3
Payara Server 5.183
TomEE 8.0.0 - M2
Payara Micro 5.183
KumuluzEE 3.2.0
Open Liberty 18.0.0.3 |
| 2.1 | 2018年10月19日 | 无(更新Open Tracing规范) | Open Tracing 1.2
Open API 1.0
Rest Client 1.1
Config 1.3
Fault Tolerance 1.1
Metrics 1.1
JWT Propagation 1.1
Health Check 1.0
CDI 2.0
JSON - P 1.1
JAX - RS 2.1
JSON - B 1.0 | Helidon 1.2.0
Payara Server 5.191
Open Liberty 18.0.0.4
Payara Micro 5.191
WebSphere Liberty 18.0.0.4
TomEE 8.0.0 - M3
Thorntail 2.3.0.Final
KumuluzEE 3.2.0 |

通过以上介绍,我们了解了Helidon健康检查的使用方法和MicroProfile的版本演进,这有助于我们在开发中选择合适的技术和规范,构建更加健壮的微服务应用。

Helidon健康检查与MicroProfile版本演进

8. 不同版本的特点和影响
  • MicroProfile 1.0 :作为起始版本,它选取了 Java EE 7 中三个被认为对创建微服务应用至关重要的 JSR - 基于的 API,为后续版本奠定了基础。这使得开发者能够利用已有的 Java EE 7 技术快速搭建微服务应用。
  • MicroProfile 1.1 :引入了 Config 规范,这是一个重要的改进。通过该规范,开发者可以从多个来源(如系统属性、环境变量和文本文件)指定配置数据,避免了重新打包应用的麻烦,提高了应用的灵活性和可维护性。
  • MicroProfile 1.2 :新增了多个关键规范,如 Fault Tolerance、Metrics、JWT Propagation 和 Health Check。Fault Tolerance 可以帮助应用处理各种故障,提高应用的稳定性;Metrics 提供了统一的服务来管理应用的指标;JWT Propagation 用于处理安全令牌;Health Check 则能实时监测应用的健康状态,确保服务的可用性。
  • MicroProfile 1.3 :带来了 Open Tracing、Open API 和 Rest Client 规范。Open Tracing 让应用具备可观测性,方便开发者进行性能分析和故障排查;Open API 使得应用的文档更加规范和易于理解;Rest Client 提供了一种类型安全的方式来调用 RESTful 服务,简化了开发过程。
  • MicroProfile 1.4 :对多个规范进行了更新,进一步完善了各个规范的功能,提升了应用的性能和稳定性。
  • MicroProfile 2.0 :不仅更新了原有的 JSR - 基于的规范,还引入了 Java API for JSON Binding (JSON - B) 规范。这使得开发者可以更方便地在 Java 对象和 JSON 消息之间进行转换,提高了开发效率。
  • MicroProfile 2.1 :对 Open Tracing 规范进行了更新,增强了应用的可观测性。
9. 选择合适的 MicroProfile 版本

在开发微服务应用时,选择合适的 MicroProfile 版本至关重要。以下是一些选择的建议:
1. 项目需求 :如果项目对配置管理有较高要求,那么可以考虑从 MicroProfile 1.1 及以上版本开始;如果需要处理应用故障、监控指标或进行安全认证,MicroProfile 1.2 及以上版本会更合适。
2. 兼容性 :需要考虑项目所使用的其他技术和框架与 MicroProfile 版本的兼容性。例如,如果项目使用的是 Java EE 7 相关技术,MicroProfile 1.0 - 1.4 可能更适合;如果要迁移到 Java EE 8,MicroProfile 2.0 及以上版本是更好的选择。
3. 社区支持 :较新的版本通常会得到更多的社区支持和更新,能够及时修复漏洞和添加新功能。但也要注意,一些较新的规范可能在某些场景下还不够成熟。

10. Helidon 与 MicroProfile 的结合优势

Helidon 作为 MicroProfile 的兼容实现,与 MicroProfile 各版本紧密结合,具有以下优势:
- 性能优越 :Helidon 以其轻量级和高性能的特点,能够在不同的 MicroProfile 版本中高效运行,为应用提供快速响应和低延迟的服务。
- 易于集成 :Helidon 提供了丰富的工具和库,使得开发者可以轻松地将 MicroProfile 的各种规范集成到项目中,减少了开发成本和时间。
- 持续更新 :随着 MicroProfile 版本的不断演进,Helidon 也会及时跟进,支持最新的规范和功能,确保开发者能够使用到最先进的技术。

11. 总结与展望

通过对 Helidon 健康检查和 MicroProfile 版本演进的介绍,我们可以看到微服务开发领域的不断发展和创新。Helidon 健康检查为应用的稳定性和可靠性提供了保障,而 MicroProfile 的各个版本则不断丰富和完善了微服务开发的技术栈。

在未来,我们可以期待 MicroProfile 继续推出更多实用的规范和功能,进一步提升微服务开发的效率和质量。同时,Helidon 也会不断优化和改进,与 MicroProfile 紧密合作,为开发者提供更好的开发体验。

以下是 MicroProfile 版本演进的 mermaid 流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px

    A([MicroProfile 1.0]):::startend --> B([MicroProfile 1.1]):::startend
    B --> C([MicroProfile 1.2]):::startend
    C --> D([MicroProfile 1.3]):::startend
    D --> E([MicroProfile 1.4]):::startend
    E --> F([MicroProfile 2.0]):::startend
    F --> G([MicroProfile 2.1]):::startend

    A1(CDI 1.1<br>JSON - P 1.0<br>JAX - RS 2.0):::process --> A
    B1(Config):::process --> B
    C1(Fault Tolerance<br>Metrics<br>JWT Propagation<br>Health Check):::process --> C
    D1(Open Tracing<br>Open API<br>Rest Client):::process --> D
    E1(更新部分规范):::process --> E
    F1(JSON - B):::process --> F
    G1(更新Open Tracing规范):::process --> G

总之,无论是 Helidon 健康检查还是 MicroProfile 的版本演进,都为微服务开发带来了更多的可能性和便利。开发者可以根据项目的实际需求,选择合适的技术和版本,构建出更加健壮、高效的微服务应用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值