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