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