上海客戶上線的這個產品直到現在都還有很多可以記錄的東西。今天來說點多套應用多套配置文件的事情。
產品有多個應用,每個應用的配置文件還挺多的。客戶要求應用集羣化,我們的做法是部署多套應用,數據共享。比如我有一個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,照樣正常運行。
如此一來,便實現了一套代碼,多套配置,減輕了升級時的壓力。一個好的程序不光要代碼好寫,還要設計合理,考慮到部署方便,拓展容易。
元宵快到了,自從工作後就沒有回去過元宵,今天要和老婆一起回去。祝大家元宵快樂