2015-02-25 30 views

cevap

5

İlk olarak, .yml numaralı belgede başka bir yml dosya yolu yazacaksınız.

sample.yml

configPath: /another.yml 

another.yml

greet: Hello! 

ve sadece SnakeYaml kullanarak çözülecektir.

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! 
... 
} 

Hassas bilgiler için, ortam değişkenini kullanmanın iyi olduğunu düşünüyorum.

Örneğin,
https://github.com/tkrille/dropwizard-environment-config

+0

Bu yalnızca özel yapılandırmalar için çalışır. Ancak, dropwizard'ın kendisini etkileyecek sunucu yapılandırmasını söyleyebilselerdi, o zaman işe yaramaz. Örneğin, bir kişi https sertifikasının gizli anahtar parolasını gizlemek isteyebilir. – Natan

5

ConfigurationSourceProvider Cevabınız dropwizard-ortam-config kullanın.

bootstrap.setConfigurationSourceProvider(new MyMultipleConfigurationSourceProvider()); 

Aşağıdakiler şu şekildedir: dropwizard does it by default. Kendi isteğinize göre kolayca değiştirebilirsiniz.

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); 
    } 
} 
+0

'MyMultipleConfigurationSourceProvider' neye benziyordu? Birkaç dosyadan nasıl veri sağlayabileceğine dair net bir resmim yok. Açıklamak ister misiniz? –

+0

Sanırım iki dosya okuyordu (ya kodlanmış ya da 'path' parametresinden gelen '|' ayrılmış dosyalar), bunları bir “InputStream” ile bir araya getirip döndürüyordu. – Natan

+0

Hızlı cevap için teşekkürler! Doğru anlarsam, bunun önemli bir etkisi olur, değil mi? Örneğin, her dosyanın kökünde bulunan alanlar, potansiyel olarak çarpışmalarla "ana yeniden yapılandırılmış" dosyanın kökünde sona erer. –

4

İdeal ortam değişkenleri içindeki hassas bilgiler veya yapılandırılabilir veri yerleştirme yerine birden fazla dosya yöneterek uygulamanızı konfigüre edilmelidir. Eğer -Ddw bayrağını kullanarak çalışma zamanında ortam değişkenleri ile yapılandırma geçersiz kılabilir ya http://12factor.net/config

Dropwizard bu yaklaşımı etkinleştirmek için:: yapılandırmasına oniki faktör kuralı bakın

java -Ddw.http.port=$PORT -jar yourapp.jar server yourconfig.yml 

veya bu kullanışlı eklenti kullanabilirsiniz tarih:

server: 
    type: simple 
    connector: 
    type: http 
    # replacing environment variables 
    port: ${env.PORT} 

yukarıdaki çözümlerin Hem Heroku ve Docker kapları ile uyumludur, Çevre: https://github.com/tkrille/dropwizard-template-config config içine ortam değişkeni tutucuları koymak Değişken sadece uygulamayı çalıştırdığınızda kullanılabilir.

+1

Sevmeyin. Env varlarınızı nerede koruyorsunuz? Demek istediğim, hangi senaryo onları ayarlıyor? Belki de uygulamayı başlatan bir bash senaryosu olacak ve önce tüm env vars'ı ayarlayacaksınız. Şimdi, her bir betiğin env vars'ın farklı bir kümesine sahip olduğu her ortam için (dev, qa, stage, prod, vb.) Birden çok betiğe ihtiyacınız var. Bu betiklerin revizyon kontrollü olması gerekiyor. Ama şimdi bu komut dosyaları sadece yapılandırma dosyaları. Bu noktada, neden sadece değişkenlerle (bir özellik dosyası ya da yaml veya json, ne olursa olsun) bir dosyaya sahip olmuyor ve bunları env var adımında okuyorsunuz? –

+0

Evet, env varslarının ayarlanması gerekir, ancak her bir dağıtım için değil, her bir dağıtıma sahip olmanıza gerek kalmaması gibi. Komut dosyalarını kullanabilir ya da Pupplet, Chef, Ansible vb. Gibi – yunspace

+0

yapılandırma araçları vardır. Nihayetinde fikir, Dev endişelerinizi Ops'den ayırmanızdır, böylece kimlik bilgileri kaynak koduna göre kontrol edilmez. bağımsız olarak denetlenir ve bu ortam değişiklikleri, her bir kaynak kodu yapılandırma dosyasına kazmak yerine altyapı düzeyinde yapılabilir. Paylaşılan değişken dosyaları sahip olmak da işe yarayabilir, ancak bu nasıl daha iyi olur? Yapılandırma kodunuzun her hizmette değişkenlerde okunması gerektiği anlamına gelir; burada DW yapılandırması Env Var'ı kutudan çıkarır. Ayrıca Env Vars, Docker/Heroku – yunspace

İlgili konular