大綱
1 模塊分包原則
2 框架擴(kuò)展原則
3 領(lǐng)域劃分原則
4 接口分離原則
5 組件協(xié)作原則
6 功能演進(jìn)原則
我將對(duì)每個(gè)原則進(jìn)行自己的解讀沼琉,如有不對(duì)砰盐,還請(qǐng)指教 :)
1 模塊分包原則
說說我的理解窥突。這里其實(shí)是從框架結(jié)構(gòu)的解讀來解讀惶室,這里的包指的是 Maven 的 module当娱。
復(fù)用度卖局,指的是 maven 包的復(fù)用∶焐迹可以理解為工具類蛇数。這個(gè)工具類不應(yīng)該變化無常。
穩(wěn)定度:被依賴的包應(yīng)該保持穩(wěn)定是越,或者說耳舅,被依賴者應(yīng)當(dāng)比依賴者穩(wěn)定,且不能成環(huán)狀依賴倚评。如果不穩(wěn)定浦徊,將會(huì)影響其他的包。
抽象度天梧,越抽象盔性,越穩(wěn)定。越具體呢岗,越容易變化冕香。
同時(shí),梁飛給出了一個(gè)公式后豫,但是實(shí)踐起來有點(diǎn)麻煩.......
關(guān)于模塊分包悉尾,可以參見更詳細(xì)的博客。 以HTTL為例講講模塊分包&領(lǐng)域模型&擴(kuò)展框架
2 框架擴(kuò)展原則
這是其實(shí)是說的比較多的東西了硬贯。
什么是微核心 + 插件焕襟?按照作者的說法,核心只負(fù)責(zé)裝配插件饭豹。這樣鸵赖,無論是作者自己的功能,還是第三方的功能拄衰,都是平等的它褪,再多的插件也不會(huì)影響軟件架構(gòu),因?yàn)闆]有硬編碼翘悉,且都是可以卸載的茫打。甚至微核也是可以擴(kuò)展的。:)
同時(shí)妖混,插件的組裝規(guī)則是統(tǒng)一的老赤。說到這里,你應(yīng)該想到了 IDEA制市,Maven抬旺,Eclipse 等等。
然后說外置生命周期祥楣。這個(gè)其實(shí)我是有一點(diǎn)不理解的开财。按照作者的說法汉柒,其實(shí)是說,框架只負(fù)責(zé)管理對(duì)象责鳍,對(duì)象的出生和死亡不由框架負(fù)責(zé)碾褂。即,用戶應(yīng)將實(shí)例注冊(cè)到框架中历葛。
但 Spring 似乎不是這么做的正塌。同時(shí),如果使用注冊(cè)機(jī)制啃洋,那么就需要硬編碼传货。或者說宏娄,Spring 本身就是管理 Bean 生命周期的框架问裕,而 Dubbo 的職責(zé)不在于此?
最少化概念模型孵坚,這個(gè)其實(shí)是一種優(yōu)化粮宛。
一致化數(shù)據(jù)模型:例如 URL 這種對(duì)象,就是一致化數(shù)據(jù)模型卖宠,拒絕使用 String 拼接巍杈,解析。
3 領(lǐng)域劃分原則
這是在框架設(shè)計(jì)中扛伍,是非常重要的筷畦。
PPT 中已經(jīng)說的非常清楚,我就不再說明刺洒。其中鳖宾,Invocation 一定要輕量。否則逆航,對(duì) GC 來說鼎文,將是很大的壓力(使用對(duì)象池?性能不好因俐。)
說說他的好處:
- 結(jié)構(gòu)清晰拇惋,這個(gè)不必講吧。
- 充血模型......這個(gè)怎么理解抹剩?
- 可變和不可變狀態(tài)分離撑帖,可變狀態(tài)集中。通常實(shí)體域都是只讀的澳眷,即不變狀態(tài)胡嘿。會(huì)話域都是可變狀態(tài)。
- 所有領(lǐng)域模型線程安全境蔼。無鎖編程(lock-free 非常重要)灶平。
關(guān)于他們的線程安全性:
- 服務(wù)域無狀態(tài),天生線程安全箍土。
- 實(shí)體域?qū)傩灾蛔x逢享,線程安全。
- 會(huì)話域工作在棧中吴藻,線程安全瞒爬。
所以,需要保證他們是這么設(shè)計(jì)的沟堡,才能實(shí)現(xiàn)無鎖編程侧但。
4 接口分離原則
關(guān)于接口分離,我認(rèn)為是單一職責(zé)的一種實(shí)現(xiàn)航罗。
其中提到 API 和 SPI禀横,API 面向用戶,SPI 面向開發(fā)者粥血。兩者必須分離柏锄。
聲明式 API 和過程式 SPI ,沒看懂复亏,看懂的說一下趾娃。:)
API 可配置,一定可編程缔御,這個(gè)不用說吧抬闷。
區(qū)分命令和查詢,例如耕突,不應(yīng)該有 updateAndGet 這個(gè)方法(不包括原子類)笤成,應(yīng)該分成 2 個(gè)方法,保證 get 方法冪等有勾。
對(duì)稱性接口:很簡(jiǎn)單疹启,有 get 方法,就應(yīng)該有 set 方法蔼卡,有 add 就由 remove喊崖,稱之為對(duì)稱性和完備性。這樣用戶能自行推導(dǎo)出接口雇逞。
兼容性:如果接口加方法荤懂,應(yīng)該是增加子接口的方式。其他的沒看明白.......
5 組件協(xié)作原則
這個(gè)就比較爽了塘砸,我們知道 Dubbo 是管道式設(shè)計(jì)节仿。一個(gè) Invoker 貫通整個(gè)流程,事實(shí)上掉蔬,web 服務(wù)器都是這么設(shè)計(jì)的廊宪。例如 Tomcat 矾瘾,Netty。
關(guān)于派發(fā)箭启,還記得 Spring 的 dispatchServlet 嗎壕翩?
關(guān)于狀態(tài)的共享:
- 分布是什么?即通過行為傳遞(適合交互性系統(tǒng))傅寡。
- 共享是什么放妈?通過一個(gè)固定的點(diǎn)獲取,稱之為倉(cāng)庫(kù)(適合管理狀態(tài)的系統(tǒng))荐操。
主過程攔截芜抒,還記得 Mybatis 留給我們的插件嗎?還記得 Spring 留給我們的攔截器嗎托启?框架要在關(guān)鍵節(jié)點(diǎn)留出攔截點(diǎn)供用戶擴(kuò)展宅倒。
事件派發(fā):觀察者模式,Reactor 模式驾中,另外提到 Proactor 模式唉堪,查了一下,通常在 GNU 編程中肩民,由 OS 支持唠亚。
Dubbo 暴露、引用持痰、調(diào)用事件灶搜,都預(yù)留了監(jiān)聽器。
關(guān)鍵路徑工窍,即在管道使用職責(zé)連模式進(jìn)行攔截割卖,保證每個(gè)攔截器職責(zé)單一。
非關(guān)鍵路徑患雏,需要有監(jiān)聽機(jī)制鹏溯,不能影響主流程運(yùn)行。
關(guān)于協(xié)作防御淹仑,我理解為防御性編程丙挽。
- 分離可靠操作和不可靠操作。不可靠操作盡量范圍要小匀借。
- 狀態(tài)分離颜阐,盡量無狀態(tài)。狀態(tài)要盡可能小吓肋。
- 對(duì)狀態(tài)要盡早驗(yàn)證凳怨,因?yàn)槿绻。ǔo人回滾。前后斷言驗(yàn)證狀態(tài)正確性肤舞。
- 異常防御紫新,應(yīng)該是預(yù)見性的異常,異常包含環(huán)境信息李剖。
- 降低修改成本弊琴,防止埋雷:不要根據(jù)異常類型做分支判斷。保持 null 和 empty 一致杖爽。
6 功能演進(jìn)原則
第一就是開閉原則,微核心加插件機(jī)制能夠支持紫皇。
軟件質(zhì)量的下降慰安,來源于修改。
加功能的姿勢(shì):應(yīng)該是增量式聪铺,而不是擴(kuò)充式化焕,即不在原有基礎(chǔ)上修改,而是新增加功能铃剔。
關(guān)于高階:頂層接口盡量抽象撒桨,且不能依賴底層實(shí)現(xiàn)。這樣键兜,當(dāng)?shù)讓訉?shí)現(xiàn)變化時(shí)凤类,高層無需變化。
例如 Dubbo 泛化普气,在頂層就足夠抽象谜疤,底層實(shí)現(xiàn)方式不影響高層。
總結(jié)
以上是梁飛總結(jié)现诀。
今天說的框架設(shè)計(jì)和現(xiàn)在大部分人喜歡說的架構(gòu)設(shè)計(jì)有所不同夷磕,現(xiàn)在似乎只需要再 processon 上放幾個(gè)阿里云組件,再連幾條線仔沿,就是架構(gòu)設(shè)計(jì)了 :)
我個(gè)人認(rèn)為坐桩,框架設(shè)計(jì)更能考驗(yàn)一個(gè)程序員對(duì)程序的抽象和管理能力(也許措辭不當(dāng)?)
然后封锉,再說說我的總結(jié):關(guān)于一個(gè)系統(tǒng)的設(shè)計(jì)绵跷,這里應(yīng)該指的是框架的設(shè)計(jì),首先要知道用戶需求(廢話)烘浦。根據(jù)需求抽象出模型抖坪,再變成代碼,且是可擴(kuò)展闷叉,可復(fù)用的代碼擦俐。
這里提到的 6 個(gè)原則,應(yīng)該算是比較成熟的原則了握侧。
微核 + 插件蚯瞧,非常理想化嘿期,例如 SOFA,也有自己的擴(kuò)展機(jī)制埋合。
關(guān)于領(lǐng)域模型設(shè)計(jì)备徐,這 3 個(gè)模型的職責(zé)一定要?jiǎng)澐智宄瑫r(shí)實(shí)現(xiàn)無鎖編程甚颂,這個(gè)對(duì)于系統(tǒng)的性能非常重要蜜猾。
關(guān)于組件協(xié)作,一個(gè)系統(tǒng)有多個(gè)組件振诬,通常需要進(jìn)行狀態(tài)的共享蹭睡,在 Dubbo 中,使用行為進(jìn)行傳遞赶么,也就是會(huì)話域肩豁。
關(guān)于功能演進(jìn),請(qǐng)遵循開閉原則辫呻,但前提通常是有一個(gè)好的內(nèi)核清钥。
關(guān)于接口分離和模塊分包,通常在后期重構(gòu)能夠達(dá)到更好的效果放闺?
好了祟昭,洋洋灑灑說了不少,讀者如有更好的見解怖侦,請(qǐng)與我分享从橘,畢竟現(xiàn)在關(guān)注這塊的人不多了。:)