我想为DropWizard提供几个yaml文件。其中一个包含敏感信息,另一个包含非敏感信息。
你能指点我在DropWizard中如何使用多个配置的文档或示例吗?
答案 0 :(得分:8)
ConfigurationSourceProvider
是你的答案。
bootstrap.setConfigurationSourceProvider(new MyMultipleConfigurationSourceProvider());
以下是dropwizard does it by default的方法。您可以根据自己的喜好轻松更改它。
public class FileConfigurationSourceProvider implements ConfigurationSourceProvider {
@Override
public InputStream open(String path) throws IOException {
final File file = new File(path);
if (!file.exists()) {
throw new FileNotFoundException("File " + file + " not found");
}
return new FileInputStream(file);
}
}
答案 1 :(得分:5)
首先,您将在.yml
中编写另一个yml文件路径。
sample.yml
configPath: /another.yml
another.yml
greet: Hello!
只需使用SnakeYaml即可解决。
public void run(SampleConfiguration configuration, Environment environment) {
Yaml yaml = new Yaml();
InputStream in = getClass().getResourceAsStream(configuration.getConfigPath());
AnotherConfig anotherConfig = yaml.loadAs(in, AnotherConfig.class);
String str = anotherConfig.getGreet(); // Hello!
...
}
对于敏感信息,我认为使用环境变量是好的。
例如,使用dropwizard-environment-config
https://github.com/tkrille/dropwizard-environment-config
答案 2 :(得分:5)
理想情况下,您应该通过将敏感信息或可配置数据放在环境变量中来配置应用,而不是管理多个文件。请参阅配置中的十二个因子规则:http://12factor.net/config
要在Dropwizard中启用此方法,您可以使用-Ddw
标志在运行时使用环境变量覆盖您的配置:
java -Ddw.http.port=$PORT -jar yourapp.jar server yourconfig.yml
或者你可以使用这个方便的添加:https://github.com/tkrille/dropwizard-template-config将环境变量占位符放在你的配置中:
server:
type: simple
connector:
type: http
# replacing environment variables
port: ${env.PORT}
上述两种解决方案都与Heroku和Docker容器兼容,其中环境变量仅在您运行应用程序时可用。