系統資訊定義: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. 可能為公開文件,故隱其名。

results matching ""

    No results matching ""