當前位置:編程學習大全網 - 編程語言 - 用Spring Web Flow和Terracotta搭建Web應用

用Spring Web Flow和Terracotta搭建Web應用

 Spring Web Flow是Spring Framework中的web應用組件 它提供了壹種編寫有狀態和基於會話的web應用的簡便手段 Spring Web Flow使得邏輯流程成為Web應用中的壹等公民 它能讓妳定義為自包含模塊 以獨立於應用的其它部分來配置和重用

 Spring Web Flow引入了幾種有狀態數據域 request flash flow和conversation等 這讓妳能用新的方式來開發有狀態Web應用 它也提供了定制應用狀態管理的擴展點

 Terracotta for Spring是通過在多個JVM集群來給基於Spring的應用提供高可用性的運行時 它給Spring Web Flows的所有域都提供了透明的聲明式集群服務(普通的Spring beans同樣適用)

 在這篇文章中我們會首先給妳壹個Spring Web Flow和Terracotta for Spring的總體介紹 然後會向妳展示如何聯合使用這些技術來進入構建有狀態 基於會話 可擴展和高可用的Web應用的新領域

  什麽是Spring Web Flow?

 Spring Web Flow是Spring Framework中的web應用組件 它提供了壹種編寫有狀態和基於會話的web應用的簡便手段 Spring Web Flow使得邏輯流程成為web應用中的壹等公民 它能讓妳定義為自包含模塊 以獨立於應用的其它部分來配置和重用 它不依賴於框架從而能夠方便的與可選的web應用框架壹同使用 比如Spring MVC Struts或者JSF等

 頁面流轉使用壹種領域定義語言(DSL)來配置 這個語言專門開發用來定義和組合頁面流轉 目前的實現方式是XML和Java

 Spring Web Flow引入了能滿足多種用戶案例和需求的幾種有狀態數據域 request flash flow和conversation 這給妳開發有狀態web應用提供了很大的靈活性和能力

 這裏是 release中最有趣特性的快速概要

 在壹個地方而不是把邏輯分散在很多地方來定義應用任務的所有控制邏輯 比如壹個搜索流程

 把簡單的流轉組合在壹起來創建富控制模塊

 使用自然和面向對象的線性編程模型 而不是冗長的的if/else塊來定義嚴格的用戶導航規則

 但流轉結束或過期時自動清除妳在流轉執行中分配的內存

 在使用妳選擇的基礎web框架的Servlet環境中Deploy壹個可執行的流轉

 改變web框架(比如Struts Spring MVC JSF及其它)而不用修改流轉定義

 和環境壹起改變而不需要修改妳的流轉定義 比如從JUnit測試到Portlet

 開發時在不重啟容器的情況下不斷完善妳的應用導航規則

 自動正確響應瀏覽器按鈕(後退 前進 刷新)而不需要定制編程

 在 個受管理域中存儲任務數據 request flash flow 和 conversation等 每個都有自己的獨特語義

 脫離容器單獨測試流轉 能在部署前確保應用控制邏輯能正常運作

 使用Spring IDE 進行可視化編輯妳的流轉導航邏輯圖

 聽上去很有趣?到目前為止還僅僅是概念和理論 但我們很快會看到這些都能在實踐中應用 所以請多等壹會

 企業對擴展性和高可用性的需求

 集群在企業應用開發中變得越來越重要 開發人員經常會碰到這樣的問題

 我們如何在壹個節點上擴展來提高應用的可擴展性?

 如果保證高可用性和消除單點故障 如何確保我們能滿足客戶的SLAs(Service Level Agreement)?

 為了支撐業務 可預測的擴展性和高可用性是壹個生產應用必須展示的運行特性 壹些企業需要超過 %的正常運行時間 另壹些不要求這麽高 但所有的應用都需要保證SLA規定的可運行性 從預測的角度看 開發壹個系統在 %和 %級別是壹樣困難的

 集群壹直以來都是難以解決的問題 在Spring Web Flow和普通web應用上下文中 這尤其意味著保證用戶狀態的高可用性和故障恢復能力是滿足性能且值得信賴的 在壹個節點出現故障(應用服務器或JVM崩潰) 使用session粘滯(這是配置負載均衡最通用的首選方式)是壹個開始 但我們需要壹個有效手段來無縫的將用戶狀態從壹個節點遷移到另壹個節點

 當我們說集群時意味著什麽 它和緩存有什麽區別?我們使用的集群定義是: 在多個JMV間***享應用狀態 而緩存可以被定義為 讓應用狀態靠近執行上下文 從這個角度看 緩存是集群的壹個子集

  我們所認為的企業級Web/企業集群最小解決方案集至少需要包括

 可擴展性

 高可用性

 fail over

 性能

 對已有代碼的最小影響

 簡單的部署和配置

 可見運行時(監控)

 讓我們關註壹個能解決所有這些看上去無關的需求的解決方案 通常解決壹個問題有很多方案 而且市場上也有很多宣稱能給web應用提供高可用性的產品 Terracotta就提供了這樣壹個解決方案

  什麽是Terracotta for Spring?

 Terracotta for Spring是基於Spring應用的運行時 它為Spring應用提供了透明的高性能集群支持 對應用代碼和部署及配置流程影響都很小 它通過在應用下面的堆級別進行集群而不是直接集群應用

 這讓開發者能夠開發與無狀態方式不同的單節點有狀態Spring應用 這使得在需要擴展的應用開始設計時不考慮集群 而在應用需要擴展或者要保證搞可用性和故障恢復時 他們只需要在Terracotta配置文件中定義哪些Spring應用上下文中的beans需要進行集群 Terracotta for Spring使得應用能夠被自動和透明的集群 還保證在集群間的語義和單節點壹樣

 對於Spring Web Flow來說 這實際上更簡單 用戶為了獲得web應用的狀態和持續倉庫的集群能力 只需要在Terracotta配置文件中把特定的web應用聲明為啟用 session support (詳細內容見下面的章節 聲明式配置 )

 從宏觀上看 Terracotta for Spring提供了

 HTTP session狀態的集群 保證Spring Web Flow中的用戶狀態和擴展倉庫或放入HTTP session的其它狀態的高可用性和故障恢復能力

 Spring bean的集群 Springbean的生命周期語義和域在集群間被保存 它們在 邏輯 上相同的ApplicationContext中 目前能被集群的bean類型是singleton和session scoped 用戶可以聲明式配置哪個application contexts中的哪個bean需要被集群

 透明集群POJO 不需要修改已有的代碼 甚至不需要源代碼 應用基於很少的聲明式XML 配置文件 在載入期透明的生效 Terracotta for Spring不需要實現Serializable Externalizable或其它接口的類 能這樣實現的原因它並沒有使用序列化 而只是將實際的差量和已經改變了的數據傳輸給當前需要的節點(lazily)

 虛擬內存管理 它也提供分布式垃圾收集和虛擬堆功能 比如 由於物理內存在需要時被換入換出 它能在壹個 G RAM的機器上運行需要 G堆的Web應用 這也意味著妳不需要關心Spring Web Flow會話數據的大小是否超過了物理堆大小

  堆層次集群

 Terracotta for Spring使用aspect oriented技術來在類載入時適配應用 在這個階段它擴展了應用以保證Java語義在集群間被正確的維護 包括對象引用 進程調用和垃圾收集等

 我們在前面提到Terracotta並沒有使用serialization 這意味著任何Spring Web Flow維護的會話都可以在集群間***享 這也意味著Terracotta並沒有把會話狀態的全部對象圖發給所有節點 而是把圖分解成純粹的數據 並在網絡間傳輸實際的 差量 和改變 數據的 原始信息 在其它節點上

 因為有壹個記錄節點間相互引用的中心調度器(見下文) 它能以lazy的方式工作 而只把改變傳送到引用了這些 dirty 數據的節點 這需要使用局部引用 如果負載均衡配置為使用 session粘滯 就更有效率 因為這意味著很多數據可能永遠不會脫離實際的session而不用復制到其它節點

 這個架構是中心輻射的 也就是有壹個管理客戶端的中心調度器 在這裏客戶端就是妳配有Terracotta for Spring運行時的普通應用 調度器不是單點失敗的 但妳可以配置壹組備用調度器 並在主調度器崩潰時選擇壹個來接替 妳也可以獨立於客戶端 對調度器進行集群擴展

  構建壹個高可用的有狀態web應用

 這裏我們使用壹個叫Sellitem的示例應用來推動討論並展示給大家

 如何使用Spring Web Flow來構建壹個有狀態基於會話的web應用

 如何使用Terracotta for Spring來聲明式集群有狀態應用

 Sellitem示例應用可以在Spring Web Flow的發布版本中找到 (更多信息見文章末尾的 Resources 章節)

 使用Spring Web Flow實現壹個有狀態Web應用: Sellitem

 Sellitem是展示結合了有條件轉移 會話域 流程執行轉向和延續性的示例應用 用戶在幾個頁面間導航 可以定義貨物的價格 可以銷售的貨物數量 折扣比率 送貨詳情(如果需要)和最後查看所有信息

 我們不會通讀應用的所有源碼 而是主要介紹壹些關鍵概念 如怎麽配置Spring Web Flow輸出的不同標準服務(Bean)和怎麽定義頁面流轉(使用針對頁面流轉的Spring Web FlowDSL的XML版本)

  在Spring MVC中配置DispatcherServlet

 應用的入口是壹個標準的Spring MVC DispatcherServlet 它在web xml中註冊並在web application context中映射到

 sellitem 

  springframework web servlet DispatcherServlet

 contextConfigLocation

 /WEB INF/sellitem servlet config xml

 /WEB INF/sellitem webflow config xml

 sellitem

 

 DispatcherServlet配置在Spring的配置文件sellitem servlet config xml和sellitem webflow config xml中 sellitem servlet config xml中有壹個映射到 / 的控制器 它將所有該URL的請求轉發到Spring Web Flow系統(它的入口是壹個流程執行器)

  配置flow executor和flow registry beans

 Spring flowExecutor bean配置使用壹個flowRegistry bean來執行 /WEB INF/flows/ 目錄中的基於XML的流轉定義

  定義頁面流轉

 剩余的邏輯在我們已經註冊的flowRegistry bean的流轉定義中 (參照前面的 配置flow executor和flow registry beans章節)

 在深入流轉實現細節前 我們先看壹下頁面流轉的狀態圖(如下圖)

 從上面我們可以看到流轉在結束前經過了幾個步驟 在決定銷售是否需要送貨時有壹個決策狀態

 壹個很好的針對上面導航規則的初始流轉定義實現如下

 

 xmlns:xsi= instance

 xsi:schemaLocation=

 

  webflow xsd >

 

 我們從上面的定義可以看到 實際狀態與狀態圖中的狀態對應 狀態轉換與圖中的箭頭對應 sale bean是流轉開始時分配的流轉變量實例 它持有了Sale相關的屬性

 上面的定義展示了所有的導航邏輯 但還沒有實現任何應用行為 特別是在用戶提交時更新Sale Bean的邏輯還沒有實現 另外後臺的sale處理邏輯還沒有定義

 實現了所有必需行為的完整Spring Web Flow定義如下

 

 xmlns:xsi= instance

 xsi:schemaLocation=

  webflow xsd

 

 在定義導航邏輯之外 也定義了適時調用恰當應用行為的action 這包括處理用戶提交事件和調用後臺處理器來處理sale的邏輯

  Form綁定和驗證

 當進入展示表單的視圖狀態時 流轉調用壹個FormAction mand bean來進行表單的裝配和提交邏輯 在提交時 FormAction把用戶的請求參數綁定到相應的sale屬性上並同時驗證它們

  更多信息

 Spring Web Flow全部的代碼 文檔和 個示例應用(包括sellitem)都可以在Spring網站上找到

 集群Sellitem應用

 現在我們已經看過了如何使用Spring Web Flow來實現壹個有狀態web應用 接下來讓我們更高興的看如何給我們的示例應用啟用高可用性和故障恢復 如何使用Terracotta for Spring進行集群來提供透明容錯性和在節點間***享狀態

 聽上去很難? 妳會發現這實際上很簡單

 聲明式配置

 Sellitem示例應用使用壹個Sale類的實例來保存當前銷售的會話數據 同樣Spring Web Flow executor repository也使用HTTP session 來保存所有的會話數據

 要使用Terracotta for Spring 我們需要確保為給定的web應用啟用了HTTP session集群 包括所有可能被保存在 HTTP session中(或者能被保存在HTTP session中的實例引用)的類 以便於檢測 這裏是Terracotta for Spring的tc config xml配置文件的壹個例子

 name= swf sellitem >

 true

  springframework webflow samples sellitem Sale

 這裏我們為swf sellitem WAR文件啟用了HTTP session集群並配置了Sale類

 就是這樣 我們已經做了很多了

 啟用Terracotta

 我們唯壹需要做的就是在應用中啟用Terracotta for Spring運行時 這可以通過修改Tomcat web服務器的啟動腳本並在腳本最前面加入下面的環境變量完成

 set JAVA_OPTS= Xbootclasspath/p: %DSO_BOOT_JAR%

 set JAVA_OPTS=%JAVA_OPTS% Dtc install root= %TC_INSTALL_DIR%

 set JAVA_OPTS=%JAVA_OPTS% nfig= %LOCAL_DIR%\tc config xml

 這裏面

 DSO_BOOT_JAR環境變量指向jar的根目錄(能在Terracotta for Spring安裝的根目錄的mon/lib/dso boot下找到)

 TC_INSTALL_DIR環境變量指向Terracotta for Spring安裝的根目錄

 LOCAL_DIR指向包含tc config xml的目錄

 Sellitem應用預配置了Terracotta for Spring集群的代碼可以在下面的 Resources 章節找到 也包括了開箱即用的Tomcat集群配置

 註解 Spring應用上下文中的集群bean可以在服務(bean)級別配置 並依賴於Terracotta for Spring的 auto include檢測機制 例如 大多數情況下我們不需要關心引入哪個類 而只需要在tc config xml文件中定義希望集群的bean的名稱

  總結

 Spring Web Flow 給包括文章中看到的這種簡單應用到有很多頁面流轉的大型企業應用 都提供了構建基於會話的有狀態應用的有力手段 Terracotta for Spring給妳的Spring Web Flow提供了高可用性

 簡而言之 Terracotta for Spring提供了

 給基於Spring Web Flow的應用包括普通Spring的應用提供容錯性

 不需要實現java lang Serializable 在多個節點間分布的應用中透明***享狀態

 在多個分布式節點進行資源調用

 在多個分布式節點間保持了Pass by reference語義

 聲明式配置基本上不用修改現有代碼(除了以前是無狀態Spring應用 現在需要變成有狀態)

lishixinzhi/Article/program/Java/ky/201311/28016

  • 上一篇:紅線防泄密軟件好用嗎?
  • 下一篇:關於樂山壹女生校內疑被掐死壹事,妳有何看法?
  • copyright 2024編程學習大全網