Part1 軟件架構javascript
「架構」是依據業務設計組件、模塊、框架、類等不一樣粒度的單元將其組合的策略。沒有理想上通用的架構,不一樣的軟系統的着重點不一樣。(業務邏輯複雜、併發性能高、擴展性好)前端
架構五視圖概念:物理架構(安裝、部署需求)、邏輯架構(業務需求)、數據架構(數據需求)、開發架構(代碼擴展、重用需求)、運行架構(運行性能安全需求)。java
開發中須要挖掘、分析清需求,利用多視圖設計出架構模型。最後轉換成組件、模塊 、接口、類進行驗證。git
RUP:web
需求分析創建用例圖爲用例添加規約。(用例描述)spring
製做原型界面確認需求。數據庫
編寫SRS文檔。apache
(RUP在迭代中找出風險性最大架構問題,儘可能減小風險,XP裏由核心用戶故事來驅動)編程
領域建模與需求分析同步進行。json
模型創建與領域專家交流。
精化領域模型設計模塊、接口、類。
概念架構分層,層次中加入魯棒圖分析。
Part2架構模式
三層架構:表現層、領域層、數據層,後兩層絕對不要依賴表現層。
組織領域邏輯三種模式:事務腳本、表模塊、領域模型,儘可能使用領域。
領域模型粒度儘可能小。
避免實體bean重進入。(一個對象改變了bean狀態,不該再被另外一個對象使用)
可在領域層加薄服務層提供接口與客戶層鏈接。
數據訪問建議:
控制粒度儘可能減小數據庫訪問次數,使用join避免屢次進入,利用ormaping框架,使用鏈接池。
合理設計數據表繼承結構。
(三範式 1nf字段不可再分 2nf非關鍵字依賴本身關鍵字 3nf 不存在傳遞依賴 )
先領域模型設計而不是先設計數據庫表
避免長事務,減小事務隔離提升靈活。
數據源架構:表數據入口(表對應記錄集)、行輸入入口(行對應類)、活動記錄(同行輸入入口將邏輯加入類)、數據映射器(數據對應領域對象)
反射編寫數據映射器或使用開源mapping工具
使用mapping設計時注意對象的工做單元、標識域、繼承、延時加載、緩存
備忘數據可對象序列化(類對象、json、xml)保存BLOB
表現層之web
模型(對象)
頁面控制器(跳轉)、前端控制器(interpret filer、裝飾)、應用控制(邏輯調用)
模板視圖、轉換視圖
客戶端會話cookie (可加密防篡改)
服務端會話 session (佔內存可序列化保存)
數據庫會話 建臨時字段(狀態保存與 客戶端、服務端會話數據比較)
Part3輕量架構
發展:
EJB測試困難嚴格的單元測試和測試驅動開發TDD日益變流行。
開發人員不斷尋找更簡單的EJB代替品。J2ee中servlet、jsp、jms、rmi、jdbc都是好的規範惟獨ejb。
架構知足業務需求的能力以經驗評測,不是全憑主觀臆斷、一廂情願。
Xp教咱們怎麼思考。
EJB服務:目錄JNDI、事務JTS和JTA、鏈接JCA、資源池、線程管理、entity bean。
Hibenate和JDO代替entity bean
AOP(如spring)聲明式事務
業務對象線程池緩存:web應用時Web容器提供線程池無需再業務層在提供,只有用RMI才須要。
開發指導:
參考架構:開源框架中的模板,若是你的模板是基於一個應用(sun java PetStore)而不是一個框架結果多半失敗。
工具:eclipse、intellij、svn、git、junit、ant、maven、spring、jdo、hibernate、struts
業務服務層:接口形式、oo、內部機制不該過複雜、獨立表現層、不直接與數據層打交道、有事務管理、易測試、可伸縮性、儘可能無狀態(如把狀態保存web層)、ioc達到接口現實分離
業務對象和表現組建運行在同一jvm,因此搭建集羣部署到新jvm實現水平擴展。
活動記錄在領域對象中包含數據訪問邏輯,是entity bean和傳統持久化框架使用的方法。
數據映射器包含全部持久化邏輯。TOPLINK經過共享緩存訪問讀取對象,若是不爲對象克隆就不能修改對象不然會破壞共享緩存。
業務邏輯框架選用spring;支持遠程客戶端可用hessian、butlap、web service(soap服務apache axis、clue);
不少web應用沒有清晰的業務服務層,每每依附web層框架(如struts);
純OO編程模式很難處理一些與實際正交需求(如:安全性)而spring經過AOP能解決。
AOP是OOP的補充,橫切方法攔截。
把精力集中在問題領域上而不是技術自己。
DTO、VO都是僞對象盡少使用,OO原則很重要
表現層:業務邏輯獨立於表現層。
Web應用web層:(expert one on one j2ee design and development 12、13章)
技術struts、webwork、maverick、jsp、velocity、javascript
Servlet+jsp的mvc
數據層:使用o/r mapping工具使得領域對象可包含業務邏輯,領域模型就是有對象而不是啞數據容器構成了。
EJB 無狀態會話Bean (SLSB)的審視:
聲明性事務管理:spring提供基於AOP的聲明事務管理,支持多數據庫的JTA、JDBC,回滾規則配置,編程性事務。
遠程調用:web應用中將web組件和業務組件方在同一JVM比較好,須要遠程調用暴露web services接口可行。
集羣:EJB有狀態會話bean的集羣能力差,一般集羣可經過J2eeweb容器、web
服務器或者硬件設備處理。
線程管理:實現不讀寫實例變量的多線程服務對象這種方法在servlet、sturts action中工做的很是完美,使用命令模式爲每一個請求建立實例消除對象內部併發,使用java同步、併發庫。
實例池:slsb緩衝池是節省內存,spring實例池commonsPoolTargeSourse,如今jvm垃圾收集效率高內存也便宜。
資源管理:將數據庫鏈接放入資源池,dbcp等作得很好。
安全:用AOP實現聲明性自定義安全性,自定義安全攔截器。
業務對象管理:Spring做爲對象工廠,spring提供緩衝池,ioc功能代替jndi查找。
開源方案:
Ao--Spring、Nanning Aspectes、Jboss4
Ioc--Spring、PicoContainer(可與Nanning集成)、HiveMind
O/R--Hibernate、JDO、iBatis
Web service--GLUE
性能:
響應時間:應用程序處理一個請求的時間(如http請求)
延時時間:從應用程序獲得反饋所需最小時間。
吞吐量:一段時間內所能進行的工做總和,web應用經常使用每秒點擊率衡量,事務處理程序則是每秒完事務數。
可伸縮性:指應用程序如何對應增加流量。可伸縮常等價於水平伸縮性(向上伸縮)集羣是一種。垂直伸縮在每臺服務器上運行多份服務,如添加cup、內存。
緩存(能夠進行緩存的地方):數據庫、O/R mapping、業務對象(業務層用aop緩存)、web層對象、過濾器與jsp標籤緩存、HTTP頭控制瀏覽器web緩存
優化:控制繼承樹深度、直接訪問字段而非方法訪問、用局部變量代替實例變量、去除沒必要要log
Spring
Spring是一個應用框架而不是web、ioc、aop或者中間層框架什麼的。
國人應用框架jdom。
Bean工廠:依賴注入
應用上下文:在bean工廠基礎上增長對信息
Part4敏捷
Part5領域驅動