框架設(shè)計(jì)原則(梁飛)

大綱

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ì)象池?性能不好因俐。)

說說他的好處:

  1. 結(jié)構(gòu)清晰拇惋,這個(gè)不必講吧。
  2. 充血模型......這個(gè)怎么理解抹剩?
  3. 可變和不可變狀態(tài)分離撑帖,可變狀態(tài)集中。通常實(shí)體域都是只讀的澳眷,即不變狀態(tài)胡嘿。會(huì)話域都是可變狀態(tài)。
  4. 所有領(lǐng)域模型線程安全境蔼。無鎖編程(lock-free 非常重要)灶平。

關(guān)于他們的線程安全性:

  1. 服務(wù)域無狀態(tài),天生線程安全箍土。
  2. 實(shí)體域?qū)傩灾蛔x逢享,線程安全。
  3. 會(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é)作防御淹仑,我理解為防御性編程丙挽。

  1. 分離可靠操作和不可靠操作。不可靠操作盡量范圍要小匀借。
  2. 狀態(tài)分離颜阐,盡量無狀態(tài)。狀態(tài)要盡可能小吓肋。
  3. 對(duì)狀態(tài)要盡早驗(yàn)證凳怨,因?yàn)槿绻。ǔo人回滾。前后斷言驗(yàn)證狀態(tài)正確性肤舞。
  4. 異常防御紫新,應(yīng)該是預(yù)見性的異常,異常包含環(huán)境信息李剖。
  5. 降低修改成本弊琴,防止埋雷:不要根據(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)注這塊的人不多了。:)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末础钠,一起剝皮案震驚了整個(gè)濱河市恰力,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旗吁,老刑警劉巖踩萎,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異很钓,居然都是意外死亡香府,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門码倦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來企孩,“玉大人,你說我怎么就攤上這事袁稽∥鹆В” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)补疑。 經(jīng)常有香客問我歧沪,道長(zhǎng),這世上最難降的妖魔是什么莲组? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任诊胞,我火速辦了婚禮,結(jié)果婚禮上锹杈,老公的妹妹穿的比我還像新娘撵孤。我一直安慰自己,他們只是感情好竭望,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布早直。 她就那樣靜靜地躺著,像睡著了一般市框。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糕韧,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天枫振,我揣著相機(jī)與錄音,去河邊找鬼萤彩。 笑死粪滤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雀扶。 我是一名探鬼主播杖小,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼愚墓!你這毒婦竟也來了予权?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浪册,失蹤者是張志新(化名)和其女友劉穎扫腺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體村象,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笆环,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厚者。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躁劣。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖库菲,靈堂內(nèi)的尸體忽然破棺而出账忘,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布闪萄,位于F島的核電站梧却,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏败去。R本人自食惡果不足惜放航,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望圆裕。 院中可真熱鬧广鳍,春花似錦、人聲如沸吓妆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)行拢。三九已至祖秒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舟奠,已是汗流浹背竭缝。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沼瘫,地道東北人抬纸。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像耿戚,于是被迫代替她去往敵國(guó)和親湿故。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,138評(píng)論 25 707
  • 用兩張圖告訴你膜蛔,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料坛猪? 從這篇文章中你...
    hw1212閱讀 12,724評(píng)論 2 59
  • 以下內(nèi)容均來自 梁飛 的個(gè)人博客 http://javatar.iteye.com/blog/1056664[ht...
    高廣超閱讀 5,115評(píng)論 1 53
  • 1.首先是由丁小燕這組的課前報(bào)告,然后是老師讓我們用超過十個(gè)詞語(yǔ)夸夸自己皂股,最后是關(guān)于智力的測(cè)試砚哆。 2.她們這組讓我...
    WETTR閱讀 235評(píng)論 0 1
  • ??項(xiàng)目管理需要具備哪些基本技能 - - - - - - - - - - - - - - - 項(xiàng)目管理最重要的一個(gè)...
    洋蔥頭818閱讀 367評(píng)論 0 0