上海客户上线的这个产品直到现在都还有很多可以记录的东西。今天来说点多套应用多套配置文件的事情。
产品有多个应用,每个应用的配置文件还挺多的。客户要求应用集群化,我们的做法是部署多套应用,数据共享。比如我有一个wsp应用,8个节点,那就要8个工程包。其实我们有3种应用,总共就是要24个工程包(捂脸....),所以客户说这样不行,到时运维就很麻烦。也是的,单种应用的代码全都相同的,就是若干配置不一样。
一开始在程序中是有标识符来指明节点在集群中的身份的,每个节点的标识不能重复。我们使用的是weblogic,一个域只部署一个应用,客户提出可以用ip+端口来标识一个应用,想法可以,实际过程中我们发现获取端口是比较麻烦的,一个运行中的程序是不知道它所在的server的端口是多少。
既然无法动态的知道服务器端口,那就人为地在服务器上加标识,让程序在启动的时候从系统变量里读取。示例:
void initSeverFlag() {
String serverFlag = System.getProperty("server.flag");
if (StringUtils.isEmpty(serverFlag)) {
logger.warn("-------------- 未能获取唯一服务器标识,启动失败,请检查wls或tomcat的启动参数:-Dserver.flag--------------");
System.exit(0);
}
}
很简单的用System.getProperty("server.flag")中获取。这家伙可以获取到JVM和操作系统的一些参数。例如:
java.version Java 运行时环境版本
java.vendor Java 运行时环境供应商
java.vendor.url Java 供应商的 URL
java.home Java 安装目录
java.vm.specification.version Java 虚拟机规范版本
java.vm.specification.vendor Java 虚拟机规范供应
java.vm.specification.name Java 虚拟机规范名称
java.vm.version Java 虚拟机实现版本
java.vm.vendor Java 虚拟机实现供应商
java.vm.name Java 虚拟机实现名称
java.specification.version Java 运行时环境规范版本
java.specification.vendor Java 运行时环境规范供应商
java.specification.name Java 运行时环境规范名称
java.class.version Java 类格式版本号
java.class.path Java 类路径
java.library.path 加载库时搜索的路径列表
java.io.tmpdir 默认的临时文件路径
java.compiler 要使用的 JIT 编译器的名称
java.ext.dirs 一个或多个扩展目录的路径
os.name 操作系统的名称
os.arch 操作系统的架构
os.version 操作系统的版本
file.separator 文件分隔符(在 UNIX 系统中是“/”)
path.separator 路径分隔符(在 UNIX 系统中是“:”)
line.separator 行分隔符(在 UNIX 系统中是“/n”)
user.name 用户的账户名称
user.home 用户的主目录
user.dir 用户的当前工作目录
JVM中并没有一个叫server.flag的参数呀。没错,这个是自定义的。在myeclipse中配置在这里
在weblogic中,找到/home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/bin下的startWeblogic.sh,编辑添加以下内容。
需要注意的是变量都是以 -D 开头的,但是getProperty时,不需要加上 -D ,否则取不到。
这样的话,我就可以把所有的配置文件都放在一起,命名时用和server.flag作为前缀,程序load配置时,根据server.flag加载就没错了。比如,之前wsp1程序有个配置叫config.properties,wsp2程序也有个config.properties,两个的代码完全相同。所以现在就可以弄成wsp1_config.properties,wsp2_config.properties,放在一起,名为"wsp1"的变量的服务器启动时,自动地获取到wsp1,自动根据wsp1去找wsp1_config.properties,照样正常运行。
如此一来,便实现了一套代码,多套配置,减轻了升级时的压力。一个好的程序不光要代码好写,还要设计合理,考虑到部署方便,拓展容易。
元宵快到了,自从工作后就没有回去过元宵,今天要和老婆一起回去。祝大家元宵快乐