最近幾年微服務很火,你們都在建設微服務,若是不懂點微服務相關的技術,都很差意思跟同行打招呼了,也見過身邊不少人在微服務踩過不少坑,我從 16 年開始接觸微服務,有多家大型企業的微服務分佈式系統的架構經驗,因此就打算跟你們作一期關於微服務的分享,不過微服務和涉及的分佈式計算很是的複雜,絕非是一篇文章就能夠講清楚的,本文只是從最簡單的概念的基本使用帶你入門,若是後續還有興趣的話,能夠查閱相關的文獻和技術書籍去深刻學習git
本文的微服務分享如下三部分,整體大綱以下:github
簡單舉例:看軍事新聞的同窗應該都知道,一艘航空母艦做戰能力雖然很強,可是弱點太明顯,就是防護能力太差,單艘的航空母艦不多單獨行動,一般航空母艦戰鬥羣纔是主要軍事力量,你能夠把單艘航母理解爲的單體應用(防護差,機動性很差),把航母戰鬥羣(調度複雜,維護費用高)理解爲微服務。spring
簡單講特徵就是:數據庫
單體做戰的應用(圖)編程
微服務戰鬥羣(圖)api
大部分的開發者經歷和開發過單體應用,不管是傳統的 SSM,仍是如今的 SpringBoot/Rails,它們都是單體應用,那麼長期陪伴咱們的單體應用有什麼弊端?咱們是面臨了什麼問題,致使咱們要拋棄單體應用轉向微服務架構?我的總結主要問題以下:緩存
固然還有例如沒法知足快速擴容,彈性伸縮,沒法適應雲環境特性等問題安全
但咱們不一一詳談了,以上的問題,都是微服務架構要解決的問題,至於具體是怎麼解決的,咱們先放到後面再聊服務器
歷代應用程序的架構變遷(圖)架構
咱們先看看微服務能帶給咱們什麼?微服務架構的特色:
咱們知道一個樸素的理念,沒有任何事物是完美的,任何東西都有兩面性,有得必有失
那麼在選擇微服務在解決了快速響應和彈性伸縮的問題同時,它又給咱們帶來了什麼問題?我的總結以下:
系統應用由原來的單體變成幾十到幾百個不一樣的工程,會所產生例如包括服務間的依賴,服務如何拆封,內部接口規範,數據傳遞等等問題,尤爲是服務拆分,須要團隊熟悉業務流程,懂得取捨,要保證拆分的粒度服務既符合「高內聚,低耦合」的基本原則,還要兼顧業務的發展以及公司的願景,要還要說服團隊成員爲之努力,而且積極投入,在多方中間取得平衡。
對於分佈式系統,部署,測試和監控都須要大量的中間件來支撐,並且中間件自己也要維護,原先單體應用很簡單的事務問題 ,轉到分佈式環境就變得很複雜,分佈式事務是採用簡單的重試+補償機制,仍是採用二階段提交協議等強一致性方法來解決,就要取決對業務場景的熟悉加上反覆的權衡了,相同問題還包括對 CAP 模型的權衡,總之微服務對團隊總體的技術棧水平總體要求更高
古人云:兵馬未動,糧草先行。建設微服務是須要創建長遠規劃,不是像寫 CMS 那樣建好數據庫表,而後就開始幹活,這樣十有八九是會失敗的。咱們要進行微服務改造前,架構師要提早作好規劃,咱們把這裏分爲三步,前期階段,設計階段,技術階段
前期階段,大體要作好以下事情:
設計階段,參考 Sam Newman 的著做《微服務設計》,單微服務必需要知足如下的條件,才符合微服務的基本要求:
龐大的分佈式系統,須要強大基礎設施來支撐,微服務涉及哪些基礎設施?
說了那麼多,那什麼樣的狀況下,你的團隊不適合建設微服務?(請勿對號入座)
微服務設計實際上是很早就有的設計思想,由於隨着虛擬化技術的崛起,微服務能夠低成本的實現,因此也開始流行和興起。
微服務的內涵很深,其中就包括,自動化,去中心化,獨立性等等,其中細節沒法用一篇文章概述清楚,咱們在作技術選型或者方案的時候,儘量多去了解技術的自己和起源再結合咱們業務的特色,進行更好的選擇。
Spring Cloud 爲何是國內最流行的微服務框架,它提供哪些開箱即用的組件 ?概覽以下:
建議參考資料:微服務架構集成,雲計算最佳實踐
SpringBoot是構建微服務的理想框架,主要得益於 SpringBoot 能夠打包成爲單個可執行JAR文件交付服務,Spring Actuator 公開服務健康信息都是微服務的基石,爲甚麼這麼說 ?
咱們先看看構建微服務的 4 個重要原則
微服務有優勢和缺點,並不是全部應用都適合用微服務架構,架構師須要能作到如下要求:
糟糕的微服務有哪些特徵?
什麼時候不該該使用微服務 ?
Spring Config 是 Spring 提供的配置中心輕量級實現,基於 Git 存儲,
國內用戶大多推薦使用 Alibaba 開源的 Nacos (集成配置中心和註冊中心)都是很是不錯的配置中心的實現
微服務程序對於配置中心的幾點管理原則:
Spring Config 這款配置中心提供的核心功能:
服務發現是微服務架構中很是重要的概念,也稱註冊中心,相似咱們生活中的房地產中介的角色,買房賣房都要經過它,因此是全部微服務上線/下線的必經之路,也掌握微服務的生殺大權,註冊中心會根據 CAP 策略和對微服務的健康檢查,做出對具體服務剔除,下線,恢復上線等操做,主要還有如下幾個核心功能:
微服務架構裏面要實現註冊中心,須要達到哪些基本要求?
Spring Eureka 提供的服務發現實現,具有哪些特色 ?
熔斷的概念很是好理解,好比當咱們家裏的消耗電量負載過高,到達設定的閾值的時候,電路系統就會啓動熔斷機制,也叫過載保護,經過跳閘,強行斷電的方式,來保護總體電路的穩定,熔斷在微服務中的概念也是同樣,是保護是微服務穩定的防火牆,避免單個服務潰崩或者異常致使出現整個集羣系統的雪崩和連鎖反應現場
爲何微服務進行熔斷 ?當一個服務出現問題:
爲何熔斷很重要 ?
斷路器提供的關鍵能力
Netflix 研發和出品的 Hystrix 實現是一款成熟穩定的熔斷實現,在 Netflix 在生產實踐和運行多年,很是可靠,後面加入 Spring Cloud 體系,成爲 Spring Cloud 微服務生態鏈的一員,使用起來也很是的簡單和方便
Hystrix 支持 4 種斷路模式:
跳閘會致使的3種結果:
熔斷的幾個處理原則:
網關是整個微服務分佈式集羣的入口,對於用戶來講,用戶無需知道你每一個服務的地址,只須要記住網關地址就能夠了,這樣理解可能比較抽象,舉一個生活的例子,微服務集羣是一個大型公司,公司內部有不少個不一樣的職能部門(對應每一個微服務),可是你若是要訪問具體的職能部門,你必須先到前臺登記,再由前臺帶你到你想訪問的具體職能部門去辦理實際的業務(智能路由)
微服務對於網關實現的規範:
網關一般要作哪些事情:
Zuul 網關的具體運行參考圖:
Spring Cloud Zuul 是初期版本的 API 網關實現,提供如下功能:
Oauth 2 是用於保證請求的合法和正確性,爲了讓微服務自己更加專一於業務,因此 OAuth 2 相似配置中心被單獨抽離出來做爲基礎組件的統一認證中心來使用,OAuth 2 的做用相似咱們生活中的公安局的角色,當咱們須要去正規機構辦理業務的時候,咱們須要提供有效的身份證(合法的身份認證標示),若是沒有你就須要去公安局(OAuth)申請一張在有效期內的身份證(Token),而後帶着這張身份證咱們才能去購買機票,酒店等其餘社會服務(微服務),社會服務機構在拿到你提供的身份證(Token)後,也會向公安局(OAuth)聯網發送信息,來驗證你的身份證的合法性(Token 合法性校驗),身份認證不經過就會被拒絕服務,合法的身份才能進行業務的辦理,關於 OAuth 的工做流程,能夠結合下圖來理解:
微服務對於 OAuth2 規範的4中類型受權:密碼/客戶端憑據/受權碼/隱式
Spring Cloud OAuth 2 爲咱們提供哪些便利?
OAuth 2:/auth/oauth/token的返回信息
OAuth 2 支持 JWT (JSON Web Token)的規範,關於 JWT 的原理就不特別解釋了,簡單的 JWT 有如下幾個特色
OAuth 2 的簡單總結:
咱們和世界的互動不是同步的,不少時候是基於消息異步驅動模型,好比郵件,點餐,訂票等等,想要了解 Spring Cloud Stream,必須先要理解基於事件(MQ)編程的模型,基於消息驅動有利於開發構建高度解耦的系統,由於 Spring Cloud Stream 並非本身實現了消息中間件,而是對於市場上主流(例如 RabbitMQ,KafKa)的 MQ 產品作了一層封裝和抽象,Spring Cloud Stream 作的事情並非什麼新鮮的事情,很是相似 ORM 所作的事情,瞭解 ORM 框架的同窗應該都熟悉對於多種數據庫(MySQL,Oracle,SQL Server)產品的抽象是何等重要,面向 ORM 進行數據庫訪問,可讓你脫離對於指定數據庫產品的深度依賴和綁定,並且能夠不用特地去學習不一樣數據庫的本地化特性和方言,下降學習成本,假如你想從 Oracle 遷移到 MySQL 上面,幾乎是不須要改動一行代碼,只須要改動 ORM 的配置就能夠實現了,參考下圖簡單瞭解一下 ORM:
Spring Cloud Stream 相似 ORM,你只須要基於 Spring Cloud Stream 提供的消息模型進行編程,至於底層的消息組件是用的 RabbitMQ 仍是 kafka 仍是其餘的消息中間件產品,都沒有關係,甚至更換底層消息組件也不會對你的應用產生任何影響,這就是標準化所帶來的收益,關於如何更好的理解 Spring Cloud Stream 工做模型能夠簡單參考下圖:
微服務中使用的的兩種服務通訊方式對比:
同步:經過REST端點接口進行請求:服務之間緊耦合(強依賴),服務之間的脆弱性(連鎖效應),增長新的消費者不靈活
異步:基於消息中間件通訊:鬆耦合(無接口直接調用的依賴),耐久性(服務重啓後能夠消費歷史消息),可伸縮性(消息過多可啓動多服務來處理消息),靈活性(輕鬆添加新的消費者)
消息傳遞架構的缺點:
消息中放置什麼數據 ?
Spring Cloud Stream 的消息模型和概念:
Spring Cloud Stream 的簡單總結:
微服務分佈式架構帶來了複雜度,成本最高的就是跟蹤檢查和運維,分佈式意味要在多個服務,機器跟蹤一個事務,Sleuth 和 Zipkin 都是用於 Spring Cloud 服務體系的分佈式跟蹤技術,先直接看下最終效果,下圖一個簡單的可視化鏈路跟蹤調用,ZipKin 能夠清晰的看到一個客戶端請求在每一個服務上面處理所消耗的事情,點擊進去能夠看到具體的事務執行內容,方便排查錯誤
Spring Cloud Sleuth 的工做流程:
Open Zipkin 的簡單概述:
關於微服務全鏈路跟蹤的總結:
構建和部署管道是微服務架構重最要的部分,微服務的主要特色是快速構建,修改,發佈
符合微服務特徵的部署要達到如下幾個要求:
這是一個真實用於國內某大型企業的微服務架構體系,支撐日均百萬訂單的項目,由於已通過了2年的保密期,因此能夠拿出來分享
恰好能夠結合前面凌亂的知識點,看看 Spring Cloud 這套組件是如何搭建起來的,整套微服務就是下面這張架構圖:
具體每一個組件的做用就不在這裏詳細說明了,在這套架構方案裏面
咱們沒有徹底照搬 Spring Cloud 全家桶的組建,仍是根據本身的需求對其中組件進行的更換例如:
PS:另外在值得補充的是,在寫這篇文章的時候 Spring Cloud Zuul 已經不被官方推薦使用了,替代品是性能更好的 Spring Cloud Gateway ,你們能夠在瞭解的時候須要注意一下
最後總結:
微服務是將來大型企業的必經之路,雖然成本很高,可是能夠提高 IT 系統的健壯性和提高技術人員的廣度和深度都仍是頗有幫助的