摘要:本書概括以軟件系統(tǒng)為例,重點(diǎn)講解了應(yīng)用架構(gòu)中的物理設(shè)計(jì)問題,即如何將軟件系統(tǒng)拆分為模塊化系統(tǒng)。容器獨(dú)立模塊不依賴于具體容器,采用輕量級(jí)容器,如獨(dú)立部署模塊可獨(dú)立部署可用性模式發(fā)布接口暴露外部配置使用獨(dú)立的配置文件用于不同的上下文。
本書概括本文為讀書筆記,對(duì)書中內(nèi)容進(jìn)行重點(diǎn)概括,并將書中的模塊化結(jié)合微服務(wù)、Java9 Jigsaw談?wù)劺斫狻?/p>
以Java軟件系統(tǒng)為例,重點(diǎn)講解了應(yīng)用架構(gòu)中的物理設(shè)計(jì)問題,即如何將軟件系統(tǒng)拆分為模塊化系統(tǒng)。所以內(nèi)容組織包括為什么需要模塊化,圍繞如何實(shí)現(xiàn)模塊化講述了模塊化模式,最后在模塊化基礎(chǔ)上使用OSGi技術(shù)實(shí)現(xiàn)動(dòng)態(tài)模塊化。
內(nèi)容總結(jié) 模塊化定義先談?wù)剳?yīng)用架構(gòu)的邏輯設(shè)計(jì)和物理設(shè)計(jì)。
邏輯設(shè)計(jì)是關(guān)于語言結(jié)構(gòu)的,指類、方法之間的關(guān)系,組織結(jié)構(gòu)。物理設(shè)計(jì)是關(guān)于軟件中的物理實(shí)體,即部署單元和他們之間的關(guān)系,是關(guān)于如何將系統(tǒng)拆分為模塊系統(tǒng)的。
模塊定義:
軟件模塊是獨(dú)立可部署的、可管理的、進(jìn)程內(nèi)可重用的、無狀態(tài)的軟件單元??晒芾砑茨K可以安裝、卸載和更新。
在Java中,模塊就是jar包。
與分布式服務(wù)不同的是,這里的模塊是進(jìn)程內(nèi)重用,需要與想用其功能的進(jìn)程一起部署,而服務(wù)是一次部署被多個(gè)client使用。
僅關(guān)注高層抽象是不夠的,只強(qiáng)調(diào)代碼質(zhì)量也是不夠的,模塊化能填補(bǔ)高層架構(gòu)與底層代碼之間的空白,增加設(shè)計(jì)的靈活性,幫助實(shí)現(xiàn)高適應(yīng)性、高可維護(hù)性的系統(tǒng)架構(gòu)。
模塊是內(nèi)聚的,變化將局限在模塊的實(shí)現(xiàn)細(xì)節(jié)中,即能封裝變化,所以能減小復(fù)雜性,降低維護(hù)成本。
模塊化提供了指導(dǎo)和規(guī)律,讓我們可以在最小化依賴的同時(shí)又能最大化重用的潛能,幫助我們平衡模塊的重量級(jí)和粒度。這里粒度指一個(gè)系統(tǒng)要拆分的各個(gè)部分的范圍大小,重量級(jí)指模塊對(duì)其他環(huán)境依賴的程度。最大化重用會(huì)使得可用復(fù)雜化,設(shè)計(jì)軟件時(shí),圍繞模塊的重量級(jí)和粒度的權(quán)衡是很重要的因素,對(duì)系統(tǒng)的模塊化都是與項(xiàng)目上下文相關(guān)并且要符合當(dāng)時(shí)的情況。一些特定級(jí)別的重用已經(jīng)很成熟了,如ORM框架,Netty框架等。
跨應(yīng)用重用是服務(wù)的最佳用武之地,但通常是粗粒度的,即所做的事情超出我們的需要,如果需要跨應(yīng)用重用一些需要的行為呢?沒有模塊的情況下,我們的選擇是將其暴露為服務(wù)或者復(fù)制類的代碼,兩者都不理想,模塊化就是另一種選擇,在粒度上,模塊是比服務(wù)更小的單元且是部署單元。
模塊化模式
基本模式
管理關(guān)系:設(shè)計(jì)模塊之間的關(guān)系
模塊重用:強(qiáng)調(diào)模塊級(jí)別的重用
模塊內(nèi)聚:模塊的行為應(yīng)該只服務(wù)于一個(gè)目的
依賴模式
非循環(huán)關(guān)系:模塊之間的關(guān)系非循環(huán)依賴
等級(jí)化模塊:模塊關(guān)系是等級(jí)化的,物理分層旨在為組成應(yīng)用的分層創(chuàng)建多個(gè)模塊,更多是與職責(zé)相關(guān),而等級(jí)與理解系統(tǒng)的結(jié)構(gòu)和關(guān)系更為密切,比分層更為細(xì)粒度,一個(gè)分層可能會(huì)有多個(gè)等級(jí)。
物理分層:模塊關(guān)系不影響物理分層,如展現(xiàn)、領(lǐng)域、DAO。
容器獨(dú)立:模塊不依賴于具體容器,采用輕量級(jí)容器,如Spring
獨(dú)立部署:模塊可獨(dú)立部署
可用性模式
發(fā)布接口:暴露API
外部配置:使用獨(dú)立的配置文件用于不同的上下文。外部化配置增加了模塊的重用行,但降低的易用性。如一個(gè)提供連接池的模塊,user,password通過配置文件配置而不是硬編碼在模塊中,這就方便重用,但會(huì)使得易用性降低,因?yàn)槭褂弥氨仨毰渲脤?duì)應(yīng)的上下文
默認(rèn)實(shí)現(xiàn):為模塊接口提供默認(rèn)實(shí)現(xiàn),并提供擴(kuò)展機(jī)制,默認(rèn)實(shí)現(xiàn)有助于在重用和易用之間取得平衡。如dubbo的擴(kuò)展點(diǎn)機(jī)制
模塊門面:為底層細(xì)粒度模塊創(chuàng)建一個(gè)門面,提供高層API協(xié)調(diào)一組細(xì)粒度模塊的行為
擴(kuò)展性模式
抽象化模塊:依賴于抽象而不是具體,典型的例子如通過Spring注入具體實(shí)現(xiàn),bean里面依賴的屬性是接口
實(shí)現(xiàn)工廠:通過實(shí)現(xiàn)工廠建立適當(dāng)?shù)膶?duì)象引用,如Spring的裝配
分離抽象:將抽象類與實(shí)現(xiàn)類放在各自的模塊中,從而能用新的實(shí)現(xiàn)替換已有的實(shí)現(xiàn),幫助創(chuàng)建靈活和可擴(kuò)展的系統(tǒng)
通用模式
就近異常:異常定義應(yīng)該接近拋出他們的模塊
等級(jí)化構(gòu)建:按照模塊的等級(jí)構(gòu)建
測(cè)試模塊:每個(gè)模塊應(yīng)該有一個(gè)對(duì)應(yīng)的測(cè)試模塊
模塊化與OSGiOSGi是Java平臺(tái)中的動(dòng)態(tài)模塊系統(tǒng),定義了一個(gè)模塊化單元,稱之為bundle,是一個(gè)jar文件。bundle會(huì)在同一個(gè)JVM中進(jìn)行部署和交互,在進(jìn)程內(nèi)跨bundle交互,并且可動(dòng)態(tài)部署bundle。
OSGi只是提供一個(gè)運(yùn)行時(shí)環(huán)境,使得在Java平臺(tái)中實(shí)現(xiàn)模塊化成為可能。
自上而下的架構(gòu)
架構(gòu)的目標(biāo)是減少變化的成本和影響
軟件傾向于隨著時(shí)間變得腐化,隨著時(shí)間流逝,變化會(huì)悄然發(fā)生并以難以預(yù)料的方式考驗(yàn)著設(shè)計(jì)
技術(shù)債用來描述為了滿足進(jìn)度或用戶期望而做出的設(shè)計(jì)讓步,與財(cái)務(wù)債一樣,也需要支付利息,在將來的開發(fā)中要付出額外的努力。我們可以選擇繼續(xù)支付利息或用更好的設(shè)計(jì)重構(gòu)來償還本金,盡管償還本金需要成本,但是會(huì)降低將來要支付的利息。
復(fù)雜性阻止我們以優(yōu)雅的方式使軟件系統(tǒng)適應(yīng)需求的變化。
最大化重用會(huì)使得可用復(fù)雜化。即軟件模塊的可重用性越高,則其易用性越差。
模塊化與微服務(wù)通過上文的描述,我們已經(jīng)了解了模塊化思想,那與如今的微服務(wù)是什么關(guān)系呢?
微服務(wù)也是可獨(dú)立部署于容器的,每個(gè)微服務(wù)僅關(guān)注于完成一件任務(wù)并很好地完成該任務(wù),每個(gè)任務(wù)代表著一個(gè)小的業(yè)務(wù)能力。各個(gè)微服務(wù)之間通過輕量級(jí)協(xié)議(RESTful API接口, 輕量級(jí)消息機(jī)制)交互通信。與模塊化強(qiáng)調(diào)的進(jìn)程內(nèi)重用不同,微服務(wù)屬于分布式服務(wù),通過RPC協(xié)議在進(jìn)程間重用。
相似點(diǎn):
兩者都是可獨(dú)立部署的,重視邏輯的可復(fù)用性,強(qiáng)調(diào)一個(gè)大的軟件系統(tǒng)需要拆分為各個(gè)部分,保持高內(nèi)聚低耦合,實(shí)現(xiàn)更好的軟件架構(gòu)。
個(gè)人理解:
微服務(wù)架構(gòu)更勝一籌于模塊化架構(gòu)思想。提出模塊化架構(gòu)的本書(中文版)發(fā)版于2013年,微服務(wù)的概念源于2014年,兩者目的相似,現(xiàn)如今已有大量企業(yè)對(duì)已有系統(tǒng)進(jìn)行改造或?qū)嵤┪⒎?wù)架構(gòu),開發(fā)人員對(duì)微服務(wù)的認(rèn)知逐漸深入,大的市場(chǎng)環(huán)境已經(jīng)采用了微服務(wù)架構(gòu)。又微服務(wù)已經(jīng)是一個(gè)較小且完整的業(yè)務(wù)部署單元,不會(huì)將其拆分為多個(gè)模塊化單元在同一進(jìn)程中部署,就算拆分也是將其拆分為更細(xì)粒度的微服務(wù)。
雖然實(shí)施微服務(wù)需要具備完善的基礎(chǔ)設(shè)施,如容器化、服務(wù)注冊(cè)發(fā)現(xiàn)、配置管理、監(jiān)控等DevOps開發(fā)運(yùn)維一體化設(shè)施,但隨著應(yīng)用云化的日益普及,相關(guān)設(shè)施不斷完善,如SpringCloud,其實(shí)施的門檻已經(jīng)較低了。
且動(dòng)態(tài)模塊化技術(shù)如OSGi尚未普及,所以,個(gè)人認(rèn)為微服務(wù)架構(gòu)比模塊化架構(gòu)更優(yōu)。
模塊化與Java9 JigsawJava 9Java 平臺(tái)模塊化項(xiàng)目(Jigsaw )參考 https://mp.weixin.qq.com/s/Sr...
參考微服務(wù)相關(guān):
https://www.ibm.com/developer...
https://martinfowler.com/micr...
個(gè)人博客:https://my.oschina.net/hebaod...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70757.html
摘要:最終形成可以被虛擬機(jī)最直接使用的類型的過程就是虛擬機(jī)的類加載機(jī)制。即重寫一個(gè)類加載器的方法驗(yàn)證驗(yàn)證是連接階段的第一步,這一階段的目的是為了確保文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)自身的安全。 《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐(第二版》讀書筆記與常見相關(guān)面試題總結(jié) 本節(jié)常見面試題(推薦帶著問題閱讀,問題答案在文中都有提到): 簡(jiǎn)單說說類加載過...
摘要:用來表示一個(gè)應(yīng)用表示實(shí)例與當(dāng)處理請(qǐng)求時(shí),需要將請(qǐng)求映射到具體的容器進(jìn)行處理請(qǐng)求映射,除了考慮映射規(guī)則,這時(shí)候還要對(duì)進(jìn)行生命周期的管理組件的注冊(cè)初始化銷毀等等適配器模式解耦,與以及的溝通橋梁 title: Tomcat靜態(tài)架構(gòu)date: 2018-10-24 13:46:20tags: tomcat 讀書筆記 《Tomcat架構(gòu)解析》讀書筆記一 大體設(shè)計(jì)思路 接收客戶端請(qǐng)求(Co...
摘要:文本已收錄至我的倉庫,歡迎回顧上一篇大型網(wǎng)站系統(tǒng)與中間件讀書筆記一這周周末讀了第四章,現(xiàn)在過來做做筆記,希望能幫助到大家。沒錯(cuò),我們通過肯定是可以完成兩個(gè)系統(tǒng)之間的通信的問題的。 前言 只有光頭才能變強(qiáng)。文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 回顧上一篇: 《大型網(wǎng)站系統(tǒng)與Java中間件》讀書筆記(一)...
摘要:另一個(gè)用戶請(qǐng)求過來,負(fù)載均衡器指派這個(gè)請(qǐng)求到服務(wù)器。這樣就平攤了請(qǐng)求這種方式就叫做輪詢策略還有很多種,就看你想怎么實(shí)現(xiàn)了,反正這個(gè)邏輯的代碼放在負(fù)載均衡器上。 前言 只有光頭才能變強(qiáng)。文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 這本書買了一段時(shí)間了,之前在杭州沒帶過去,現(xiàn)在讀完第三章,來做做筆記 showI...
閱讀 3339·2023-04-26 02:09
閱讀 2652·2021-11-24 09:39
閱讀 3322·2021-11-16 11:52
閱讀 3643·2021-10-26 09:50
閱讀 2800·2021-10-08 10:05
閱讀 2494·2021-09-22 15:25
閱讀 3332·2019-08-30 13:14
閱讀 947·2019-08-29 17:06