{eval=Array;=+count(Array);}
軟件產品架構是不斷迭代演化的,從單體服務架構發展到現在的服務化、微服務的架構。
單體架構就是所有的業務模塊都是耦合在一個項目中,開發、部署都在一起;如果其中一個模塊需要上線升級,那么所有模塊都要一起啟停;
在早期,單體架構的項目團隊成員需要是“全棧”,因為前端、后端、數據庫都是一波人負責,后來開始進行了邏輯分層,團隊也分成了前端 UI 團隊、后端和 DBA 團隊,每個團隊都有自己負責的職責。
然而隨著業務邏輯越來越復雜,模塊和模塊之間的耦合度越來越高;另外隨著用戶和數據量的增多,單體架構也不再能夠支撐高并發和大數據。
為了解決上面的問題,SOA 出現了。
SOA 代表了面向服務的架構,SOA 將應用程序的業務模塊進行拆分,形成獨立的應用系統,系統和系統之間通過明確的接口串聯起來;
每個系統內部結構和邏輯發生改變,并不影響對外提供的服務,只要保持接口不變,服務內部對外是透明的;
SOA 架構中,服務定義標注的接口,可以提供給多個調用方使用,增加了服務的重用性。
SOA 架構時代有兩個很重要技術實現方式:Web Service 和 ESB :前者提供了標準的數據傳輸協議,后者實現了服務編排和協議轉換。
但是隨著用戶和數據量的進一步增長,SOA 也暴露出來一些缺點,比如 SOAP 協議、XML較重;服務管理不完善;ESB本身就比較重,而且它本身算是一個單點,在軟件架構中,單點意味著風險。
在微服務的架構中,各個微服務可以獨立開發,獨立部署;微服務之間通常使用Restful風格的API通信,傳輸格式也通常選擇JSON;
微服務是SOA架構的延續,它們和單體應用相比,大大提高了系統的負載能力,解決了應用高并發的需求;
服務和服務之間的耦合度也被降低,并且項目團隊可以被拆分成多個小團隊,每個微服務都可以進行敏捷開發部署;
每個團隊的技術棧也可以不相同,只要遵守接口協議即可。
至于微服務和 SOA 架構的區別,我是這樣理解的:SOA 架構和微服務架構都屬于分布式架構,分布式的思想就是把不同的業務模塊,部署在不同的服務器上,以應對高并發的問題;SOA 是一種分布式架構,把業務系統分成多個子系統,提供不同的服務,再通過服務組合、編排實現業務流程;微服務是SOA的升華,如果非要說點兒不同的,那么微服務更加強調服務的細分和專業,去ESB總線、去中心化,部署粒度更細,服務擴展更靈活。
當然SOA、微服務的出現,在解決一些問題的時候,也帶來了另外一部分的問題,比如增加了網絡開銷、服務依賴性、增加了測試運維難度、數據一致性問題等等。
面對微服務如火如荼的發展,很多人都在了解,學習希望能在自己的項目中幫得上忙,當你對微服務的廬山真面目有所了解后,接下來就是說服自己了,到底如何評估微服務,什么時候使用微服務,什么時間點最合適,需要哪些技術儲備和資源投入等等,這些都是你需要面對和解決的。
本文從單體架構,微服務架構,微服務風險評估,微服務落地條件等幾個方面探討微服務的落地過程,希望對你有所啟發。
講解微服務之前,我們先簡單了解下單體架構。
單體架構的優點:
單體架構的缺點:
隨著業務的復雜度增加,單體的靈活度會逐漸下降,比如:
單體適用場景:
架構設計的三大原則告訴我們,架構需要的是簡單、適度、演化。
對于項目起步階段,單體是最高效也是最節省成本的方式。因為初期階段,由于人力,成本,業務熟悉程度,微服務技術積累等因素,如何過度設計可能工期和復雜度會急劇上升,造成交付困難,問題百出,從而錯過了時間窗口。最合適,簡單的方式還是單體優先,這是創業公司的特點決定的。當然設計面向微服務的單體架構也是一種聰明的方法,這遵守了系統演化的法則。
單體分層目的:
無論采取何種維度的架構分層,分層的最核心目的是保證各層之間的差異足夠清晰,邊界足夠明顯,為將來可能產生的變化提供最容易、最小化的修改。比如客戶端要從安卓替換為IOS,底層無須任何改動,就像替換積木一樣。又比如,設備需要接入新的設備或協議,其他層也不需要做任何變化,可以無縫平滑接入任何設備。
建議
如果前期在業務不十分清晰,求的是驗證想法,證明產品思路是否可行性,并且業務量不大,僅限于省級范圍,建議只要對當前架構稍加改良升級就可以了,這樣改動量相對較小,且至少能支撐一定時間段的業務增長。
微服務的優勢
支撐的業務更加龐大,可以支撐海量用戶高并發和海量設備接入,支持分布式多機房,多區域部署,支持服務器無限擴容。支持私有云,公有云,混合云等部署方式。所以微服務是大多數互聯網公司的首選。
微服務的代價
微服務架構圖
微服務架構圖譜谷歌或Bing下,可以看到各種各樣的架構圖,源于業務和架構師自身的喜好或者粗細粒度,但是每個架構圖的基本組件和架構分層都差別不大,只是有的細一些,有的粗一下。比如有客戶端層,容器層(K8S),API Gateway,微服務集群層,EventBus層是必須要有的,至于服務監控和服務跟蹤、服務治理本身就是一個完整的系統,粒度就沒有細了。基于這些概念,我把架構圖稍微細化一下,這里省去服務監控跟蹤和治理的部分,后續多帶帶抽離出來分析。
這邊的架構圖譜相對之前的架構圖,更加貼近業務,粒度也更細,雖然個別組件有所省略,比如跟蹤和治理部分。
以上架構圖主要分4層,每個層次遵循架構分層的核心思想:關注點分離,職責各異,邊界清晰。
第1層:客戶端:理論上包含一切可以聯網的設備,包括移動設備,Android、IoS、Pad、微信、微博、QQ、Web、各自瀏覽器、物聯網設備等等……
第2層:API網關:包括服務注冊,發現,認證授權,單點登錄,熔斷,限流……網關的知識點豐富,是微服務的核心之一。
第3層:微服務集群:包括各種具體的microservice,比如縱向劃分的業務服務(用戶服務,訂單服務,……),橫向劃分的基礎或公共服務(元數據服務,公共服務……)
其他微服務的地址可能是這樣的:
第4層:事件總線:Event Bus 目的是消息解耦,不要讓服務之間直接的鏈接。不同與SOA的服務總線,事件總線相對比較輕量,經常基于消息隊列引擎進行解耦,目的是為了讓服務之間的關聯弱化,不直接進行關聯。很多時候用的是相對穩定、可靠、企業級的RabbitMQ。
微服務的架構其實不難,根據以上的架構,每種業務都可以進行套用,這里的難點在于服務的劃分和粒度控制,另外如何管理膨脹的服務是一個麻煩事。
3.1楊波說
這里引用架構師楊波(前Ebay架構師,目前任職拍拍貸研發部總監,資深技術架構師,微服務技術專家)的一些觀點:
“企業一開始不推薦直接使用微服務,因為微服務需要前期基礎設施的投資,復雜性很高,如果對問題領域并不是很理解,一開始用微服務,你很難去劃分服務的邊界,你的生產力反而會比較低,而且你花了很大精力進行開發,你的產品并沒有被市場驗證過,有可能會失敗,所以這個選項風險會比較高。所以我們推薦的是單塊優先,先從單塊運用做起,這樣成本低,團隊成員也比較少,無須太多研發投入,就可以交付一些基本的功能給客戶使用。
隨著應用越來越成功,客戶增加,你的系統復雜度會越來越高,就會出現單塊應用和團隊規模之間的矛盾,生產力會隨著業務復雜度逐漸降低。所以在一些初創型公司,你更多看到的是單塊應用,只有一些中大型的公司會看到微服務架構。”
“交叉點表明,業務已經到達了一定的復雜性,單塊應用已經無法滿足業務增長的需要,研發效率開始下降了,而微服務可以提升研發和交付的效率。這個點需要架構師去綜合,權衡。個人經驗,一般團隊需要達到百人規模,才去考慮微服務。”
以上的觀點講的很中肯,給我的啟發和幫助非常大。這里的交叉點怎么來確定和評估是重點,比如我們上線一個社交姑且叫抖信,初期為了快速上線,驗證可行性,可以只開發首頁聊天、通訊錄、評論等基本功能。產品上線后,經過一段時間的運營,用戶開始逐步增多,可行性驗證通過,下一階段就需要進一步增加更多的新特性來吸引更多的目標用戶,比如再給這個社交抖信添加朋友圈、消息通知、游戲、電商等等功能。
“一般情況下,這個時候就需要大規模地擴張開發人員,以支撐多個功能的開發。如果這個時候繼續采用單體應用架構,多個功能模塊混雜在一起開發、測試和部署的話,就會導致不同功能之間相互影響,一次打包部署需要所有的功能都測試 OK 才能上線。
不僅如此,多個功能模塊混部在一起,對線上服務的穩定性也是個巨大的挑戰。比如 A 開發的一個功能由于代碼編寫考慮不夠全面,上線后產生了內存泄漏,運行一段時間后進程異常退出,那么部署在這個服務池中的所有功能都不可訪問。
根據我的實際項目經驗,一旦單體應用同時進行開發的人員超過 10 人,就會遇到上面的問題,這個時候就該考慮進行服務化拆分了。”---胡忠想(微博微服務技術專家)
至此,我們何時采用微服務已經十分明確了,關鍵是業務復雜度和團隊規模兩大要點,而業務復雜度和市場窗口是權衡和抉擇的首要因素。
3.2微服務落地條件評估
一般情況下,業務系統引入新技術就必然會帶來架構的復雜度提升,在具體決策前,你先要認識到新架構會帶來哪些新的問題,這些問題你和你的團隊是否能夠解決?如何解決?是自己投入人力建設,還是采用業界開源方案?假如你和我一樣都是微服務的旁觀者或者學習者,那么下面的評估也許對你又所參考。
3.2.1落地方式選擇
不同的落地方式決定不同的資源配置。
方式一:借力外部架構咨詢公司提供架構DEMO和培訓服務助推內部團隊技術轉型升級。
方式二:招聘相關經驗豐富的人員進來,自行研究和搭建架構并做內部培訓,推動團隊技術升級。
建議:如果比較緊急,采用第一種方式,因為招聘匹配的人才比較困難,等不起。但是不管是那種方式,對于團隊來說都需要一定的技術人才儲備方便后續交接和運維。
3.2.2人才儲備
這里分成兩類人員,一類是研究型,一類是應用型。研究型主要是以技術攻堅為主,負責微服務的核心組件的研究和開發,比如服務發布和訂閱,服務跟蹤和監控,服務的治理;應用型主要是負責技術理解應用為主。
3.2.3技術儲備
微服務相關技術棧和微服務周邊技術棧。周邊技術棧包括領域驅動涉及,持續交付,分布式至少,負載均衡,CAP理論,緩存原理,DevOps和容器化技術。
3.2.4團隊規模評估
楊波在給微服務的開發團隊規劃時候給了一個百人左右的大概預估,至于到底需要多少開發人員就沒有細說,可能作者本身呆過的公司都是大廠,對人力成本控制沒有那么大的包袱,對于中小企業,人力是最貴的成本。如果要一定要上微服務,該怎么辦?
對于微服務的團隊規模眾說紛紜,有的說要百來號人;有的說需要精兵10人左右;有的說和人數沒有關系,只和業務有關;有的說一個懂微服務的架構師也能搞定。這些說法都比較籠統,如果你想上微服務,人力評估包括人力、能力、人數等等,這些因素還是非常重要的,畢竟成本才是商業的本質,有可能不客觀的規劃會導致項目的潰敗。
對于微服務的團隊規模是哪些方面決定的呢?我覺得至少要從以下兩個維度來評估:
業務規模:如果你們的業務架構非常復雜,有倉儲系統開發,ERP系統,OA系統,訂單系統等等,業務越多,需求人數越多(這里人數指的都是后臺開發人數)。
技術能力:另外,別忘了非功能性的開發,比如API網關,服務跟蹤、治理等也是需要人去開發和維護的,這些非功能性的核心組件需要多少人,由于沒有完整的開發經驗,加上個別組件,比如跟蹤系統,開發的程度可深可淺,開發周期可長可短,以目前個人的經驗還無法給與合理的建議。可能牛人1個人兩周就夠了,也可能高級開發2個人,一人分工三個核心組件,兩周也夠用。或者架構外包,只要交接的人能跟上,也是一種解決方案。
總結:1個精通微服務落地經驗的架構師是必不可少的,圍繞架構師周邊一幫高級開發,按根據實際業務來確定,一般一個開發負責2-3個核心模塊,不宜太多,比如目前核心模塊有8個,對應人數配置大概在3-4個左右。
3.3轉微服務風險評估
3.3.1重寫面廣
由于是架構級別的調整,之前能保留下來的大部分是解耦比較好的代碼,比如前端代碼,采集服務代碼,部分業務邏輯代碼,所以對現有框架沖擊面比較大。
3.3.2復雜度高
因為微服務是一種觀念和思想,又是新近技術,本身就有各種架構實現方式和技術解決方案。所以對技術人員來說,對比選型本身就是一個考驗。加上本身涉及的技術面就比較廣,所以復雜度和門檻相對比較高。
但是該技術發源于亞馬遜,經過近些年的發展,雖然還在發展,但是已經相對成熟。
3.3.3人員配置
微服務架構工作量主要集中在后端,對后端開發人員的技術級別有較高的要求,主要是對微服務原理和開源組件的熟悉上,同時需要具備整體的微服務的意識。暫時不具備整體微服務開發意識和經驗,需要通過培訓后進行轉型升級。
3.3.4合作方式
如果采用借助外部架構力量來助推架構升級,和架構單位的合作就不是簡單的外包,涉及的面會變得比較廣,在完全交接過來之前,周期會比較長。包括對我們業務架構的深入了解,然后根據業務架構繪制可靠技術架構藍圖,再根據技術藍圖進行落地實施(不建議只提供架構方案而由其他單位實施落地),包括新系統的開發,舊系統的升級,當然這種升級是平滑過度的,對業務窗口并不會產生影響。
3.4合理的拆分姿勢
如何正確拆分?這里正確指的是合理,因為沒有絕對的標準。按照前人的經驗可以分為縱向和橫向兩種劃分方法:
3.4.1縱向拆分
是從業務維度進行拆分。標準是按照業務的關聯程度來決定,關聯比較密切的業務適合拆分為一個微服務,而功能相對比較獨立的業務適合多帶帶拆分為一個微服務,比如上圖中的訂單服務,用戶服務。另外粒度太小,服務聚合是一個坑,粒度太大,分和沒分一個樣。
3.4.2橫向拆分
是從公共且獨立功能維度拆分。標準是按照是否有公共的被多個其他服務調用,且依賴的資源獨立不與其他業務耦合。比如上圖中的元數據服務和消息服務。
3.4.3總結
借用《微服務設計》中的一句話:“你越不了解一個領域,為服務找到合適的界限上下文就越難……服務的界限劃分錯誤,可能會導致不得不頻繁地更改服務間的協作,而這種更改成本更高……”
由于SOA和微服務有千絲萬縷的關系,這里簡單羅列雙方的對比圖,算是一個小知識點:
兩種架構背后的意圖是不同的:SOA嘗試將應用集成,一般采用中央管理模式來確保各應用能夠交互運作。微服務嘗試部署新功能,快速有效地擴展開發團隊。它著重于分散管理、代碼再利用與自動化執行。
最后讓我們回顧一下前人經典的話語:
還是回到我們架構設計的原則上,遵循簡單,適用,演化的原則,那么你的抉擇也許會變得沒有那么令人糾纏。
在傳統IT行業的軟件系統設計大多都是各種獨立子系統的堆砌,這也就是所說的單體架構,其本身擴展性差,可靠性低,維護成本高。單體架構在初期系統規模比較小的情況下尚且能夠較好的支撐,但是隨著系統規模的擴大,它暴露出來的問題也越來越多,主要有以下幾點:
隨后,引入了SOA服務化(面向服務的架構,它將應用程序的不同功能單元(服務)進行拆分,并通過這些服務之間定義良好的接口和契約聯系起來)。但是,由于 SOA 早期均使用了ESB總線模式,這種總線模式與某種技術棧是強綁定的,如,J2EE。這又使得很多企業的遺留系統很難對接,切換時間太長,對接成本太高,新系統穩定性的收斂也需要一些時間。最終 SOA 看起來很美,但卻成為了企業級奢侈品,中小公司都望而生畏。
微服務是在 SOA 上做的升華,微服務最早由Martin Fowler與James Lewis于2014年共同提出,微服務架構風格是一種使用一套小服務來開發單個應用的方式途徑,每個服務運行在自己的進程中,并使用輕量級機制通信,通常是HTTP Rest API的方式(告別ESB服務總線),這些服務基于業務能力構建,并能夠通過自動化部署機制來獨立部署,這些服務使用不同的編程語言實現,以及不同數據存儲技術,并保持最低限度的集中式管理。
簡單講,微服務不再強調傳統SOA架構里面比較重的ESB服務總線,同時將SOA的思想延伸到單個業務系統內部實現真正的組件化。微服務架構強調的一個重點是“業務需要徹底的組件化和服務化”。
從微服務的概念可以看出它有如下好處:
轉自 @軟件測試開發技術棧 ,希望對您有所幫助。
單體機構是指在軟件設計中使用經典的 3 層模型,即表示層、業務邏輯層和數據訪問層。雖然在設計中劃分了 3 層模型,但是對業務場景沒有劃分。一個典型的單體應用就是將所有的業務場景的表示層、業務邏輯層和數據訪問層放在一個工程中,最終經過編譯、打包,部署在一臺服務器上。
優點:
缺點:
SOA架構即面向服務架構,是一種粗粒度、松耦合服務架構。基于SOA服務思想進行功能的抽取,它將應用程序的不同功能單元(稱為服務)通過這些服務之間定義良好的接口和契約聯系起來,以服務為中心各個系統之間依靠ESB企業服務總線進行調用,這使得構件在各種各樣的系統中的服務可以以一種統一和通用的方式進行交互。
優點:
缺點:
微服務架構是把一個大型的單個應用程序和服務拆分為多個的微服務,每個微服務僅關注并很好的完成一件任務。它的主要作用是將功能分解到離散的各個服務當中,從而降低系統的耦合性,并提供更加靈活的服務支持。
優點:
缺點:
其實,這三者到現在來說未必是那樣經緯分明、非此即彼,很多基于微服務的單體架構應用、結合分布式的SOA云服務總線來實現線上線下集成、內部跟外部集成、構建柔韌的企業IT架構、滿足業務的變化、推動業務創新和變革,是軟件架構不斷優化、變遷、提升的源動力。
一圖了解什么是單體架構、SOA架構、微服務架構
分別從三個維度來展示:
1、軟件過程維度
單體架構通常采用瀑布模型開發;
SOA架構通常采用敏捷/XP編程模式;
微服務架構采用DevOps,使用IT交付流水線來全自動管理;
2、從架構維度
單體架構通常采用巨石結構,不易維護;
SOA架構通常以服務的方式對外連接,常見的支撐平臺有ESB企業服務總線進行服務貫通;
微服務架構采用更細的拆分模式,每個獨立的模塊有多帶帶的數據庫、運行環境,在業務上完成一個具體的功能;
3、從部署形態維度
單體架構早期多運行在物理機中,當然后期也可以運行在虛擬化資源中;
SOA架構多運行在虛擬化/IAAS平臺上;
微服務架構目前多運行在容器平臺上(當然也可以運行在虛擬化資源和物理機中,這種情況享受不到容器帶來的便利性);
單體架構
* 一個典型的單體應用就是將所有的業務場景的表示層、業務邏輯層和數據訪問層放在一個工程中,最終經過編譯、打包,部署在一臺服務器上。
`例如:典型的J2EE工程,它是將表示層的JSP、業務邏輯層的Service、Controller和數據訪問層的Dao,打成war包,部署在Tomcat、Jetty或者其他Servlet容器中運行`
SOA架構
* SOA架構是面向服務的體系結構,主要目的是為了各個系統更加容易地融合在一起。
`例如:以購物商城為例,由于功能模塊越來越多,系統非常臃腫所有對系統進行橫向拆分,各個服務之間彼此相對獨立,通過服務治理框架進行服務之間的通信以及管理,常用的服務治理框架有:dubbo、dubbox等`
微服務架構
微服務是將一個大型復雜軟件應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是松耦合的。每個微服務僅關注于完成一件任務并很好地完成該任務。在所有情況下,每個任務代表著一個小的業務模塊。
我在低代碼開發平臺領域中接觸最多的就是微服務架構,微服務是指開發一個單個 小型的但有業務功能的服務,每個服務都有自己的處理和輕量通訊機制,可以部署在單個或多個服務器上,而且部署方式也有多種,集群部署,雙機部署,單機部署等等,天翎的myapps平臺就是一個很好的例子,可以去了解一下這個架構,是三種架構里面使用得比較多也比較方便的軟件產品架構
表面上看這是一個大問題。
實質有內聯關系。
你可以把一個單體架構的應用看作是一大整塊豆腐。
SOA架構就是豆腐切塊了。
微服務架構就是豆腐切塊了之后又切成豆腐丁了。
大塊有大塊的好處,小塊有小塊的好處。
這里的利弊就是你打算怎么個做法能吃起來更可口。
應用切分到微服務也并不是絕對的好。
技術架構細分也是軟件細化分工的一種體現。
僅此而已。
0
回答2
回答0
回答0
回答0
回答2
回答1
回答0
回答0
回答0
回答