面對微服務如火如荼的發展,不少人都在瞭解,學習但願能在本身的項目中幫得上忙,當你對微服務的廬山真面目有所瞭解後,接下來就是說服本身了,到底如何評估微服務,何時使用微服務,什麼時間點最合適,須要哪些技術儲備和資源投入等等,這些都是你須要面對和解決的。html
本文從單體架構,微服務架構,微服務風險評估,微服務落地條件等幾個方面探討微服務的落地過程,但願對你有所啓發。前端
講解微服務以前,咱們先簡單瞭解下單體架構。後端
隨着業務的複雜度增長,單體的靈活度會逐漸降低,好比:瀏覽器
架構設計的三大原則告訴咱們,架構須要的是簡單、適度、演化。緩存
對於項目起步階段,單體是最高效也是最節省成本的方式。由於初期階段,因爲人力,成本,業務熟悉程度,微服務技術積累等因素,如何過分設計可能工期和複雜度會急劇上升,形成交付困難,問題百出,從而錯過了時間窗口。最合適,簡單的方式仍是單體優先,這是創業公司的特色決定的。固然設計面向微服務的單體架構也是一種聰明的方法,這遵照了系統演化的法則。服務器
不管採起何種維度的架構分層,分層的最核心目的是保證各層之間的差別足夠清晰,邊界足夠明顯,爲未來可能產生的變化提供最容易、最小化的修改。好比客戶端要從安卓替換爲IOS,底層無須任何改動,就像替換積木同樣。又好比,設備須要接入新的設備或協議,其餘層也不須要作任何變化,能夠無縫平滑接入任何設備。微信
若是前期在業務不十分清晰,求的是驗證想法,證實產品思路是否可行性,而且業務量不大,僅限於省級範圍,建議只要對當前架構稍加改良升級就能夠了,這樣改動量相對較小,且至少能支撐必定時間段的業務增加。架構
支撐的業務更加龐大,能夠支撐海量用戶高併發和海量設備接入,支持分佈式多機房,多區域部署,支持服務器無限擴容。支持私有云,公有云,混合雲等部署方式。因此微服務是大多數互聯網公司的首選。併發
微服務架構圖譜谷歌或Bing下,能夠看到各類各樣的架構圖,源於業務和架構師自身的喜愛或者粗細粒度,可是每一個架構圖的基本組件和架構分層都差異不大,只是有的細一些,有的粗一下。好比有客戶端層,容器層(K8S),API Gateway,微服務集羣層,EventBus層是必需要有的,至於服務監控和服務跟蹤、服務治理自己就是一個完整的系統,粒度就沒有細了。基於這些概念,我把架構圖稍微細化一下,這裏省去服務監控跟蹤和治理的部分,後續單獨抽離出來分析。app
這邊的架構圖譜相對以前的架構圖,更加貼近業務,粒度也更細,雖然個別組件有所省略,好比跟蹤和治理部分。
以上架構圖主要分4層,每一個層次遵循架構分層的核心思想:關注點分離,職責各異,邊界清晰。
第1層:客戶端:理論上包含一切能夠聯網的設備,包括移動設備,Android、IoS、Pad、微信、微博、QQ、Web、各自瀏覽器、物聯網設備等等……
第2層:API網關:包括服務註冊,發現,認證受權,單點登陸,熔斷,限流……網關的知識點豐富,是微服務的核心之一。
第3層:微服務集羣:包括各類具體的microservice,好比縱向劃分的業務服務(用戶服務,訂單服務,……),橫向劃分的基礎或公共服務(元數據服務,公共服務……)
其餘微服務的地址多是這樣的:
第4層:事件總線:Event Bus 目的是消息解耦,不要讓服務之間直接的連接。不一樣與SOA的服務總線,事件總線相對比較輕量,常常基於消息隊列引擎進行解耦,目的是爲了讓服務之間的關聯弱化,不直接進行關聯。不少時候用的是相對穩定、可靠、企業級的RabbitMQ。
微服務的架構其實不難,根據以上的架構,每種業務均可以進行套用,這裏的難點在於服務的劃分和粒度控制,另外如何管理膨脹的服務是一個麻煩事。
這裏引用架構師楊波(前Ebay架構師,目前任職拍拍貸研發部總監,資深技術架構師,微服務技術專家)的一些觀點:
通常狀況下,業務系統引入新技術就必然會帶來架構的複雜度提高,在具體決策前,你先要認識到新架構會帶來哪些新的問題,這些問題你和你的團隊是否可以解決?如何解決?是本身投入人力建設,仍是採用業界開源方案?假如你和我同樣都是微服務的旁觀者或者學習者,那麼下面的評估也許對你又所參考。
不一樣的落地方式決定不一樣的資源配置。
方式一:借力外部架構諮詢公司提供架構DEMO和培訓服務助推內部團隊技術轉型升級。
方式二:招聘相關經驗豐富的人員進來,自行研究和搭建架構並作內部培訓,推進團隊技術升級。
建議:若是比較緊急,採用第一種方式,由於招聘匹配的人才比較困難,等不起。可是無論是那種方式,對於團隊來講都須要必定的技術人才儲備方便後續交接和運維。
這裏分紅兩類人員,一類是研究型,一類是應用型。研究型主要是以技術攻堅爲主,負責微服務的核心組件的研究和開發,好比服務發佈和訂閱,服務跟蹤和監控,服務的治理;應用型主要是負責技術理解應用爲主。
微服務相關技術棧和微服務周邊技術棧。周邊技術棧包括領域驅動涉及,持續交付,分佈式至少,負載均衡,CAP理論,緩存原理,DevOps和容器化技術。
楊波在給微服務的開發團隊規劃時候給了一個百人左右的大概預估,至於到底須要多少開發人員就沒有細說,可能做者自己呆過的公司都是大廠,對人力成本控制沒有那麼大的包袱,對於中小企業,人力是最貴的成本。若是要必定要上微服務,該怎麼辦?
因爲是架構級別的調整,以前能保留下來的大部分是解耦比較好的代碼,好比前端代碼,採集服務代碼,部分業務邏輯代碼,因此對現有框架衝擊面比較大。
由於微服務是一種觀念和思想,又是新近技術,自己就有各類架構實現方式和技術解決方案。因此對技術人員來講,對比選型自己就是一個考驗。加上自己涉及的技術面就比較廣,因此複雜度和門檻相對比較高。
可是該技術發源於亞馬遜,通過近些年的發展,雖然還在發展,可是已經相對成熟。
微服務架構工做量主要集中在後端,對後端開發人員的技術級別有較高的要求,主要是對微服務原理和開源組件的熟悉上,同時須要具有總體的微服務的意識。暫時不具有總體微服務開發意識和經驗,須要經過培訓後進行轉型升級。
若是採用藉助外部架構力量來助推架構升級,和架構單位的合做就不是簡單的外包,涉及的面會變得比較廣,在徹底交接過來以前,週期會比較長。包括對咱們業務架構的深刻了解,而後根據業務架構繪製可靠技術架構藍圖,再根據技術藍圖進行落地實施(不建議只提供架構方案而由其餘單位實施落地),包括新系統的開發,舊系統的升級,固然這種升級是平滑過分的,對業務窗口並不會產生影響。
如何正確拆分?這裏正確指的是合理,由於沒有絕對的標準。按照前人的經驗能夠分爲縱向和橫向兩種劃分方法:
是從業務維度進行拆分。標準是按照業務的關聯程度來決定,關聯比較密切的業務適合拆分爲一個微服務,而功能相對比較獨立的業務適合單獨拆分爲一個微服務,好比上圖中的訂單服務,用戶服務。另外粒度過小,服務聚合是一個坑,粒度太大,分和沒分一個樣。
是從公共且獨立功能維度拆分。標準是按照是否有公共的被多個其餘服務調用,且依賴的資源獨立不與其餘業務耦合。好比上圖中的元數據服務和消息服務。
借用《微服務設計》中的一句話:「你越不瞭解一個領域,爲服務找到合適的界限上下文就越難……服務的界限劃分錯誤,可能會致使不得不頻繁地更改服務間的協做,而這種更改爲本更高……」
因爲SOA和微服務有千絲萬縷的關係,這裏簡單羅列雙方的對比圖,算是一個小知識點:
兩種架構背後的意圖是不一樣的:SOA嘗試將應用集成,通常採用中央管理模式來確保各應用可以交互運做。微服務嘗試部署新功能,快速有效地擴展開發團隊。它着重於分散管理、代碼再利用與自動化執行。
最後讓咱們回顧一下前人經典的話語:
仍是回到咱們架構設計的原則上,遵循簡單,適用,演化的原則,那麼你的抉擇也許會變得沒有那麼使人糾纏。