JavaEE解决方案配置最佳实践

JavaEE解决方案配置最佳实践,java,jakarta-ee,jboss,glassfish,apache-tomee,Java,Jakarta Ee,Jboss,Glassfish,Apache Tomee,我们构建了三层企业解决方案,这些解决方案通常由多个webapp和ejbjar模块组成,这些模块都与数据库通信,并具有多个外部集成点 每个模块通常需要自己的配置,这些配置可以在解决方案的生命周期内更改。 部署它成了一场噩梦,因为现在我们有18个属性文件,必须记住要复制它们,并配置它们,同时还要设置数据源、队列、内存需求等 我对有更好的办法抱有希望,但并不乐观。 我们考虑/使用的一些选项,每个选项都有其优缺点: 使用多个maven项目和持续集成(例如hudson或jenkins)构建一个配置jar,

我们构建了三层企业解决方案,这些解决方案通常由多个webapp和ejbjar模块组成,这些模块都与数据库通信,并具有多个外部集成点

每个模块通常需要自己的配置,这些配置可以在解决方案的生命周期内更改。 部署它成了一场噩梦,因为现在我们有18个属性文件,必须记住要复制它们,并配置它们,同时还要设置数据源、队列、内存需求等

我对有更好的办法抱有希望,但并不乐观。 我们考虑/使用的一些选项,每个选项都有其优缺点:

  • 使用多个maven项目和持续集成(例如hudson或jenkins)构建一个配置jar,其中包含每个环境(dev、qa、prod)的所有属性文件,然后将所有内容打包为一个EAR。但是,在生产中,当需要时,事情是不容易改变的
  • 将大多数设置放在数据库中,并有一个简单的屏幕来修改它。在内部,我们可以有一个通用配置服务EJB,它可以读取和修改值。每个模块都可以有一个自定义的扩展版本,该版本具有特定的getter和setter
  • 版本控制所有属性文件,然后在生产时将其签出,并在进行更改后将其签入生产分支

  • 有了所有这些,您仍然需要以特定于容器的方式配置数据源和队列等:(

    使用一个简单的数据库表(Section、Key、Value)。如果需要,添加“Version”,并使用
    getInt(String Section、String Key)

    不需要做很多工作,而且它使应用程序代码非常整洁,并且很容易调整配置

  • С考虑将自定义配置对象绑定到
    JNDI
    。然后在应用程序中查找此对象以对其进行配置。好处-您可以使用自定义配置对象,而不是非常通用的
    映射
    属性
  • 另一种方法是使用
    JMX
    来配置所需的应用程序。好处-您可以将必须配置的对象直接绑定到
    MBean服务器
    ,然后使用
    jconsole
    visualvm
    等知名工具来配置应用程序的组件

  • 这两种方法都支持在运行时对应用程序进行动态重新配置。我更喜欢使用
    JMX

    我已经经历了几个寻找方法的周期。我仍然没有明确的答案

    最后一个周期以基于属性文件的进程结束。其思想是,每个服务器实例都配置了一个配置了所有内容的属性文件。该文件由启动脚本、应用程序服务器和应用程序本身读取,以设置内存参数

    但关键是,该文件不是直接管理的。相反,它是构建过程的产物。我们有一系列用于不同目的的文件,保存在版本控制中,并有一个构建步骤合并了相应的文件。这使您能够考虑到沿不同轴共享的共性

    例如,我们有开发、持续集成、QA、UAT、登台和生产环境,每个环境都有自己的数据库。不同环境中的服务器需要不同的数据库设置,但给定环境中的每个服务器使用相同的设置。因此,有一些类似于development-db.properties、QA-db.properties和so on.在每个环境中,我们都有几种服务器—web服务器、内容管理服务器、批处理服务器等。每种服务器都有JVM设置、堆大小等,这些设置与其他类型的服务器不同,但在不同环境中的服务器之间是一致的。因此,我们有一些类似于web-JVM.properties、cms-JVM.properties、批处理的设置-我们还有一种方法可以覆盖特定的系统——production-cms-jvm.properties之类的东西。我们还有一个设置公共属性的common.properties,以及可以在需要时覆盖的合理默认值

    我们的构建过程实际上比从每个集合中选择正确的选项要复杂一些;我们为每个环境中的每个服务器都有一个主文件,其中指定了要包含的其他文件。我们允许文件指定要包含的其他文件,因此我们可以构建一个导入图以最大限度地重用


    结果非常复杂。我认为太复杂了。但它确实起了作用,而且它确实使得以可控的方式对许多服务器进行更改非常容易。我们甚至合并了一组来自开发的输入文件,以及一组来自运营的输入文件,其中包含敏感信息。这是一种非常灵活的方法。

    g可选配置文件格式:编写一个scala特性。然后,您的配置文件可以是一个scala文件,在服务器启动时编译和评估。

    我知道这已经得到了回答,我的回答不一定是泛泛的,但以下是我的看法:

    注意,这里我只考虑系统/资源属性,而不考虑应用程序设置。在我看来,应用程序设置(如支付阈值或其他设置)应存储在数据库中,以便可以重新配置系统,而无需重新启动服务或通过重新部署或读取属性文件导致停机)

    对于影响系统不同部分如何相互连接的设置(如web服务端点等),我将使用JNDI树

    然后,数据库连接和JMS连接将使用Websphere控制台进行设置,并可由Websphere管理员进行管理。这些还可以创建为JACL脚本,必要时可将其放入版本控制中

    除了JNDI资源之外,对于其他属性,例如对后端的web服务调用的用户名,
        import javax.sql.DataSource;
        import org.apache.commons.configuration.DatabaseConfiguration;
    
        public class MYConfig extends DatabaseConfiguration {
    
            public MYConfig(DataSource datasource) {
                super(datasource, "TABLE_CONFIG", "PROP_KEY", "PROP_VALUE");
            }
        }
    
        import javax.sql.DataSource;
        import org.apache.commons.configuration.DatabaseConfiguration;
    
        public class MYConfig extends DatabaseConfiguration {
            final DatabaseConfiguration audit;
    
            public MYConfig(DataSource datasource) {
                super(datasource, "TABLE_CONFIG", "PROP_KEY", "PROP_VALUE");
    
                audit = new DatabaseConfiguration("TABLE_CONFIG_AUDIT", "PROP_KEY", "PROP_VALUE");
            }
            @Override
            public void addProperty(String key, Object value) {
                Object wasValue = super.getProperty(key);
                super.addProperty(key, value); 
                audit.put(key,wasValue);//add version code
            }
        }