Configuración de sistemas Java: cómo eliminar el dolor

Leer configuraciones a través de la interfaz Java
Leer configuraciones a través de la interfaz Java

Problema

Si al menos una vez desarrolló un sistema grande en Java y lo admitió, entonces, seguro, se ha encontrado con el inconveniente de configurar ciertos procesos en el sistema. 





A saber: los tamaños de los distintos búferes; parámetros del buzón; host, puerto, inicio de sesión, contraseña para llamar a servicios externos; todo tipo de tiempos muertos y mucho más.





Cada vez que no es común cambiar todo esto en el código, reconstruirlo y volverlo a hacer realidad.





Naturalmente, todos estos parámetros deben transferirse a los archivos de configuración y leerse desde allí; todos hacen esto.





En Java, de fábrica, hay ciertas Propiedades para esto. Pero usarlo es extremadamente inconveniente. En primer lugar, UTF-8 no funciona allí y, en segundo lugar, si cambió algún parámetro en el archivo de configuración, la aplicación debe reiniciarse para que el nuevo valor ingrese al sistema. Y si no desea reiniciarlo, o no es posible a las 11 a. M., Hora pico. Y posponer para más tarde no es una opción, lo necesita con urgencia. ¿Qué hacer? Es necesario que las configuraciones se vuelvan a leer "calientes", es decir, sin reiniciar el sistema.





Y también es muy importante: necesitas inventar de alguna manera para que los nombres de los parámetros de configuración en el código del programa correspondan a los del archivo. Es decir, para que sea difícil cometer un error. Por lo general, usan constantes para esto; ayuda, pero me gustaría algo más conveniente, más simple y más flexible.





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





.





- , , — , . .





— - , - - ( 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 .





Eso es todo. Gracias por su atención.












All Articles