系統資訊定義:SystemConfig
透過UDE的SystemConfig元件,可以取得應用系統的基本資訊。應註冊 com. iisigroup. ude. system. impl. SystemConfigImpl,但 UdeBasicConfiguration 已包含相關宣告,如需客製化自訂系統資訊,才需要實作 SystemConfigResolver 並覆寫定義。
SystemConfig.getSystem(),可以得到實作 ISystem 介面的基本系統資訊。其中可取得 systemId(系統別代碼,預設來自systemProperties定義)及uniqueId(系統識別碼),uniqueId 應為一組可標示此系統實例的唯一編碼。
SystemConfig.getEnvironment(),可以取得UDE執行環境層級,請參考後續章節說明。
自訂系統資訊
UDE預設的系統資訊(ISystem)實作為BaseSystem,以UDE基礎環境變數的 ${system.id} 做為systemId(系統別代碼)及uniqueId,這足以應付多數小型系統的需求。
但在大型專案中,基本的systemId (系統別) 不足以代表一個系統的唯一識別,因為可能會有多點佈署、負載平衡等情境。
以 XXX 資訊系統1為例,除了基本的系統別 RL/ML/OP(運作管理)等等外,還需加上佈署主機代碼、系統所屬區域代碼,才能完整定位出服務的所在位置。
所以專案可以實作 ISystem 或繼承 BaseSystem 以定義自已所需的系統資訊;並且實作SystemConfigResolver 產出對應的實例物件。
- RxxBasicConfiguration
public class RxxBasicConfiguration extends UdeBasicConfiguration {
public RxxBasicConfiguration() {
super.setSystemConfigResolver(new RxxSystemConfigResolverImpl());
}
}
系統資料範例:RisSystemLocal
以 XXX 系統共用的系統資訊物件為例。其中系統別資訊,由通用的字串改用Enum型別,所以額外提供getRxxSystem()。getUniqueID() 以orerride 定義專用實作,以系統別(systemId)、佈署主機(serverName)、使用者區域(hostCode)定義一組系統的唯一識別碼。
public class RxxSystemLocal extends BaseSystem implements Serializable {
final RxxSystem rxxSystem;
final String serverName;
public RxxSystemLocal(final RxxSystem system, final String serverName) {
super(system.getSystemId());
this.rxxSystem = system;
this.serverName = serverName;
}
public RxxSystem getRxxSystem() {
return this.rxxSystem;
}
public String getSystemName() {
return this.rxxSystem.getSystemName();
}
public String getServerName() {
return this.serverName;
}
@Override
public String getUniqueID() {
final RisUser user = (RisUser) CurrentUserUtils.get();
if (user != null && user.getSite() != null) {
final String hostCode = user.getSite().getHostCode();
return this.rxxSystem.name() + this.serverName + hostCode;
} else {
return this.rxxSystem.name() + this.serverName + "-";
}
}
}
系統Resolver範例:RxxSystemConfigResolverImpl
為產出RxxSystemLocal資料,在此解析器中需做兩件事。
- 一是將 ${system.id} 轉換為對應的RxxSystem Enum。
- 另一件事是決定佈署主機(ServerName),
在這邊,我們利用 JAVA 環境變數進行設定 ServerName,也就是在啟動 JVM 時加上參數:-DSERVER_NAME=SRV1。所以可以用 Spring 的@value將此值注入到 serverName。
@Value("$" + "{SERVER_NAME:SRV0}") // 指定預設值為 SRV0,FOR 開發環境
private String serverName;
@PostConstruct
private void init() {
// ! 系統別
final RxxSystem rxxSystem = RxxSystem.lookup(this.getSystemId());
// ! 佈署主機(ServerName)
final String serverName = StringUtils.defaultString(this.serverName, "SRV0");
// ! 取用簡碼如 : 0 / 1 / ...
this.shortServerName = StringUtils.right(serverName, 1);
this.system = new RxxSystemLocal(rxxSystem, this.shortServerName);
// ! 其它系統初始內容
}
自訂環境層級
UDE預設環境層級定義分為4級,可使用全名或簡寫設定:
- DEVELOPMENT/DEV 開發環境。
- SIT 整合測試(System Integration Test)
- UAT 驗收測試(User Acceptance Test)
- PRODUCTION/PROD 正式系統環境
如果一些較複雜的設定模式,礙難規劃在外部設定檔定義。 環境層級定義可以用於 HARDCODE 判斷目前系統部署的環境層級。以下是幾個使用原則與使用時機。
- 逼不得已才使用。
- 避免用於辨別「正式環境」跟「與其最接近的測試環境」。例如:若專案沒有規劃常規的uat測試,就不要以hardcode方式判斷目前執行環境是否為 UAT,不然容易成為正式環境漏洞的製造者。
- HARDCODE設定錯誤會使專案無法啟動,但還是可以經由外部調整修正無需重新編譯、佈置者。(因為有些業主的版更程序較嚴謹。) 例如,資料庫連線的jndi名稱寫錯,但佈版失敗時,可以直接在ap-server臨時新增一組應急。
- 識別開發環境,部分高負載的除錯記錄,只有在DEV/SIT進行記錄;高風險或類似後門的測試程式,只允許在DEV/SIT執行。
若UDE預設層級無法滿足專案需求,也可以自行實作IEnvironment Enum定義,並藉由UdeBasicConfiguration設定。
<!-- public enum MyEnvironment implements IEnvironment -->
<bean class="com.iisigroup.ude.configuration.UdeBasicConfiguration">
<property name="environmentEnumClass" value="xxx.MyEnvironment" />
</bean>
1. 可能為公開文件,故隱其名。 ↩