以前介紹了何時進行服務化,以及服務化拆分的兩種方式即橫向拆分和縱向拆分,還提到了引入微服務架構須要解決的問題。網絡
這篇文章將進行介紹微服務架構的各個組成部分。數據結構
下圖是微服務架構的模塊圖,在具體介紹以前先來看下一次正常的服務調用的流程。架構
首先服務提供者(就是提供服務的一方)按照必定格式的服務描述,向註冊中心註冊服務,聲明本身可以提供哪些服務以及服務的地址是什麼,完成服務發佈。負載均衡
接下來服務消費者(就是調用服務的一方)請求註冊中心,查詢所須要調用服務的地址,而後以約定的通訊協議向服務提供者發起請求,獲得請求結果後再按照約定的協議解析結果。框架
並且在服務的調用過程當中,服務的請求耗時、調用量以及成功率等指標都會被記錄下來用做監控,調用通過的鏈路信息會被記錄下來,用於故障定位和問題追蹤。在這期間,若是調用失敗,能夠經過重試等服務治理手段來保證成功率。異步
總結一下,微服務架構下,服務調用主要依賴下面幾個基本組件:微服務
接下來進行介紹這些組件。性能
服務調用首先解決的問題就是服務如何對外描述。服務描述主要解決對外服務的服務名是什麼,調用須要提供哪些信息,返回格式是什麼以及如何進行解析。編碼
經常使用的服務描述方式包括 RESTful API、XML 配置以及 IDL 文件三種。3d
RESTful API 方式一般用於 HTTP 協議的服務描述。RESTful API 方式的服務描述以下:
GET /sysDictoryDict/mapByUserId/{userId} POST /enterprise/enterpriseDetail/top PUT /enterprise/{enterpriseId} DELETE /enterprise/{enterpriseId}
XML 配置方式多用做 RPC 協議的服務描述,經過 *.xml 配置文件來定義接口名、參數以及返回值類型等。XML 配置方式的服務描述主要分三個步驟:
IDL 文件方式一般用做 Thrift 和 gRPC 這類跨語言服務調用框架中,好比 gRPC 就是經過 Protobuf 文件來定義服務的接口名、參數以及返回值的數據結構。
服務描述方式 | 使用場景 | 缺點 |
---|---|---|
RESTful API | 跨語言平臺,組織內外都適用 | 相比 TCP,HTTP 做爲通訊協議性能較差 |
XML 配置 | Java 平臺,通常用於組織內部 | 不支持跨語言平臺 |
IDL 文件 | 跨語言平臺,組織內外都適用 | 修改/刪除 PB 字段不能向前兼容 |
接下來要解決的問題就是服務的發佈和訂閱,也就是說你提供一個服務,如何讓外部想調用這個服務的人知道。就須要註冊中心出場了,服務提供者將本身提供的服務以及地址登記到註冊中心,服務消費者則從註冊中心查詢所須要調用的服務的地址,而後發起請求。
在整個微服務架構中,註冊中心是最基礎的核心服務之一,它記錄着服務和服務地址的映射關係,爲服務提供方提供註冊、註銷功能,爲服務消費方提供服務發現的功能。
註冊中心通常的工做流程是:
常見的註冊中心有 Netflix 的 Eureka、HashiCorp 的 Consul、雅虎的 Zookeeper、阿里的 Nacos 等。
經過註冊中心,服務消費者就能夠獲取到服務提供者的地址,有了地址後就能夠發起調用。但在發起調用以前你還須要解決如下幾個問題。
這三部分就組成了一個完成的 RPC 調用框架,通訊框架提供了基礎的通訊能力,通訊協議描述了通訊契約,而序列化和反序列化則用於數據的編/解碼。一個通訊框架能夠適配多種通訊協議,也能夠採用多種序列化和反序列化的格式。
能夠正常發起服務調用後,就須要對調用狀況進行監控,以瞭解服務是否正常。一般來說,服務監控主要包括三個流程。
記錄服務調用通過的每一層鏈路,以便進行問題追蹤和故障定位。
服務追蹤的工做原理大體以下:
以此類推,經過這種層層往下傳遞的方式,一次請求,不管最後依賴多少次服務調用、通過多少服務節點,均可以經過最開始生成的 requestid 串聯全部節點,從而達到服務追蹤的目的。
經常使用的服務追蹤有 Twitter 的 Zipkin、華爲的 skywalking、Uber 的 jaeger、大衆點評的 CAT等。
服務治理就是保證在各類意外狀況下,服務調用仍然可以正常進行。
在生產環境中,常常會遇到下面幾種狀況:
還有其餘服務治理的手段好比自動擴縮容、負載均衡、服務路由以及服務容錯等。
主要對微服務架構中的組件進行了介紹,微服務架構主要由服務描述、註冊中心、服務框架、服務監控、服務追蹤以及服務治理等組成。
參考