您自己的MicroProfile Config来源
MicroProfile配置 ,即一部分MicroProfile規(guī)格,是Java Enterprise和微服務(wù)配置的標(biāo)準(zhǔn)化。
開箱即用(即,對(duì)于規(guī)范定義的所有實(shí)現(xiàn)都是強(qiáng)制性的)有3種方法來定義您的配置:
- System.getProperties()
- System.getenv()
- 類路徑上的所有META-INF/microprofile-config.properties
該ordinal這些配置資源的決定,系統(tǒng)將尋找一個(gè)特定屬性的順序。
因此,如果您具有config屬性,其關(guān)鍵字為myservice.hostname ,則將其注入代碼中:
@Inject @ConfigProperty(name = "myservice.hostname", defaultValue = "localhost")private String myServiceHostname;系統(tǒng)將首先查看是否存在具有關(guān)鍵字myservice.hostname的System屬性,否則將嘗試環(huán)境變量,然后嘗試類路徑上的所有microprofile-config.property文件。 如果在任何地方都找不到它,它將回defaultValue注釋中的defaultValue 。
您自己的配置源。
您還可以提供自己的配置源,并定義該源的加載順序。 Config Api使用SPI加載所有配置源,因此創(chuàng)建自己的源非常容易。
例如,假設(shè)我們要首先加載一個(gè)源(即在系統(tǒng)屬性之前發(fā)生事件),然后將這些配置值存儲(chǔ)在內(nèi)存中,則可以編寫一個(gè)擴(kuò)展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;}}(在此處查看完整的源代碼)
您還(根據(jù)SPI)通過在名為org.eclipse.microprofile.config.spi.ConfigSource的文件中添加條目,在META-INF/services注冊實(shí)現(xiàn)。
com.github.phillipkruger.microprofileextentions.config.MemoryConfigSource( 這里有完整的示例)
上面是一個(gè)非常簡單的示例,只是將配置值保留在靜態(tài)映射中。 然后,您可以創(chuàng)建一個(gè)JAX-RS服務(wù)( 示例 )以在此映射中添加和刪除值。
但是,如果您想要更復(fù)雜的配置源怎么辦? 本身需要配置嗎?
使用MicroProfile Config配置您自己的MicroProfile Config源。
例如,如果我們想要一個(gè)在etcd中找到值的Config源,我們還需要配置etcd服務(wù)器的詳細(xì)信息。 好消息是我們可以為此使用Config Api!
但是,“配置源”實(shí)現(xiàn)不是CDI Bean,因此不能@Inject值。 您還需要忽略自己(即,在配置源時(shí)不要看源,否則您將陷入無休止的循環(huán))
在沒有CDI的情況下獲取配置非常容易:
Config config = ConfigProvider.getConfig();(感謝友好的MicroProfile Google小組的 Rudy De Busscher和其他人的幫助)
因此,現(xiàn)在我們只需要確保忽略自己即可:
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是您自己的配置源的名稱。
( 這里有完整的示例)
現(xiàn)在,我可以使用任何其他配置源選項(xiàng)來定義我的etcd服務(wù)器的服務(wù)器詳細(xì)信息。
運(yùn)行示例。
我正在Payara-micro上運(yùn)行示例 (但它應(yīng)適用于任何MicroProfile實(shí)現(xiàn))。
使用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服務(wù)器主機(jī)名更改為其他名稱。
我還可以使用其他任何配置源來執(zhí)行此操作,例如,在示例war文件(如本示例 )中包含microprofile-config.properties ,或使用其他自定義配置源并在內(nèi)存中進(jìn)行更改。
用作庫。
您還可以將所有這些捆綁在一個(gè)jar文件中,以供您的任何項(xiàng)目使用。 我在maven Central和github中提供了上述內(nèi)容,因此您也可以直接使用它。
只需將其添加到您的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
總結(jié)
以上是生活随笔為你收集整理的您自己的MicroProfile Config来源的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯云DDOS(ddos腾讯云清退)
- 下一篇: 使用混合多云每个人都应避免的3个陷阱(第