版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、框架設(shè)計(jì)原則梁飛/虛極 (2012-11)1課程說(shuō)明 內(nèi)容: 主要講在Dubbo設(shè)計(jì)過(guò)程中積累的一些經(jīng)驗(yàn), 以及一些設(shè)計(jì)理論在Dubbo中的應(yīng)用, 并且只講實(shí)踐原則,不談設(shè)計(jì)模式。 目的: 希望給其它產(chǎn)品的設(shè)計(jì)起一些借鑒作用。2大綱模塊分包原則框架擴(kuò)展原則模型劃分原則接口分離原則組件協(xié)作原則功能演進(jìn)原則34RPCRemotingBusinessreferreceivedrequestconnectbindconnectbindsendreplyinvokeinvokeencodemergewritereadgetProxygetInvokerexportreferdecodeserialize
2、selectlistregistergetExecutornotifygetRegistrynotifylistinvokeinvokeProviderConsumerExporterInterfaceProxyFilterInvokerInvokerFilterImplementClientServerTransporterLoadBalanceProtocolNotifyListenerRegistryProtocolRegistryExchangeServiceSerializationInheritInitDubbo FrameworkDependDubboInvokerDubboPr
3、otocolDubboExporterInterfaceClassProxyFactoryInvokerProxyReferenceConfigServiceConfigConfigCallClusterCodecObjectOutputObjectInputExchangerTransportSerializeDirectoryClusterThreadPoolRegistryProtocolUser APIContributor SPI RegistryFactoryRegistryDirectorydeserializeexportinvokeinvokeinvokeexportChan
4、nelHandlerExchangeHandlerRouterRouterFactoryMonitorMonitorMonitorFactoryrouteMonitorFilterExchangeSereverExchangeClientcountreferreceivedgetMonitorStartgetexportinvokeinvokenewsubscribeDispatchergetRouterdispatchDubboHandlermergegetRoutergetRegistrygetMonitorwrapconnectconnectbindbindDubbo的模塊包5模塊分包原
5、則 復(fù)用度 包中的類(lèi)應(yīng)該有同樣的重用可能性, 緊密協(xié)作的類(lèi)應(yīng)該放在一個(gè)包。 對(duì)于變化因子,包中的類(lèi)應(yīng)全改或全不改, 變化應(yīng)在包內(nèi)終止,而不傳播到其它包。 發(fā)布的粒度和復(fù)用度相同。 穩(wěn)定度 被依賴的包應(yīng)該總是比依賴者更穩(wěn)定, 不要讓一個(gè)穩(wěn)定的包依賴于不穩(wěn)定包。 單向依賴,無(wú)環(huán)依賴。 抽象度 越穩(wěn)定的包應(yīng)該越抽象, 穩(wěn)定的包不抽象將導(dǎo)致擴(kuò)展性極差, 抽象的包不穩(wěn)定將導(dǎo)致其依賴包跟隨變化。6穩(wěn)定穩(wěn)定不穩(wěn)定不穩(wěn)定非常不穩(wěn)定非常不穩(wěn)定抽象抽象具體具體packageimport com.foo.*不穩(wěn)定度與抽象度矩陣 I = Ce / (Ca + Ce)I: InstabilityCa: Afferent
6、 Coupling (Used by packges)Ce: Efferent Coupling (Depend upon packges) A = Na / NcA: AbstractnessNa: Number of abstract classesNc: Number of classes (Include abstract classes) D = abs(1 - I - A) * sin(45)D: DistanceI: InstabilityA: Abstractness7JDepend不穩(wěn)定度與抽象度類(lèi)圖8HTTL分包示例9主頁(yè):http:/大綱模塊分包原則框架擴(kuò)展原則模型劃分原
7、則接口分離原則組件協(xié)作原則功能演進(jìn)原則10框架擴(kuò)展原則 微核+插件體系 平等對(duì)待第三方 外置生命周期 最少化概念模型 一致性數(shù)據(jù)模型11微核+插件體系 OSGi Equinox Eclipse, HSF META-INF/MANIFEST.MF IoC Spring, Guice META-INF/spring/beans.xml SPI java.util.ServiceProvider JDBC, MessageDigest, ScriptEngine META-INF/services/com.xxx.Xxx12KernelPluginPluginPluginPlugin平等對(duì)待第三方
8、Dogfooding 框架自己的功能也要擴(kuò)展點(diǎn)實(shí)現(xiàn) 甚至微核的加載方式也可以擴(kuò)展 Autowire 裝配邏輯由擴(kuò)展點(diǎn)之間互助完成 杜絕硬編碼的橋接和中間代碼 Cascading 層疊擴(kuò)展粒度,逐級(jí)細(xì)分 由大的擴(kuò)展點(diǎn)加載小的擴(kuò)展點(diǎn) Law of Demeter 只與觸手可及的擴(kuò)展點(diǎn)交互,間接轉(zhuǎn)發(fā) 保持行為單一,輸入輸出明確13DogfoodingAutowire外置生命周期 API傳入?yún)?shù),SPI擴(kuò)展點(diǎn)實(shí)例 盡量引用外部對(duì)象的實(shí)例,而不類(lèi)元 正確 : userInstance.xxx(); 錯(cuò)誤: Class.forName(userClass).newInstance().xxx(); 盡量使
9、用IoC注入,減少靜態(tài)工廠方法調(diào)用 正確: setXxx(xxx); 錯(cuò)誤: XxxFactory.getXxx(); applicationContext.getBean(“xxx”);14最少化概念模型 Filter - Chain? Result filter(Chain c, Invocation i); return c.doNext(i); Result invoke(Invoker v, Invocation i) return v.invoke(i);15ProxyFilterChainFilterInvokerProxyFilterInvokerFilterInvokerPr
10、oxyInvoker一致性數(shù)據(jù)模型 Dubbo統(tǒng)一URL模型: 所有配置信息都轉(zhuǎn)換成URL的參數(shù) 所有的元信息傳輸都采用URL 所有接口都可以獲取到URL16Provider dubbo:/0:20880/xxxService?timeout=1000Registry dubbo:/0:20880/xxxService?timeout=2000Consumer dubbo:/0:20880/xxxService?timeout=3000Dubbo重構(gòu)示例17博客:http:/ 微核心,插件式,平等對(duì)待第三方。微核心,插件式,平等
11、對(duì)待第三方。第二步第二步 每個(gè)擴(kuò)展點(diǎn)只封裝一個(gè)變化因子,最大化復(fù)用。每個(gè)擴(kuò)展點(diǎn)只封裝一個(gè)變化因子,最大化復(fù)用。第三步第三步 全管道式設(shè)計(jì),框架自身邏輯,均使用截面攔截實(shí)現(xiàn)。全管道式設(shè)計(jì),框架自身邏輯,均使用截面攔截實(shí)現(xiàn)。第四步第四步 最少概念,一致性概念模型。最少概念,一致性概念模型。 第五步第五步 分層,增量式擴(kuò)展,而不是擴(kuò)充式擴(kuò)展。分層,增量式擴(kuò)展,而不是擴(kuò)充式擴(kuò)展。 18微核微核 + 插件插件 + 正交分解正交分解19管道 + 事件 + 一致模型20分層分層 + 增量增量 + 平等對(duì)待平等對(duì)待21大綱模塊分包原則框架擴(kuò)展原則模型劃分原則接口分離原則組件協(xié)作原則功能演進(jìn)原則22核心領(lǐng)域模型
12、劃分原則 服務(wù)域服務(wù)域指產(chǎn)品主要功能入口,同時(shí)負(fù)責(zé)實(shí)體域和會(huì)話域的生命周期管理。Velocity的EngineSpring的BeanFactory 實(shí)體域?qū)嶓w域表示你要操作的對(duì)象模型,不管什么產(chǎn)品,總有一個(gè)核心概念,大家都繞圍它轉(zhuǎn)。Velocity的TemplateSpring的Bean 會(huì)話域會(huì)話域表示每次操作瞬時(shí)狀態(tài),操作前創(chuàng)建,操作后銷(xiāo)毀。Velocity的ContextSpring的Invocation23ServiceSessionEntityinitrun核心領(lǐng)域模型類(lèi)圖24Dubbo的核心領(lǐng)域模型 服務(wù)域: Protocol 它是Invoker暴露和引用的主功能入口,它負(fù)責(zé)Inv
13、oker的生命周期管理。 實(shí)體域: Invoker 它是Dubbo的核心模型,其它模型都向它靠擾,或轉(zhuǎn)換成它,它代表一個(gè)可執(zhí)行體,可向它發(fā)起invoke調(diào)用,它有可能是一個(gè)本地的實(shí)現(xiàn),也可能是一個(gè)遠(yuǎn)程的實(shí)現(xiàn),也可能一個(gè)集群實(shí)現(xiàn)。 會(huì)話域: Invocation 它持有調(diào)用過(guò)程中的變量,比如方法名,參數(shù)等。25核心領(lǐng)域模型劃分優(yōu)勢(shì) 結(jié)構(gòu)清晰,可直接套用 充血模型,實(shí)體域帶行為。 可變與不可變狀態(tài)分離,可變狀態(tài)集中 所有領(lǐng)域線程安全,不需要加鎖26核心領(lǐng)域模型線程安全性 服務(wù)域 通常服務(wù)域是無(wú)狀態(tài),或者只有啟動(dòng)時(shí)初始化不變狀態(tài),所以天生線程安全,只需單一實(shí)例運(yùn)行。 實(shí)體域 通常設(shè)計(jì)為不變類(lèi),所有屬
14、性只讀,或整個(gè)類(lèi)引用替換,所以是線程安全的。 會(huì)話域 保持所有可變狀態(tài),且會(huì)話域只在線程棧內(nèi)使用,即每次調(diào)用都在線程棧內(nèi)創(chuàng)建實(shí)例,調(diào)用完即銷(xiāo)毀,沒(méi)有競(jìng)爭(zhēng),所以線程安全。27GUI Task設(shè)計(jì)示例28博客:http:/ SwingWorkerList, Void () / 沒(méi)有子任務(wù),第二個(gè)泛型聲明為Void / 獨(dú)立的線程池執(zhí)行doInBackground方法,執(zhí)行完后,結(jié)果放在get方法的Future引用中 protected List doInBackground() throws Exception return remoteService.findUsers(); / 在EDT線程執(zhí)
15、行done方法,所有與GUI的相關(guān)操作都應(yīng)放在done方法中處理 protected done() try / 通過(guò)get獲取doInBackground返回的結(jié)果 List users = get(); / 顯示到UI tableModel.addAll(users); catch (Exception) / 捕獲doInBackground拋出的異常,由get方法拋出 .execute(); / 直接執(zhí)行,內(nèi)部有封裝線程池和FutureTask 29SwingWorker問(wèn)題 如果不看文檔,你很難猜到它的用法,這個(gè)類(lèi)集實(shí)體域,會(huì)話域,服務(wù)域于一身,非常復(fù)雜,即表示任務(wù)本身(實(shí)體域),也包含
16、執(zhí)行過(guò)程的狀態(tài)(會(huì)話域),同時(shí)也具有主動(dòng)執(zhí)行能力(服務(wù)域)。 行為狀態(tài)混雜 比如:doInBackground()的返回值是給done()方法用的,而且要通過(guò)get()方法獲取到返回值。 數(shù)據(jù)傳遞隱晦 這個(gè)類(lèi)和Thread類(lèi)一樣,只能執(zhí)行一次,多次執(zhí)行是無(wú)效的,因?yàn)槠溆袪顟B(tài),所以這樣做是正確的。全局有狀態(tài)30重構(gòu)后的模型劃分31重構(gòu)后的完整設(shè)計(jì)32對(duì)應(yīng)模型劃分說(shuō)明 Task表示任務(wù)本身 TaskListener為事件通知,所有的UI操作均放在Listener里處理 TaskAdapter同時(shí)實(shí)現(xiàn)Task接口和TaskListener接口實(shí)體域 TaskContext為互上下文,保存執(zhí)行過(guò)程中的
17、狀態(tài) TaskEvent為事件信息會(huì)話域 TaskExecutor提供執(zhí)行能力,為執(zhí)行入口 TaskService做為SPI,這樣就可以同時(shí)適配Swing/AWT和JFace/SWT服務(wù)域33大綱模塊分包原則框架擴(kuò)展原則模型劃分原則接口分離原則組件協(xié)作原則功能演進(jìn)原則34API & SPI Dubbo API ServiceConfig ReferenceConfig RpcContext Dubbo SPI Protocol Transporter LoadBalance35APISPIFrameworkUserDeveloperAPI與SPI分離36聲明式API,過(guò)程式SPI 聲明
18、式API 描述需要什么 過(guò)程式SPI 描述怎么實(shí)現(xiàn) 聲明式事務(wù) Transactional begin, commit, rollback Maven v.s. Ant mvn install ant target1 target237API可配置,一定可編程 配置用于簡(jiǎn)化常規(guī)使用 編程接口用于框架集成38ServiceConfig service = new ServiceConfig();service.setInterface(com.alibaba.xxx.XxxService);service.setVersion(1.0.0);service.setRef(xxxService);
19、service.export(); 博客:http:/ void set(Xxx xxx); / 無(wú)返回值表示命令,有副作用查詢: Xxx get(); / 有返回值表示查詢,保持冪等,無(wú)副作用不建議: Object delete(); / 刪除并返回建議: Object get(); / 先查詢 void delete(); / 再刪除39對(duì)稱性接口 保持接口的對(duì)稱性和完備性: add & remove 用戶能基于常用接口推導(dǎo)其它接口: export & refer = exported & referred40API & SPI 兼容性二進(jìn)制兼容 v.s.
20、源碼兼容 DEFAULT = 1 = DEFAULT = 2 / 編譯時(shí)內(nèi)聯(lián) set(Child c) = set(Parent p) / 里氏代換原則接口 v.s. 抽象類(lèi) 保持接口方法是接口名的完備集 抽象類(lèi)更容易兼容,但對(duì)繼承樹(shù)的侵入大 API接口,SPI接口+抽象基類(lèi)規(guī)則 v.s. 硬編碼 以某符號(hào)開(kāi)頭的特殊處理 指定關(guān)鍵字特殊處理包名調(diào)整 讓舊接口繼承調(diào)整后的接口接口加方法 增加子接口,通過(guò)instanceof識(shí)別新方法41大綱模塊分包原則框架擴(kuò)展原則模型劃分原則接口分離原則組件協(xié)作原則功能演進(jìn)原則42管道 v.s. 派發(fā) 管道 組合行為 主功能以截面實(shí)現(xiàn) 比如:Servlet 派發(fā)
21、 策略行為 主功能以事件實(shí)現(xiàn) 比如: Swing43行為A行為B行為C行為A行為B行為C控制器分布 v.s. 共享 分布 在行為交互為主的系統(tǒng)是適用 狀態(tài)通過(guò)行為傳遞 共享 在以管理狀態(tài)為主的系統(tǒng)中適用 狀態(tài)通過(guò)倉(cāng)庫(kù)共享44行為A行為B行為C狀態(tài)A狀態(tài)B狀態(tài)C行為A行為B行為C狀態(tài)A狀態(tài)B狀態(tài)C共享倉(cāng)庫(kù)主過(guò)程攔截 Web框架的請(qǐng)求響應(yīng)流 ORM框架的SQL執(zhí)行 Service框架的調(diào)用過(guò)程 反例: IBatis2在SQL執(zhí)行過(guò)程中沒(méi)有設(shè)攔截點(diǎn),導(dǎo)致添加安全或日志攔截,執(zhí)行前修改分頁(yè)SQL等,不得不hack源代碼。45Dubbo調(diào)用過(guò)程攔截46ProxyFilterInvokerImplFilt
22、erInvokerProtocolcontextdeprecatedcollectgenericactivelimitmonitorfuture tokenexceptionechoaccesslogtraceclassloaderexecutelimit事件派發(fā)47 過(guò)程 執(zhí)行前后 觸發(fā)附帶非關(guān)鍵行為 狀態(tài) 值的變化 觸發(fā)狀態(tài)觀察者行為Reactor v.s. Proactor48ReactorHandlerHandlerSourceProactorHandlerSourceloopregistereventeventpublishpublishDubbo暴露/引用/調(diào)用事件49Framew
23、orkListenerListenerListenerListeneronreturnoninvokeinvokereferexportreferredexporteddestroyedunexported關(guān)鍵路徑 關(guān)鍵路徑 采用攔截鏈分離職責(zé) 保持截面功能單一,不易出問(wèn)題 非關(guān)鍵路徑 采用后置事件派發(fā) 確保派發(fā)失敗,不影響主過(guò)程運(yùn)行50協(xié)作防御可靠性分離:可靠操作不可靠操作 (盡量縮小)狀態(tài)分離:無(wú)狀態(tài)有狀態(tài) (盡量縮小)不可變類(lèi) (盡量final)狀態(tài)驗(yàn)證:盡早失敗前置斷言 + 后置斷言 + 不變式異常防御,但不忽略異常異常信息給出解決方案日志信息包含環(huán)境信息降低修改時(shí)的誤解性,不埋雷避免基于異常類(lèi)型的分支流程保持null和empty語(yǔ)義一致51博客:http:/ 前置斷言 assert(arg != null); if (arg = null) throw new IllegalArgumentException(); 后置斷言 assert(result != null); if (result = null) throw new IllegalStateException(); 不變式 assert(a + b = c); if (a + b != c) th
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年瀘水縣招教考試備考題庫(kù)含答案解析(奪冠)
- 2025年開(kāi)封縣幼兒園教師招教考試備考題庫(kù)含答案解析(必刷)
- 2025年江西工程職業(yè)學(xué)院馬克思主義基本原理概論期末考試模擬題附答案解析(必刷)
- 2024年鄢陵縣招教考試備考題庫(kù)帶答案解析
- 2025年廣西政法管理干部學(xué)院馬克思主義基本原理概論期末考試模擬題及答案解析(奪冠)
- 2025年煙臺(tái)城市科技職業(yè)學(xué)院馬克思主義基本原理概論期末考試模擬題含答案解析(必刷)
- 2024年銅鼓縣招教考試備考題庫(kù)帶答案解析(必刷)
- 2026年武漢海事職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試模擬測(cè)試卷帶答案解析
- 2025年尉犁縣招教考試備考題庫(kù)附答案解析
- 2024年雄縣招教考試備考題庫(kù)及答案解析(奪冠)
- 竣工驗(yàn)收方案模板
- 企業(yè)安全生產(chǎn)內(nèi)業(yè)資料全套范本
- 安全生產(chǎn)標(biāo)準(zhǔn)化與安全文化建設(shè)的關(guān)系
- 林業(yè)生態(tài)經(jīng)濟(jì)效益評(píng)價(jià)指標(biāo)體系構(gòu)建
- DL-T5054-2016火力發(fā)電廠汽水管道設(shè)計(jì)規(guī)范
- 耳部刮痧治療
- 《相控陣超聲法檢測(cè)混凝土結(jié)合面缺陷技術(shù)規(guī)程》
- 神經(jīng)外科介入神經(jīng)放射治療技術(shù)操作規(guī)范2023版
- 多模態(tài)數(shù)據(jù)的聯(lián)合增強(qiáng)技術(shù)
- 濱海事業(yè)單位招聘2023年考試真題及答案解析1
- 熱電廠主體設(shè)備安裝施工組織設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論