面對微服務如火如荼的發展,很多人都在了解,學習希望能在自己的項目中幫得上忙,當你對微服務的廬山真面目有所了解后,接下來就是說服自己了,到底如何評估微服務,什么時候使用微服務,什么時間點最合適,需要哪些技術儲備和資源投入等等,這些都是你需要面對和解決的。
本文從單體架構,微服務架構,微服務風險評估,微服務落地條件等幾個方面探討微服務的落地過程,希望對你有所啟發。
講解微服務之前,我們先簡單了解下單體架構。
一、單體架構
單體架構的優點:
- 快速開發和驗證想法,證明產品思路是否可行
- 投入資源和成本,包括人力和物力相對比較節約
單體架構的缺點:
隨着業務的復雜度增加,單體的靈活度會逐漸下降,比如:
- IDE過載:隨着代碼量增加,代碼整體編譯效率下降。
- 規模化:無法滿足團隊規模化高效開發。
- 系統開發、測試、部署的沖突和效率低下等問題
- 只能關注一套技術棧
- 應用擴展性比較差
- 海量用戶高並發訪問數量有限
單體適用場景:
架構設計的三大原則告訴我們,架構需要的是簡單、適度、演化。
對於項目起步階段,單體是最高效也是最節省成本的方式。因為初期階段,由於人力,成本,業務熟悉程度,微服務技術積累等因素,如何過度設計可能工期和復雜度會急劇上升,造成交付困難,問題百出,從而錯過了時間窗口。最合適,簡單的方式還是單體優先,這是創業公司的特點決定的。當然設計面向微服務的單體架構也是一種聰明的方法,這遵守了系統演化的法則。
單體分層目的:
無論采取何種維度的架構分層,分層的最核心目的是保證各層之間的差異足夠清晰,邊界足夠明顯,為將來可能產生的變化提供最容易、最小化的修改。比如客戶端要從安卓替換為IOS,底層無須任何改動,就像替換積木一樣。又比如,設備需要接入新的設備或協議,其他層也不需要做任何變化,可以無縫平滑接入任何設備。
建議
如果前期在業務不十分清晰,求的是驗證想法,證明產品思路是否可行性,並且業務量不大,僅限於省級范圍,建議只要對當前架構稍加改良升級就可以了,這樣改動量相對較小,且至少能支撐一定時間段的業務增長。
二、微服務架構
微服務的優勢
支撐的業務更加龐大,可以支撐海量用戶高並發和海量設備接入,支持分布式多機房,多區域部署,支持服務器無限擴容。支持私有雲,公有雲,混合雲等部署方式。所以微服務是大多數互聯網公司的首選。
微服務的代價
- 技術門檻高:微服務包括,服務描述,注冊中心,服務框架,服務監控,服務追蹤,服務治理等幾大基本組件,以上每個組件缺一不可,每個組件展開又包括很多技術門檻,比如,容器技術,持續部署,DevOps等相關概念。
- 復雜性增加:相對單體架構將所有功能打包部署在一起,集中地進行開發、測試和運維,微服務會將這些單體的服務進行拆分部署,業務拆分粒度是一個難點,拆分后服務聚合也是一個麻煩。因為服務粒度增加后,相互調用,相互依存,所以問題排查難度會增加,就需要一套完整的服務監控,服務跟蹤和治理的系統。
- 觀念變化:微服務不僅僅是技術的升級,更是開發方式、組織架構、開發觀念的轉變。
- 前期投入成本較高
微服務架構圖
微服務架構圖譜谷歌或Bing下,可以看到各種各樣的架構圖,源於業務和架構師自身的喜好或者粗細粒度,但是每個架構圖的基本組件和架構分層都差別不大,只是有的細一些,有的粗一下。比如有客戶端層,容器層(K8S),API Gateway,微服務集群層,EventBus層是必須要有的,至於服務監控和服務跟蹤、服務治理本身就是一個完整的系統,粒度就沒有細了。基於這些概念,我把架構圖稍微細化一下,這里省去服務監控跟蹤和治理的部分,后續單獨抽離出來分析。
這邊的架構圖譜相對之前的架構圖,更加貼近業務,粒度也更細,雖然個別組件有所省略,比如跟蹤和治理部分。
以上架構圖主要分4層,每個層次遵循架構分層的核心思想:關注點分離,職責各異,邊界清晰。
第1層:客戶端:理論上包含一切可以聯網的設備,包括移動設備,Android、IoS、Pad、微信、微博、QQ、Web、各自瀏覽器、物聯網設備等等……
第2層:API網關:包括服務注冊,發現,認證授權,單點登錄,熔斷,限流……網關的知識點豐富,是微服務的核心之一。
-
- 假如網關對外提供統一的地址:www.jackyfei.com
第3層:微服務集群:包括各種具體的microservice,比如縱向划分的業務服務(用戶服務,訂單服務,……),橫向划分的基礎或公共服務(元數據服務,公共服務……)
其他微服務的地址可能是這樣的:
-
- 用戶服務:1.user.jackyfei.com
- 訂單服務:2.order.jackyfei.com
- 元數據服務:3.base.jackyfei.com
- 消息服務:4.msg.jackyfei.com
第4層:事件總線:Event Bus 目的是消息解耦,不要讓服務之間直接的鏈接。不同與SOA的服務總線,事件總線相對比較輕量,經常基於消息隊列引擎進行解耦,目的是為了讓服務之間的關聯弱化,不直接進行關聯。很多時候用的是相對穩定、可靠、企業級的RabbitMQ。
微服務的架構其實不難,根據以上的架構,每種業務都可以進行套用,這里的難點在於服務的划分和粒度控制,另外如何管理膨脹的服務是一個麻煩事。
三、何時采用微服務?
3.1楊波說
這里引用架構師楊波(前Ebay架構師,目前任職拍拍貸研發部總監,資深技術架構師,微服務技術專家)的一些觀點:


3.2微服務落地條件評估
一般情況下,業務系統引入新技術就必然會帶來架構的復雜度提升,在具體決策前,你先要認識到新架構會帶來哪些新的問題,這些問題你和你的團隊是否能夠解決?如何解決?是自己投入人力建設,還是采用業界開源方案?假如你和我一樣都是微服務的旁觀者或者學習者,那么下面的評估也許對你又所參考。
3.2.1落地方式選擇
不同的落地方式決定不同的資源配置。
方式一:借力外部架構咨詢公司提供架構DEMO和培訓服務助推內部團隊技術轉型升級。
方式二:招聘相關經驗豐富的人員進來,自行研究和搭建架構並做內部培訓,推動團隊技術升級。
建議:如果比較緊急,采用第一種方式,因為招聘匹配的人才比較困難,等不起。但是不管是那種方式,對於團隊來說都需要一定的技術人才儲備方便后續交接和運維。
3.2.2人才儲備
這里分成兩類人員,一類是研究型,一類是應用型。研究型主要是以技術攻堅為主,負責微服務的核心組件的研究和開發,比如服務發布和訂閱,服務跟蹤和監控,服務的治理;應用型主要是負責技術理解應用為主。
3.2.3技術儲備
微服務相關技術棧和微服務周邊技術棧。周邊技術棧包括領域驅動涉及,持續交付,分布式至少,負載均衡,CAP理論,緩存原理,DevOps和容器化技術。
3.2.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和微服務有千絲萬縷的關系,這里簡單羅列雙方的對比圖,算是一個小知識點:
兩種架構背后的意圖是不同的:SOA嘗試將應用集成,一般采用中央管理模式來確保各應用能夠交互運作。微服務嘗試部署新功能,快速有效地擴展開發團隊。它着重於分散管理、代碼再利用與自動化執行。
五、總結
最后讓我們回顧一下前人經典的話語:
- 分布式第一定律是“盡量不要使用分布式”。
- 軟件行業從業者,尤其是那些已經不寫代碼的從業者,總會期望有銀彈,但銀彈終究是沒有的。
- 微服務依賴於“基礎設施自動化”。微服務不是“銀彈”。
還是回到我們架構設計的原則上,遵循簡單,適用,演化的原則,那么你的抉擇也許會變得沒有那么令人糾纏。
文章引用
- 從單體式架構遷移到微服務架構
- 《微服務設計》作者: [英] Sam Newman 出版社: 人民郵電出版社
- 4 Challenges You Need to Address with Microservices Adoption
- 為什么使用微服務?