微服務是基於分而治之的思想演化出來的。過去傳統的一個大型而又全面的系統,隨着互聯網的發展已經很難知足市場對技術的需求,因而咱們從單獨架構發展到分佈式架構,又從分佈式架構發展到 SOA 架構,服務不斷的被拆分和分解,粒度也愈來愈小,直到微服務架構的誕生。前端
微服務架構是一種架構模式,它提倡將單一應用程序劃分紅一組小的服務,服務之間互相協調、互相配合,爲用戶提供最終價值。nginx
每一個服務運行在其獨立的進程中,服務和服務間採用輕量級的通訊機制互相溝通(一般是基於 HTTP 的 RESTful API)。每一個服務都圍繞着具體業務進行構建,而且可以被獨立地部署到生產環境、類生產環境等。另外,應儘可能避免統一的、集中式的服務管理機制,對具體的一個服務而言,應根據業務上下文,選擇合適的語言、工具對其進行構建。數據庫
微服務是真正的分佈式的、去中心化的。把全部的「思考」邏輯包括路由、消息解析等放在服務內部,去掉一個大一統的 ESB,服務間輕通訊,是比 SOA 更完全的拆分。緩存
微服務架構強調的重點是業務系統須要完全的組件化和服務化,原有的單個業務系統會拆分爲多個能夠獨立開發,設計,運行和運維的小應用,這些小應用之間經過服務完成交互和集成。安全
隨着整個業務數據被分散在各個子服務以後,也帶來了兩個最明顯的問題。服務器
從技術方案來說,咱們通常有兩種選擇來處理這些問題,第一種是在線處理數據,第二種是離線處理數據。微信
在線處理數據的方案:經過微服務提供的接口來獲取數據,而後進行數據整合,不過這種方式有着明顯的弊端,就是調用者須要編寫大量的代碼進行數據處理。其次在對各個微服務進行調取數據時會影響微服務的正常業務處理性能網絡
離線處理數據方案:將業務數據準實時的同步到另一個數據庫中,在同步的過程當中進行數據整合處理,以知足業務方對數據的需求,數據同步過來後,再提供另一個服務接口專業負責對外輸出數據信息,這種方案有兩個特色:①數據同步方案是關鍵,技術選型有不少,如何選擇切合公司業務的技術方案;②離線數據處理對微服務正常業務處理沒有影響。架構
推薦使用第二種,利用 Spring Boot 和 MongoDB 能夠輕鬆的解決這個問題,經過技術手段將分裂到 N 個微服務的數據同步到 MongoDB 集羣中,在同步的過程當中進行數據清洗,來知足公司的各項業務需求併發
在微服務架構中,有 大難題,那就是 服務故障的傳播性
、 服務的劃分
和 分佈式事務
。
Consistency :指數據的強一致性。若是寫入某個數據成功,以後讀取,讀到的都是新 寫入的數據:若是寫入失敗,以後讀取的都不是寫入失敗的數據。
Availability :指服務的可用性
Partition-tolerance :指分區容錯
在分佈式系統中 P是基本要求,而單體服務是 CA 系統, 微服務系統一般是 AP 系統,即同時知足了可用性和分區容錯。
這就有了 個難題:在分佈式系統中如何保證數據的一致性?這就是你們常常討論的 分佈式事務
在微服務架構中,分佈式事務 般的解決辦法就是 兩階段提交 或者 三階段 提交,無論使用哪都存在事務失敗,致使數據不 致的狀況,關鍵時刻還得人工去恢復數據。
兩階段提交,將事務分紅兩部分可以大大提升分佈式事務成功的機率。若是在第 階段都成功了,而執行第 階段的某 個節點失敗,仍然致使數據的不許確,這時通常須要人工去處 理,這就是當初在第一步記錄日誌的緣由。另外,若是分佈式事務涉及的節點不少,某 個節 點的網絡出現異常會致使整個事務處於阻塞狀態,大大下降數據庫的性能。 因此通常狀況下, 儘可能少用分佈式事務。
橫向拆分:按照不一樣的業務域進行拆分,例如訂單、營銷、風控、積分資源等。造成獨立的業務領域微服務集羣。
縱向拆分:把一個業務功能裏的不一樣模塊或者組件進行拆分。例如把公共組件拆分紅獨立的原子服務,下沉到底層,造成相對獨立的原子服務層。這樣一縱一橫,就能夠實現業務的服務化拆分。
要作好微服務的分層:梳理和抽取核心應用、公共應用,做爲獨立的服務下沉到核心和公共能力層,逐漸造成穩定的服務中心,使前端應用能更快速的響應多變的市場需求
總之,微服務的設計必定要 漸進式 的,總的原則是 服務內部高內聚,服務之間低耦合。
隨着服務拆分後,咱們遇到最大的問題就是後臺管理的聯合查詢,每一個微服務都有本身獨立的數據庫,那麼後臺該怎麼處理?
這裏通常有以下幾種方式:
三種方案在不一樣的公司我都使用過,第一種方案適合業務較爲簡單的小公司;第二種方案,適合在原有系統之上,慢慢演化爲微服務架構的公司;第三種適合大型高併發的互聯網公司。
爲了解決分佈式系統的雪崩效應,分佈式系統引進了 熔斷器機制 。
當一個服務的處理用戶請求的失敗次數在必定時間內小於設定的閥值時,熔斷器出於關閉狀態,服務正常。
當服務處理用戶請求失敗次數在必定時間內大於設定的閥值時,說明服務出現故障,打開熔斷器,這是全部的請求會快速失敗,不執行業務邏輯
當處於打開狀態的熔斷器時,一段時間後出於半打開狀態,並執行必定數量的請求,剩餘的請求會執行快速失敗,若執行請求失敗了,則繼續打開熔斷器,若成功了,則將熔斷器關閉
熔斷器不只能防止系統的「雪崩」效應,還具備如下做用
在微服務系統中,API 接口資源一般是有服務網關(也稱API網關)統一暴露,內部服務不直接對外提供API資源的暴露。好處在於隱藏內部服務,保護系統安全
網關層一般以集羣的形式存在。並在服務網關層前一般會加上Nginx 用來負載均衡
網關意義:
固然,網關實現這些功能,須要作高可用,不然網關極可能成功架構的瓶頸,最經常使用的網關組件Zuul、Nginx
在微服務架構中,須要有統一管理配置文件的組件,例如:SpringCloud Config組件、阿里的Diamond、百度的Disconf、攜程的Apollo等
在微服務架構中,必須實現分佈式鏈路追蹤,去跟進一個請求到底有哪些服務參與、參與順序,是每一個請求鏈路清晰可見,便於問題快速定位
經常使用鏈路追蹤組件有Google的Dapper、Twitter 的Zipkin,以及阿里Eagleeye(鷹眼)
市面經常使用微服務框架有:Spring Cloud 、Dubbo 、kubernetes
以上4個組件來自於Netflix 公司,統稱爲Spring Cloud Netflix
一個簡單的Spring Cloud 構建的微服務系統,一般由服務註冊中心Eureka、網關Zuul、配置中心Config和受權服務Auth構成
Spring Cloud Netflix功能:
感謝你們的閱讀,若有錯誤之處歡迎指正!
想要閱讀更多精彩內容,能夠關注個人微信公衆號:Java技術zhai,這是個人私人公衆號,專一於Java技術分享,期待你的參與。