MicroProfile的配置和MicroProfile健康
MicroProfile的配置和MicroProfile健康
- MicroProfile的配置
- 基本原理
- 影响与历史
- 实现
- 设计
- 自定义配置源
- 构建
- MicroProfile Health
MicroProfile的配置
基本原理
大多数应用程序需要基于运行环境进行配置。必须能够从应用程序外部修改配置数据,这样应用程序本身就无需重新打包。
配置数据可以来自不同的位置,并采用不同的格式(例如系统属性、系统环境变量、.properties、.xml、数据源)。我们将这些配置位置称为 ConfigSource。如果在多个 ConfigSource 中定义了相同的属性,我们会应用策略来指定将有效使用哪个值。
在某些情况下,某些数据源可能会动态更改。更改的值应该被输入到客户端,而无需重新启动应用程序。对于在云环境中运行的微服务而言,这一要求尤为重要。MicroProfile Config 方法允许在配置值发生更改后立即获取它们。
影响与历史
许多配置项目直接影响了本提案并成为此 API 的基础,例如:
DeltaSpike 配置 (http://deltaspike.apache.org/documentation/configuration.html)
DeltaSpike 配置的摘录部分 (https://github.com/struberg/javaConfig/)
Apache Tamaya (http://tamaya.incubator.apache.org/)
实现
Microprofile Config 本身不包含实现,仅提供指定的 API、TCK 和文档。
以下实现可用:
Apache Geronimo Config (https://svn.apache.org/repos/asf/geronimo/components/config/trunk)
WebSphere Liberty 2017 3-6 月 Beta 版 (https://developer.ibm.com/wasdev/)
Payara Server 173 和 Payara Micro 173 (https://docs.payara.fish/documentation/microprofile/config.html)
WildFly 和 Thorntail (https://github.com/smallrye/smallrye-config)
microBean™ MicroProfile Config
设计
可以通过 ConfigProvider#getConfig() 访问应用程序的当前配置。
Config 包含从已注册的 org.eclipse.microprofile.config.spi.ConfigSource 收集的信息。这些 ConfigSource 根据其序号排序。这样,就可以从外部覆盖重要性较低的配置。
默认情况下,有 3 个默认 ConfigSource:
System.getProperties() (ordinal=400)
System.getenv() (ordinal=300)
ClassPath 上的所有 META-INF/microprofile-config.properties 文件。(默认序号为 100,可通过每个文件中的 config_ordinal 属性单独配置)
因此,可以在应用程序打包的上述文件中指定默认值,并在以后每次部署时覆盖该值。序号较高的配置优先于序号较低的配置。
自定义配置源
可以编写并注册自定义配置源。例如,一个配置源可以从集群中的共享数据库表中获取配置值。
构建
可以通过 Apache Maven 构建整个 MicroProfile 配置项目
mvn clean install
MicroProfile Health
健康检查用于从另一台机器(例如 Kubernetes 服务控制器)探测计算节点的状态,主要目标是自动化流程维护计算节点状态的云基础架构环境。
建议的解决方案分为两部分:
- 健康检查协议和线格式
- 用于实现健康检查程序的 Java API
@FunctionalInterface
public interface HealthCheck {HealthCheckResponse call();
}
public class HealthCheckResponse {public enum Status { UP, DOWN }private final String name;private final Status status;private final Optional<Map<String, Object>> data;[...]
}
public class SuccessfulCheck implements HealthCheck {@Overridepublic HealthCheckResponse call() {return HealthCheckResponse.up("successful-check");}
}