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
-
运行应用
:使用
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 的版本演进,都为微服务开发带来了更多的可能性和便利。开发者可以根据项目的实际需求,选择合适的技术和版本,构建出更加健壮、高效的微服务应用。
超级会员免费看

被折叠的 条评论
为什么被折叠?



