本文將介紹微服務架構和相關的組件,介紹他們是什麼以及爲何要使用微服務架構和這些組件。本文側重於簡明地表達微服務架構的全局圖景,所以不會涉及具體如何使用組件等細節。html
要理解微服務,首先要先理解不是微服務的那些。一般跟微服務相對的是單體應用,即將全部功能都打包成在一個獨立單元的應用程序。從單體應用到微服務並非一蹴而就的,這是一個逐漸演變的過程。本文將以一個網上超市應用爲例來講明這一過程。前端
幾年前,小明和小皮一塊兒創業作網上超市。小明負責程序開發,小皮負責其餘事宜。當時互聯網還不發達,網上超市仍是藍海。只要功能實現了就能隨便賺錢。因此他們的需求很簡單,只須要一個網站掛在公網,用戶可以在這個網站上瀏覽商品、購買商品;另外還需一個管理後臺,能夠管理商品、用戶、以及訂單數據。程序員
咱們整理一下功能清單:面試
因爲需求簡單,小明左手右手一個慢動做,網站就作好了。管理後臺出於安全考慮,不和網站作在一塊兒,小明右手左手慢動做重播,管理網站也作好了。整體架構圖以下:算法
小明揮一揮手,找了家雲服務部署上去,網站就上線了。上線後好評如潮,深受各種肥宅喜好。小明小皮美滋滋地開始躺着收錢。數據庫
好景不長,沒過幾天,各種網上超市緊跟着拔地而起,對小明小皮形成了強烈的衝擊。小程序
在競爭的壓力下,小明小皮決定開展一些營銷手段:微信小程序
這些活動都須要程序開發的支持。小明拉了同窗小紅加入團隊。小紅負責數據分析以及移動端相關開發。小明負責促銷活動相關功能的開發。緩存
由於開發任務比較緊迫,小明小紅沒有好好規劃整個系統的架構,隨便拍了拍腦殼,決定把促銷管理和數據分析放在管理後臺裏,微信和移動端 APP 另外搭建。通宵了幾天後,新功能和新應用基本完工。這時架構圖以下:安全
這一階段存在不少不合理的地方:
儘管有着諸多問題,但也不可否認這一階段的成果:快速地根據業務變化建設了系統。不過緊迫且繁重的任務容易令人陷入局部、短淺的思惟方式,從而作出妥協式的決策。在這種架構中,每一個人都只關注在本身的一畝三分地,缺少全局的、長遠的設計。久而久之,系統建設將會愈來愈困難,甚至陷入不斷推翻、重建的循環。
幸虧小明和小紅是有追求有理想的好青年。意識到問題後,小明和小紅從瑣碎的業務需求中騰出了一部分精力,開始梳理總體架構,針對問題準備着手改造。
要作改造,首先你須要有足夠的精力和資源。若是你的需求方(業務人員、項目經理、上司等)很強勢地一心追求需求進度,以至於你沒法挪出額外的精力和資源的話,那麼你可能沒法作任何事……
各個應用後臺只需從這些服務獲取所需的數據,從而刪去了大量冗餘的代碼,就剩個輕薄的控制層和前端。這一階段的架構以下:
這個階段只是將服務分開了,數據庫依然是共用的,因此一些煙囪式系統的缺點仍然存在:
若是一直保持共用數據庫的模式,則整個架構會愈來愈僵化,失去了微服務架構的意義。所以小明和小紅一氣呵成,把數據庫也拆分了。全部持久化層相互隔離,由各個服務本身負責。另外,爲了提升系統的實時性,加入了消息隊列機制。架構以下:
徹底拆分後各個服務能夠採用異構的技術。好比數據分析服務可使用數據倉庫做爲持久化層,以便於高效地作一些統計計算;商品服務和促銷服務訪問頻率比較大,所以加入了緩存機制等。
還有一種抽象出公共邏輯的方法是把這些公共邏輯作成公共的框架庫。這種方法能夠減小服務調用的性能損耗。可是這種方法的管理成本很是高昂,很難保證全部應用版本的一致性。
數據庫拆分也有一些問題和挑戰:好比說跨庫級聯的需求,經過服務查詢數據顆粒度的粗細問題等。可是這些問題能夠經過合理的設計來解決。整體來講,數據庫拆分是一個利大於弊的。
微服務架構還有一個技術外的好處,它使整個系統的分工更加明確,責任更加清晰,每一個人專心負責爲其餘人提供更好的服務。在單體應用的時代,公共的業務功能常常沒有明確的歸屬。最後要麼各作各的,每一個人都從新實現了一遍;要麼是隨機一我的(通常是能力比較強或者比較熱心的人)作到他負責的應用裏面。在後者的狀況下,這我的在負責本身應用以外,還要額外負責給別人提供這些公共的功能——而這個功能原本是無人負責的,僅僅由於他能力較強 / 比較熱心,就莫名地背鍋(這種狀況還被美其名曰能者多勞)。結果最後你們都不肯意提供公共的功能。久而久之,團隊裏的人漸漸變得各自爲政,再也不關心全局的架構設計。
從這個角度上看,使用微服務架構同時也須要組織結構作相應的調整。因此說作微服務改造須要管理者的支持。
改造完成後,小明和小紅分清楚各自的鍋。兩人十分滿意,一切就像是麥克斯韋方程組同樣漂亮完美。
然而……
「不積跬步,無以致千里」,但願將來的你能:有夢爲馬 隨處可棲!加油,少年!
關注公衆號:「Java 知己」,天天更新Java知識哦,期待你的到來!
做者:古霜卡比
原文:http://www.javashuo.com/article/p-gptbslhj-eb.html