首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring Web 服務模擬器框架:大型分散式專案的解耦利器

     編輯:Java 相關知識

大型 Web 專案常由多地團隊並行開發,介面契約 (WSDL/JSON) 確立後,後端服務往往尚未就緒。本文提出基於 Spring 2.0 的模擬器框架,讓前端團隊獨立開發測試,並支援功能/效能/負面測試、SLA 延遲模擬、服務儀表板監控。

模擬器 vs Stub 對比

維度Stub (本地存根)模擬器 (遠端模擬)
程式碼路徑繞過網路層,直接呼叫本地方法完整走網路棧 (HTTP/SOAP/JSON),真實驗證編組/解組
應用程式感知需知曉「Stub 模式」切換邏輯僅改端點 URL,應用程式零感知
測試深度單元/整合測試端到端功能、效能、負面測試
部署彈性編譯期綁定執行期動態切換 (真實/模擬)

結論:模擬器雖較重,但能盡早暴露介面整合、序列化、效能等真實問題。

框架六層架構

  1. Web 服務層:依 WSDL 產生 Server/Client 骨架 (RAD 向導)。
  2. 儀表板層:JSP + Ajax (IBM Web 2.0 Feature Pack RPC Adapter) 捕獲輸入、顯示回應。
  3. 客戶端服務層:組裝 SOAP 請求物件,呼叫模擬器端點 (從 WebSphere Resource Environment Provider 取得)。
  4. 模擬器服務層:從請求提取鍵值 (如 Equipment ID) → 呼叫處理層 → 回傳 POJO 回應。
  5. 處理層:Spring XmlBeanFactory 讀取 XML → 轉換 POJO、注入延遲 (模擬 SLA)、預設值回退。
  6. 資料層:XML 檔案庫 (符合 spring-beans-2.0.xsd),每個測試場景一檔。

模擬器框架架構圖

關鍵技術實現片段

1. RPC Adapter 設定 (web.xml)


<servlet>
  <servlet-name>RPCAdapter</servlet-name>
  <servlet-class>com.ibm.websphere.rpcadapter.RPCAdapter</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>RPCAdapter</servlet-name>
  <url-pattern>/RPCAdapter/*</url-pattern>
</servlet-mapping>

2. RpcAdapterConfig.xml 映射服務實作


<services>
  <pojo>
    <name>AccountSearchImpl</name>
    <description>com.simulator.service.AccountSearchImpl</description>
    <methods filter="whitelisting">
      <method>
        <name>getAccountsByEquipment</name>
        <parameters>
          <parameter><name>request</name>...</parameter>
          <parameter><name>equipId</name>...</parameter>
        </parameters>
      </method>
    </methods>
  </pojo>
</services>

3. 客戶端服務呼叫模擬器


public ESIGetAccountsByEquipmentResponseType getAccountByEquipment(
    HttpServletRequest req, String endPoint, String equipId) {
    ESIGetAccountsByEquipmentRequestType request = new ...();
    request.setEquipment(new Equipment(equipId));

    AccountSearch service = (AccountSearch) new InitialContext()
        .lookup("java:comp/env/service/AccountSearch");
    AccountSearchPort port = service.getPort(AccountSearchPort.class);
    ((Stub)port)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, endPoint);
    return port.getAccountsByEquipment(request);
}

4. 模擬器服務層:鍵值提取與預設回退


public ESIGetAccountsByEquipmentResponseType getAccountsByEquipment(
    ESIGetAccountsByEquipmentRequestType input) {
    String simKey = input.getEquipment().getSim(); // 提取鍵值
    try {
        return (ResponseType) DataGenerator.getDataByBeanId(
            "ESIGetAccountsByEquipmentResponseType",
            ACTION_KEY_EQUIPMENT, simKey);
    } catch (BeanDefinitionStoreException e) {
        // 找不到對應 XML → 回退預設場景
        return (ResponseType) DataGenerator.getDataByDefault(
            "ESIGetAccountsByEquipmentResponseType",
            ACTION_KEY_EQUIPMENT, DEFAULT_EQUIPMENT_CODE);
    }
}

5. 處理層:Spring XML → POJO + 延遲注入


public static Object getDataByBeanId(String beanId, String action, String key) {
    String xmlFile = resolveXmlFile(action, key); // 如 simulator/xml/Account/ACT123.xml
    XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource(xmlFile));
    Object pojo = factory.getBean(beanId);

    // 延遲注入 (模擬 SLA 響應時間)
    String latency = getEnvProperty("AccountSearch.Latency"); // 如 "500" ms
    if (latency != null) Thread.sleep(Integer.parseInt(latency));

    return pojo;
}

6. 資料層 XML 範例


<beans xmlns="https://www.springframework.org/schema/beans" ...>
  <bean name="ESIGetAccountsByEquipmentResponseType"
        class="com.simulator.eo.account.ESIGetAccountsByEquipmentResponseType">
    <property name="accountSummary">
      <bean class="com.simulator.eo.account.AccountSummaryType">
        <property name="ssn" value="123-45-6789"/>
      </bean>
    </property>
  </bean>
</beans>

WebSphere Resource Environment Provider 設定

將環境相關參數 (端點 URL、XML 目錄、延遲、啟用旗標) 存於 WAS 管理主控台,而非屬性檔,支援叢集同步與熱更新:

屬性名範例值用途
AccountSearch.Endpointhttps://localhost:10000/Simulator/services/AccountSearch模擬器端點
Simulator.DirectoryC:\simulator\xml\XML 資料根目錄
AccountSearch.Latency500模擬延遲 (ms)
AccountSearch.Enabledtrue總開關

JSP/Java 透過 EnvironmentProviderUtility.getWebServiceEnvironmentAttribute("AccountSearch.Endpoint") 讀取。

模擬器價值總結

  • 並行開發解耦:前端不等後端,依契約獨立交付。
  • 測試左移:單元/功能/效能測試提前介入,降低整合風險。
  • 負面測試:輕鬆構造錯誤碼、逾時、資料不全等真實環境難重現場景。
  • SLA 驗證:延遲注入模擬生產效能基線,配合負載工具做真實壓測。
  • 儀表板雙用:同一 UI 可測試模擬器與真實服務,做回歸對比。

框架初期投入較大,但跨專案生命週期 ROI 極高,已成電信/金融大型 SOA 專案標準基建。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved