文章首發於公衆號:松花皮蛋的黑板報編程
做者就任於京東,在穩定性保障、敏捷開發、高級JAVA、微服務架構有深刻的理解後端
總體上按分層進行分包,而後每一個包又分API包和具體的方案包,從中提煉出三個須要注意的點安全
大凡發展的比較好的框架,都遵照微核的理念, Eclipse的微核是OSGi(依賴META-INF/MANIFEST.MF配置), Spring的微核是BeanFactory,Maven的微核是Plexus,Dubbo的微核是SPI(依賴META-INF/services/com.xxx.xxx配置)。一般核心是不該該帶有功能性的,而是一個生命週期和集成容器,負責加載、卸載、運行插件模塊,這樣各功能能夠經過相同的方式交互及擴展,而且任何功能均可以被替換。若是作不到微核,至少要平等對待第三方,即原做者能實現的功能,擴展者應該能夠經過擴展的方式所有作到,原做者要把本身也看成擴展者,這樣才能保證框架的可持續性及由內向外的穩定性。架構
將一個事件處理流程分派到一組執行對象上,這一組執行對象造成一個鏈式結構,事件處理在這一組對象上進行傳遞app
框架不該該控制實現類的生命週期,框架最多提供工具類輔助管理,而不是絕對控制,應知足下面的規範框架
URL做爲Dubbo一個公共契約,全部的擴展點都包含URL參數,URL做爲上下文信息貫穿整個擴展點設計體系。全部的配置信息都轉換成URL的參數,全部的元信息傳輸都採用URL,全部的接口均可以獲取到URL微服務
領域模型劃分好處:結構清晰,可直接套用;充血模型,實體域帶行爲;可變和不可變狀態分離,可變狀態集中;全部領域線程安全,不須要加鎖工具
Dubbo中的API如ServiceConfig\ReferenceConfig\RpcContext是給使用者使用的,Dubbo中的SPI如Protocol\Transporter\LoadBalance,是給擴展者使用的,API應該是聲明式的,描述須要什麼,SPI應該是過程式的,描述怎麼實現。它們不該該混在一塊兒,使用者不該該看到擴展者寫的實現編碼
管道通常適用於組合行爲,主功能以截面AOP實現,好比Servlet。派發通常適用於策略行爲,主功能以事件Event實現,好比Flux插件
沒有哪一個公用的框架能夠Cover住全部的需求,不論是Web框架的請求響應流、ORM框架的SQL-Mapping過程,仍是Service框架的調用過程,容許外置行爲是框架的基本擴展方式,否則若是須要添加安全、日記或者修改分頁SQL等不得不hack源代碼了
Dubbo中使用全管道設計,框架自身邏輯,均使用截面攔截實現,好比常見於消費端的context\collect\generic\activelimit\monitor\future等鏈式過濾器,常見於生產端的token\exception\echo\accesslog\trace\executelimit等鏈式過濾器
攔截器是在切點執行先後生效的,它是干預過程的,會觸發非關鍵行爲,而事件是基於狀態數據的,會觸發狀態觀察者行爲
Reactor模型關注就緒狀態,好比可讀了就通知咱們主動去讀,相似Linux epoll,而proactor關心的是完成狀態,好比咱們指定存放數據的內存地址(Buffer)和讀事件,當它讀完了就會通知咱們,相似Windows IO completion port
Dubbo在關鍵路徑上採用攔截鏈分離職責,保持界面功能單一,不易出問題。在非關鍵路徑上,採用後置派發,即便派發失敗也不會影響主流程運行
開閉原則,對擴展開放,對修改關閉,由於風險每每來自於修改。擁抱變化時應該繼承原有類而後重寫方法擴展邏輯,而不是修改原來的類
若是現有一個無狀態消息發送的場景,後來新增一個會話消息發送需求,若是採用增量式擴展,無狀態消息發送原封不動,同步消息發送,在無狀態消息基礎上加一個 Request/Response 處理,會話消息發送,再加一個 SessionRequest/SessionResponse 處理
傳統的C\S模型是一問一答模式,而Dubbo的RPC模型中包括了Proxy\Custer\Protocol, Protocol只負責協議實現,它是不透明的、點對點的,Cluster只負責將集羣中多個提供者假裝成一個,Proxy只負責透明化接口,橋接動態代理,總體的架構很是容易擴展
儘量少的依賴低階契約,用最少的抽象概念實現功能。當低階切換實現時,高階功能能夠繼續複用
以PHP到Router的request body中的方法名和方法參數做爲Router遠程調用後端Java服務的入參,最後將遠程調用的result返回給PHP端就是兼容Restful服務的高階泛化調用
文章來源:www.liangsonghua.me
做者介紹:京東資深工程師-梁鬆華,長期關注穩定性保障、敏捷開發、JAVA高級、微服務架構