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<>();@Overridepublic int getOrdinal() {return 900;}@Overridepublic Map<String, String> getProperties() {return PROPERTIES;}@Overridepublic String getValue(String key) {if(PROPERTIES.containsKey(key)){return PROPERTIES.get(key);}return null;}@Overridepublic 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 myselfString 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