時下軟體界,架構界吹起了微服務之風,軟體從傳統的CS到BS,從單體到多伺服器,再到現在的微服務;很多夥伴們也跟着技術潮流越來越多的在關注和學些或使用微服務解決項目中遇到的很多問題。本人也在軟體行業20來年了,所謂活到老學到老,從軟體開發,到軟體設計,到軟體架構,種種心路曆曆在目。不過現在我要說的并不是我自己的從業經曆,而是我最近在架構方面的學習和領悟所感分享給大家。
架構定義:
軟體架構是一個用于指導系統實作的草圖,草圖包括架構圖和設計文檔,草圖越詳細對系統實作的指導意義就越重要,且貫穿于軟體的整個生命周期。
軟體生命周期中架構設計的展現:
設計期:架構設計是重中之重。需求導向,架構先行。具體工作包括:系統拆分,技術選型,技術驗證,接口規範,內建方式,技術規範,部署方案,運維方案等等。
實作期:確定各項技術規範和技術名額的執行落地,保障高品質的代碼;指導研發任意和解決各類技術問題,提高研發團隊效率;制定測試的技術性方案,包括自動化、性能、安全等方面;配合準備部署環境,運維實施方案落地。
運作期:釋出上線相關基礎工作,包括是否使用持續內建,自動化釋出等技術;運維基礎性工作,自動化運維、監控等相關技術。
架構的目标和方法:
目标:可控性與拆分;複用性與抽象;非功能性需求九維目标:高性能,可靠性,穩定性,可用性,安全性,靈活性,易用性,可擴充性,可維護性。
方法:4+1視圖模型。用例視圖或叫場景視圖(用例圖);邏輯視圖(類圖,互動圖,時序圖);開發視圖(元件圖和包圖);程序視圖(活動圖);實體視圖(部署視圖)
架構風格發展:
單體架構:整個系統的所有功能單元部署到同一個程序中。可以分為:
簡單單體模式:代碼層面沒有拆分,所有業務邏輯都在一個項目中。
MVC模式:按職責劃分為模型(Model)視圖(View)控制器(Controller)
前後端分離:前端邏輯和後端邏輯獨立編寫。
元件模式:系統每一個子產品拆分為一個子項目。
類庫模式:把被依賴系統作為元件庫,打包到目前系統使用
分布式架構:
面向服務架構(Service Oriented Architecture):通過講業務系統服務化将不同子產品解耦;落地方式分為:分布式服務化(Dubbo),集中式管理化(OpenESB);兩大基石:RPC(RR請求響應模式,OneWay單向調用模式,Futrue異步模式,Callback回調模式)和MQ(點對點和釋出訂閱模式)。
微服務架構(Micro Services Architecture):由一些獨立的服務共同組成系統;每個服務單獨部署、獨立運作在自己的程序中;每個服務是獨立的業務;分布式管理。
SOA和MSA的差別:微服務是一種經過良好架構設計的SOA解決方案,是面向服務的傳遞方案;微服務更趨向于以自治的方式長生價值;微服務與靈活開發思想高度結合在一起,服務的定義更加清晰,同時減少了企業ESB開發的複雜性;微服務是SOA思想的一種提煉;SOA是重ESB,微服務是輕網關。
微服務面臨的問題:防止雪崩(請求壓力大限流);功能降級(故障時有容錯手段保障整體應用);幂等(多次下同一訂單結果永遠同一個);緩存(變化小讀取量大的資料);逾時;熔斷(下遊失敗産生一定機率後熔斷開啟直接傳回失敗);服務隔離(上遊能隔離故障);可伸縮(根據業務場景擴容和縮容);資料庫拆分(獨立服務提供單獨的資料庫);可擴充(小改動代碼增加新功能)。
微服務領域驅動設計
引入原因
微服務架構包含2個次元:技術次元和業務次元。技術次元交給基礎架構設計者和微服務架構保障;業務次元的關注點是領域驅動設計所擅長的。
定義
領域驅動設計是一種方法論,建立以領域為核心驅動力的設計體系。将要解決的業務概念和業務規則轉換為軟體體系中的類型及類型的屬性和行為,通過合理運用面向對象的封裝、繼承、多态等設計要素,降低系統業務複雜性,且更具擴充性。
概覽
設計階段
戰略設計階段:從問題域和架構2方面考慮。
問題域:核心領域、子領域;限界上下文、上下文映射。
結構方面:分層架構、六邊形架構、CQRS(Command Query Resonsibility Seperation)模式
戰術設計階段:對每個限界上下文進行設計,用領域模型表達複雜的領域知識,模型要素包括:實體、值對象、聚合、領域服務、領域事件、工廠、資源庫、應用服務。
設計過程
戰略設計界定邊界和粒度;戰術設計驗證模型有效性、完整和一緻性;兩者形成一種演進式的疊代設計過程。