MicroProfile配置 ,即一部分MicroProfile规格,是Java Enterprise和微服务配置的标准化。
开箱即用(即,对于规范定义的所有实现都是强制性的)有3种方法来定义您的配置:
-
System.getProperties()
-
System.getenv()
- 类路径上的所有
META-INF/microprofile-config.properties
该ordinal
这些配置资源的决定,系统将寻找一个特定属性的顺序。
因此,如果您具有config属性,其关键字为myservice.hostname
,则将其注入代码中:
@Inject @ConfigProperty(name = "myservice.hostname", defaultValue = "localhost")
private String myServiceHostname;
系统将首先查看是否存在具有关键字myservice.hostname
的System属性,否则将尝试环境变量,然后尝试类路径上的所有microprofile-config.property
文件。 如果在任何地方都找不到它,它将回defaultValue
注释中的defaultValue
。
您自己的配置源。
您还可以提供自己的配置源,并定义该源的加载顺序。 Config Api使用SPI加载所有配置源,因此创建自己的源非常容易。
例如,假设我们要首先加载一个源(即在系统属性之前发生事件),然后将这些配置值存储在内存中,则可以编写一个扩展org.eclipse.microprofile.config.spi.ConfigSource
的类:
public class MemoryConfigSource implements ConfigSource {
public static final String NAME = "MemoryConfigSource";
private static final Map<String,String> PROPERTIES = new HashMap<>();
@Override
public int getOrdinal() {
return 900;
}
@Override
public Map<String, String> getProperties() {
return PROPERTIES;
}
@Override
public String getValue(String key) {
if(PROPERTIES.containsKey(key)){
return PROPERTIES.get(key);
}
return null;
}
@Override
public String getName() {
return NAME;
}
}
(在此处查看完整的源代码)
您还(根据SPI)通过在名为org.eclipse.microprofile.config.spi.ConfigSource
的文件中添加条目,在META-INF/services
注册实现。
com.github.phillipkruger.microprofileextentions.config.MemoryConfigSource
( 这里有完整的示例)
上面是一个非常简单的示例,只是将配置值保留在静态映射中。 然后,您可以创建一个JAX-RS服务( 示例 )以在此映射中添加和删除值。
但是,如果您想要更复杂的配置源怎么办? 本身需要配置吗?
使用MicroProfile Config配置您自己的MicroProfile Config源。
例如,如果我们想要一个在etcd中找到值的Config源,我们还需要配置etcd服务器的详细信息。 好消息是我们可以为此使用Config Api!
但是,“配置源”实现不是CDI Bean,因此不能@Inject
值。 您还需要忽略自己(即,在配置源时不要看源,否则您将陷入无休止的循环)
在没有CDI的情况下获取配置非常容易:
Config config = ConfigProvider.getConfig();
(感谢友好的MicroProfile Google小组的 Rudy De Busscher和其他人的帮助)
因此,现在我们只需要确保忽略自己即可:
private String getPropertyValue(String key,String defaultValue){
Config config = ConfigProvider.getConfig();
Iterable<ConfigSource> configSources = config.getConfigSources();
for(ConfigSource configsource:configSources){
if(!configsource.getName().equals(NAME)){ // Ignoring myself
String val = configsource.getValue(key);
if(val!=null && !val.isEmpty())return val;
}
}
return defaultValue;
}
其中NAME
是您自己的配置源的名称。
( 这里有完整的示例)
现在,我可以使用任何其他配置源选项来定义我的etcd服务器的服务器详细信息。
运行示例。
我正在Payara-micro上运行示例 (但它应适用于任何MicroProfile实现)。
使用Maven:
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>fish.payara.maven.plugins</groupId>
<artifactId>payara-micro-maven-plugin</artifactId>
<version>1.0.1</version>
<executions>
<execution>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
</executions>
<configuration>
<artifactItem>
<groupId>fish.payara.extras</groupId>
<artifactId>payara-micro</artifactId>
<version>${payara-micro.version}</version>
</artifactItem>
<deployWar>true</deployWar>
<!--<javaCommandLineOptions>
<option>
<value>-Dconfigsource.etcd.host=127.0.0.1</value>
</option>
</javaCommandLineOptions>-->
</configuration>
</plugin>
(在此处查看完整的pom.xml
)
如果取消注释javaCommandLineOptions
,则可以将etcd配置源中使用的etcd服务器主机名更改为其他名称。
我还可以使用其他任何配置源来执行此操作,例如,在示例war文件(如本示例 )中包含microprofile-config.properties
,或使用其他自定义配置源并在内存中进行更改。
用作库。
您还可以将所有这些捆绑在一个jar文件中,以供您的任何项目使用。 我在maven Central和github中提供了上述内容,因此您也可以直接使用它。
只需将其添加到您的pom.xml
<dependency>
<groupId>com.github.phillip-kruger.microprofile-extentions</groupId>
<artifactId>config-ext</artifactId>
<version>1.0.7</version>
</dependency>
并且您拥有上述所有配置源。
翻译自: https://www.javacodegeeks.com/2018/08/microprofile-config-source.html