1 微服務介紹
1.1 系統架構演變
隨着互聯網的發展,網站應用的規模也在不新的擴大,進而導致系統架構也在不斷的進行變化。從互聯網早起到現在,系統架構大體經歷了下面幾個過程:單體應用架構→垂直應用架構→分布式架構→SOA架構→微服務架構,當然還有悄然興起的Service Mesh(服務網格化)。接下來我們就來了解一下每種系統架構是什么樣子的,以及各有什么優缺點。
1.1.1單體應用架構
互聯網早期,一般的網站應用流量較小,只需一個應用,將所有功能代碼都部署在一起就可以,這樣可以減少開發、部署和維護的成本。
比如說一個電商系統,里面會包含很多用戶管理,商品管理,訂單管理,物流管理等等很多模塊,我們會把它們做成一個web項目,然后部署到一台tomcat服務器上。

優點:
- 項目架構簡單,小型項目的話, 開發成本低
- 項目部署在一個節點上, 維護方便
缺點:
- 全部功能集成在一個工程中,對於大型項目來講不易開發和維護
- 項目模塊之間緊密耦合,單點容錯率低
- 無法針對不同模塊進行針對性優化和水平擴展
1.1.2垂直應用架構
隨着訪問量的逐漸增大,單一應用只能依靠增加節點來應對,但是這時候會發現並不是所有的模塊都會有比較大的訪問量。
還是以上面的電商為例子, 用戶訪問量的增加可能影響的只是用戶和訂單模塊, 但是對消息模塊的影響就比較小。那么此時我們希望只多增加幾個訂單模塊, 而不增加消息模塊。此時單體應用就做不到了, 垂直應用就應運而生了。
所謂的垂直應用架構,就是將原來的一個應用拆成互不相干的幾個應用,以提升效率。比如我們可以將上面電商的單體應用拆分成:
- 電商系統(用戶管理 商品管理 訂單管理)
- 后台系統(用戶管理 訂單管理 客戶管理)
- CMS系統(廣告管理 營銷管理)
這樣拆分完畢之后,一旦用戶訪問量變大,只需要增加電商系統的節點就可以了,而無需增加后台和CMS的節點。

1.1.3 分布式架構
當垂直應用越來越多,重復的業務代碼就會越來越多。這時候,我們就思考可不可以將重復的代碼抽取出來,做成統一的業務層作為獨立的服務,然后由前端控制層調用不同的業務層服務呢?這就產生了新的分布式系統架構。它將把工程拆分成表現層和服務層兩個部分,服務層中包含業務邏輯。表現層只需要處理和頁面的交互,業務邏輯都是調用服務層的服務來實現。

優點:
- 抽取公共的功能為服務層,提高代碼復用性
缺點:
- 系統間耦合度變高,調用關系錯綜復雜,難以維護
1.1.4 SOA架構
在分布式架構下,當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心對集群進行實時管理。此時,用於資源調度和治理中心(SOA、Service Oriented Architecture),面向服務的架構是關鍵。

優點:
- 使用注冊中心(ESB、Dubbo)解決了服務間調用關系的自動調節
缺點:
- 服務間會有依賴關系,一旦某個環節出錯會影響較大( 服務雪崩 )
- 服務關心復雜,運維、測試部署困難
1.1.5 微服務架構
微服務架構在某種程度上是面向服務的架構SOA繼續發展的下一步,它更加強調服務的"徹底拆分"。

優點:
- 服務原子化拆分,獨立打包、部署和升級,保證每個微服務清晰的任務划分,利於擴展
- 微服務之間采用Restful等輕量級http協議相互調用
缺點:
- 分布式系統開發的技術成本高(容錯、分布式事務等)
微服務架構與SOA架構的不同
微服務架構比SOA架構粒度會更加精細,讓專業的人去做專業的事情(專注),目的提高效率,每個服務於服務之間互不影響,做服務架構中,每個服務必須獨立部更加輕巧,輕量級。SOA架構中可能數據庫存儲會發生共享,做服務強調獨每個服務都是單獨數據庫,保證每個服務於服務之間互不影響。項目體現特征微服務架構比SOA架構更加適合與互聯網公司敏捷開發、快速選代版本,因為粒度非常精細。
優點:
- 服務原子化拆分,獨立打包、部署和升級,保證每個微服務清晰的任務划分,利於擴展
- 微服務之間采用Restful等輕量級http協議相互調用
缺點:
- 分布式系統開發的技術成本高(容錯、分布式事務等)
- 復雜性更高。各個微服務進行分布式獨立部署,當進行模塊調用的時候,分布式將會變得更加麻煩。
1.2 微服務架構介紹
微服務架構, 簡單的說就是將單體應用進一步拆分,拆分成更小的服務,每個服務都是一個可以獨立運行的項目。

1.2.1 微服務架構的常見問題
一旦采用微服務系統架構,就勢必會遇到這樣幾個問題:
- 這么多小服務,如何管理他們?(服務治理 注冊中心[服務注冊 發現 剔除])
- 這么多小服務,他們之間如何通訊?(restful rpc)
- 這么多小服務,客戶端怎么訪問他們?(網關)
- 這么多小服務,一旦出現問題了,應該如何自處理?(容錯)
- 這么多小服務,一旦出現問題了,應該如何排錯? (鏈路追蹤)
對於上面的問題,是任何一個微服務設計者都不能繞過去的,因此大部分的微服務產品都針對每一個問題提供了相應的組件來解決它們。

1.2.2常見微服務架構
dubbo:zookeeper+dubbo+SpringMVC/SpringBoot
配合通信方式:rpc
注冊中心:zookeeper/redis
配置中心:diamond
SpringCloud:全家桶+輕松嵌入第三方組件(Netflix)
配套通信方式:http restful
注冊中心:eruka/consul
配置中心:config
斷路器:hystrix
網關:zuul
分布式追蹤系統:sleuth+zipkin
1.3 SpringCloud Alibaba
Spring Cloud 以微服務為核心的分布式系統構建標准
2、Spring Cloud Alibaba介紹Spring Cloud Alibaba 致力於提供微服務開發的一站式解決方案,此項目包含開發微服務架構的必需組件,方便開發者通過 Spring Cloud 編程模型輕松使用這些組件來開發微服務架構。依托Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以將Spring Cloud應用按入阿里分布式應用解決方案,通過阿里中間件來迅速搭建分布式應用系統。根據Jakarta2019年的調研報告,SptingBoot擁自非常需的占比,熟冊Java語言的同學,應該對Spring都不會隨生,其但導的依載倒置,面間切面的事實標准,幾乎所有三方相限的支持。
2 Spring Cloud Alibaba環境搭建
- 基於Spring Boot的父Maven項目
- 創建2個服務(訂單服務和庫存服務)
版本關系
組件版本關系
| Spring Cloud Alibaba Version | Sentinel Version | Nacos Version | RocketMQ Version | Dubbo Version | Seata Version |
|---|---|---|---|---|---|
| 2.2.6.RELEASE | 1.8.1 | 1.4.2 | 4.4.0 | 2.7.8 | 1.3.0 |
| 2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE | 1.8.0 | 1.4.1 | 4.4.0 | 2.7.8 | 1.3.0 |
| 2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE | 1.8.0 | 1.3.3 | 4.4.0 | 2.7.8 | 1.3.0 |
| 2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE | 1.7.1 | 1.2.1 | 4.4.0 | 2.7.6 | 1.2.0 |
| 2.2.0.RELEASE | 1.7.1 | 1.1.4 | 4.4.0 | 2.7.4.1 | 1.0.0 |
| 2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE | 1.7.0 | 1.1.4 | 4.4.0 | 2.7.3 | 0.9.0 |
| 2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE | 1.6.3 | 1.1.1 | 4.4.0 | 2.7.3 | 0.7.1 |
畢業版本依賴關系(推薦使用)
| Spring Cloud Version | Spring Cloud Alibaba Version | Spring Boot Version |
|---|---|---|
| Spring Cloud 2020.0.1 | 2021.1 | 2.4.2 |
| Spring Cloud Hoxton.SR9 | 2.2.6.RELEASE | 2.3.2.RELEASE |
| Spring Cloud Greenwich.SR6 | 2.1.4.RELEASE | 2.1.13.RELEASE |
| Spring Cloud Hoxton.SR3 | 2.2.1.RELEASE | 2.2.5.RELEASE |
| Spring Cloud Hoxton.RELEASE | 2.2.0.RELEASE | 2.2.X.RELEASE |
| Spring Cloud Greenwich | 2.1.2.RELEASE | 2.1.X.RELEASE |
| Spring Cloud Finchley | 2.0.4.RELEASE(停止維護,建議升級) | 2.0.X.RELEASE |
| Spring Cloud Edgware | 1.5.1.RELEASE(停止維護,建議升級) | 1.5.X.RELEASE |
