当前位置: 首页 > 工具软件 > MicroProfile > 使用案例 >

您自己的MicroProfile Config来源

卫皓
2023-12-01

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 Centralgithub中提供了上述内容,因此您也可以直接使用它。

只需将其添加到您的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

 类似资料: