微服務最全詳解 -萬字圖文總結-

大家好,我是 mikechen。

微服務是大型網站的必經之路,也是進階架構的必備節能,而且大廠也特別喜歡考察微服務,下面我就全面來詳解微服務 @mikechen

最新 mikechen 原創超 30 萬字《阿里架構師進階專題合集》和《最全大廠 Java 面試題答案合集》,請關注本公衆號【mikechen 的架構筆記】,後臺回覆:資料,即可領取。

微服務

微服務是一種架構模式,它提倡將單一應用程序劃,分成一組小的服務,每個服務運行獨立的自己的進程中,服務之間互相協調、互相配合,爲用戶提供最終價值。

微服務架構,服務之間採用輕量級的通信機制互相溝通,每個服務都圍繞着具體業務進行構建,並且能夠被獨立地部署到生產環境。

爲什麼需要微服務?

一個系統業務量很小的時候,大部分 Web 工程的 Java 應用程序,打包爲 War 包部署在一臺服務器上。

比如:你正在構建一個在線商店系統,包含功能:用戶、商品、下訂單等功能,整體架構如下圖所示:

這種將所有功能,都部署在一個 web 容器中運行的系統,就叫做單體架構,也叫巨石型應用。

單體應用的優點在於:單一架構模式在項目初期很小的時候開發方便,測試方便,部署方便,運行良好。

但是,對於大規模的複雜應用,單體架構應用會顯得特別笨重,比如:

爲了解決這些問題,就出現了微服務架構。

微服務架構

隨着業務訪問量越來越大,單體應用就會出現巨大的瓶頸,隨意後期就會出現,按照業務爲單位進行拆分,出現的微服務架構。

1. 微服務優點

2. 微服務缺點

微服務特點

根據微服務 Microservices 之父馬丁. 福勒的描述,我總結了以下幾點。

1. 獨立業務模型

微服務架構中的每個服務,都是具有業務邏輯的,符合高內聚、低耦合原則以及單一職責原則的單元,不同的服務通過 “管道” 的方式靈活組合,從而構建出龐大的系統。

2. 輕量級通信

服務之間通過輕量級的通信機制實現互通互聯,而所謂的輕量級,通常指語言無關、平臺無關的交互方式。

目前大家熟悉的 REST 是實現服務間互相協作的輕量級通信機制之一,使用輕量級通信機制,可以讓團隊選擇更適合的語言、工具或者平臺來開發服務本身。

3. 獨立部署

不止業務要獨立,部署也要獨立。不過這也意味着,傳統的開發流程會出現一定程度的改變,開發的也要有一定的運維職責。

在微服務架構中,每個服務都是獨立的業務單元,與其他服務高度解耦,只需要改變當前服務本身,就可以完成獨立的開發、測試和部署。

4. 獨立進程

每一組服務都是獨立運行的,可能我這個服務運行在 Tomcat 容器,而另一個服務運行在 Jetty 上,可以通過進程方式,不斷的橫向擴展整個服務。

5. 不集中式管理

微服務架構,可以讓團隊各思其政的選擇技術實現,不同的 Service 可以根據各自的需要選擇不同的技術棧來實現其業務邏輯。

微服務框架

目前國內企業使用的微服務框架:主要是 Spring Cloud 和 Spring Cloud Alibaba。

最爲典型的就是 Spring Cloud 微服務框架 ,Spring Cloud 是一套完整的微服務解決方案,它將市面上較好的微服務框架集成進來,從而簡化了開發者的代碼量。

Spring Cloud

Spring Cloud 體系包含如下:

1.Eureka 註冊中心

拆分成多個服務之後,需要管理多個服務,Eureka 作爲 Spring Cloud 框架的註冊中心,起到服務註冊和服務發現的作用。

上圖簡要描述了 Eureka 的基本架構,由 3 個角色組成:

1)Service Provider: 暴露服務的服務提供方;

**2)Service Consumer:**調用遠程服務的服務消費方;

3)EureKa Server: 服務註冊中心和服務發現中心;

2.Zuul 服務網關

Zuul 是 Spring Cloud 子項目的核心組件之一,可以作爲微服務架構中的 API 網關使用,支持動態路由與過濾功能。

Zuul 就是微服務網關的一種實現,Zuul 作用:類似我們小區的保安,用於保護基本的安全等的作用。

Zuul 本質上是一個 Web servlet 應用,爲微服務架構中的服務提供了統一的訪問入口,客戶端通過 API 網關訪問相關服務。

3.Hystrix 斷路器

Hystrix 的主要作用就是:提供服務隔離、熔斷、降級機制。

4.Ribbon 負載均衡

Ribbon 主要作用是提供客戶端的軟件負載均衡算法,將 Netflix 的中間層服務連接在一起。

當多個服務提供者時,Ribbon 可以根據負載均衡的算法,比如:如簡單輪詢、隨機連接等,自動地選擇需要調用的服務地址。

5.Feign 遠程調用方式

Feign 是 Spring Cloud 組件中的一個輕量級 Restful 的 HTTP 服務客戶端,通過 接口 + 註解的方式發起 HTTP 請求調用。

Feign 主要是幫助我們方便進行 Rest API 服務間的調用,Feign 最大的作用就是減少 HTTP 遠程調用的複雜性。

Feign 實現了像調用本地方法一樣調用遠程方法,無感知遠程 HTTP 請求,類似於 Dubbo Consumer 直接調用 Provider 的接口方法。

Spring Cloud Alibaba

Spring Cloud Alibaba 是阿里研發的一套微服務架構的落地技術方案,可以很好的兼容 SpringCloud,可以簡要理解爲 Spring Cloud 的升級版。

Spring Cloud Alibaba 體系包含如下圖所示:

**1.Sentinel 流量控制 **

Sentinel 是面向分佈式服務架構的流量控制組件,主要以流量爲切入點,從流量控制、熔斷降級、系統自適應保護等多個維度來幫助您保障微服務的穩定性。

Sentinel 的核心功能,如下圖所示:

2.Nacos 服務配置

Nacos 是 SpringCloudAlibaba 架構中最重要的組件,Nacos 主要解決服務發現、配置和管理微服務。

3.RocketMQ 消息中間件

RocketMQ 是一個純 java、分佈式、隊列模型的開源消息中間件。

4.Dubbo 遠程通信

Dubbo 是一款 Java RPC 框架,致力於提供高性能的 RPC 遠程服務調用方案。

Dubbo 角色,主要包含如下幾個核心組件:

1) 註冊中心(registry)

生產者在此註冊併發布內容,消費者在此訂閱並接收發布的內容。

2) 消費者(consumer)

客戶端,從註冊中心獲取到方法,可以調用生產者中的方法。

3) 生產者(provider)

服務端,生產內容,生產前需要依賴容器(先啓動容器)。

4) 容器(container)

生產者在啓動執行的時候,必須依賴容器才能正常啓動(默認依賴的是 spring 容器),

5) 監控 (Monitor)

統計服務的調用次數與時間等。

5.Seata 分佈式事務

Seata 是一款阿里開源的分佈式事務解決方案,Seata 致力於在微服務架構下提供高性能和簡單易用的分佈式事務服務。

Seata 事務管理中有三個重要的組件角色,如下圖所示:

三個組件相互協作,TC 以 Server 形式獨立部署,TM 和 RM 集成在應用中啓動。

1.TC (Transaction Coordinator) 事務協調者

TC:維護全局和分支事務的狀態,協調全局事務提交或回滾。

2.TM (Transaction Manager) 事務管理器

TM:定義全局事務的範圍、開始全局事務、提交或回滾全局事務。

3.RM (Resource Manager) - 資源管理器

RM:管理分支事務處理的資源,與 TC 交談以註冊分支事務和報告分支事務的狀態,並驅動分支事務提交或回滾。

下一代微服務框架

目前下一代微服務架構就是 Service Mesh,Service Mesh 主流框架有 Linkerd 和 Istio,其中 Istio 有大廠加持所以呼聲更高。

微服務的應用場景

微服務也不是一招鮮喫遍天,不是能夠解決所有問題的萬金油,它有其特定的適用場景。

那麼哪些場景適合使用微服務架構呢?滿足以下三個條件即可考慮:

比如: 電商類的、微博類的、微信類、社交類的、支付類的、直播類的、遊戲類、互聯網類的、廣告類到處都是。

這背後反映了架構的拆分,本質上反映的是業務的一個拆分,業務的快速發展技術也一定要快速發展,技術架構快速迭代,才能去適應業務快速發展的模型,這是它的本質的特徵。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/sCdEbxCUBKBonyxyp-RF6A