Configuração de sistemas Java - como remover a dor

Ler configurações via interface Java
Ler configurações via interface Java

Problema

Se você desenvolveu pelo menos uma vez um grande sistema em Java e o suportou, então, com certeza, você encontrou o inconveniente de configurar certos processos no sistema. 





A saber: os tamanhos dos vários buffers; parâmetros de caixa de correio; host, porta, login, senha para chamar serviços externos; todos os tipos de tempo limite e muito mais.





Cada vez que não é comum mudar tudo isso no código, reconstrua-o e re-role-o para real.





Naturalmente, todos esses parâmetros precisam ser transferidos para os arquivos de configuração e lidos a partir deles - todo mundo faz isso.





Em Java, fora da caixa, há certas propriedades para isso. Mas usá-lo é extremamente inconveniente. Em primeiro lugar, o UTF-8 não funciona lá e, em segundo lugar, se você alterou qualquer parâmetro no arquivo de configuração, o aplicativo deve ser reiniciado para que o novo valor entre no sistema. E se você não quiser reiniciá-lo, ou não for possível às 11h - horário de pico. E adiar para mais tarde não é uma opção - você precisa disso com urgência. O que fazer? É necessário que as configurações sejam relidas "a quente", ou seja, sem reiniciar o sistema.





E também é muito importante: você precisa inventar de alguma forma para que os nomes dos parâmetros de configuração no código do programa correspondam aos do arquivo. Isto é, para dificultar o erro. Normalmente eles usam constantes para isso - ajuda, mas eu gostaria de algo mais conveniente, mais simples e mais flexível.





: , . . ? ? , ? ? ? ? — ? , ? , - …





.





- , , — , . .





— - , - - ( IDE ) — — .





, - (), - — - , .





greetgo! , — .





Java- , , , . — . , — — .





updateTimeout batchSize — . Java-:





public interface MyMigrationConfig {
  long updateTimeoutMs();
  int  batchSize();
}
      
      



:





@Description("    ");
public interface MyMigrationConfig {
  @Description("      ."
               + "    ,    "
               + "   ")
  @DefaultLongValue(30000)
  long updateTimeoutMs();

  @Description("     ")
  @DefaultIntValue(150)
  int batchSize();
}
      
      



- , , , , :





@Autowire
private MyMigrationConfig config;
 
public void migrate() {
  // ...
  System.out.println(" updateTimeoutMs = " + config.updateTimeoutMs());
  System.out.println(" batchSize       = " + config.bachSize());
  // ...
}
      
      



, .





, . . , production ready. — MIT.





greetgo conf — maven github: https://github.com/greetgo/greetgo.conf





, :





public class MyConfigFactory extends FileConfigFactory {
  @Override
  public Path getBaseDir() {
    return Paths.get("/path/to/directory/where/config/files/are/located");
  }

  @Override
  protected String getConfigFileExt() {
    return ".conf";
  }
}
      
      



createConfig:   





MyConfigFactory confFactory = new MyConfigFactory();

MyMigrationConfig config =  confFactory.createConfig(MyMigrationConfig.class);
      
      



. MyMigrationConfig.conf. , , :





# Created at 2021-01-29 11:03:21
#     

#    
batchSize=150

#       .   
# ,       
updateTimeoutMs=30000
      
      



. — , , ( ), .





kubernetes. , , Zookeeper, FileConfigFactory AbstractZookeeperConfigFactory, Zookeeper.





JdbcConfigFactory — .





, -.





@FirstReadEnv — , — kubernetes .





Isso é tudo. Obrigado pela atenção.












All Articles