微服務介紹及spring cloud微服務架構概述

1 單體應用架構

1.1 單體架構概述

針對web應用而言,一個應用程序中包含了應用程序的所有功能。所有的程序、配置文件、頁面、靜態資源等都打包成了一個程序(通常打包成jar包或war包),部署到Tomcat上運行。

單體應用架構圖如下所示:
單體應用架構圖

1.2 單體架構優缺點

優點:

  • 易於部署:只需要將應用打包成jar包或war包即可,直接部署單個jar包或war包到Tomcat即可。
  • 易於橫向擴展:當應用負載壓力大時,將這個應用複製幾份,分別部署在不同的服務器上,再通過負載均衡即可提高應用的併發能力。

缺點:

  • 複雜度高:由於是單個應用,所以整個項目文件包含的模塊非常多,導致模塊的邊界模糊、依賴關係不清晰、代碼的質量參差不齊,混亂的堆在一起,使得整個項目非常複雜。以致每次修改代碼,都非常小心,可能添加一個簡單的功能,或者修改一個Bug都會帶來隱藏的缺陷。
  • 技術債務:技術的變更、開發人員的更替都會形成技術債務,項目到後面會越來越難維護。
  • 阻礙技術創新:由於是單體應用,團隊開發人員必須使用統一的開發框架、統一的IDE、統一的中間件等,阻礙了開發人員的技術創新。
  • 協作難度大:一個項目往往是由團隊多人共同完成,多個人維護一套代碼,代碼合併難度較大。
  • 橫向擴展造成的資源浪費:單體應用只能橫向擴展,造成服務器資源的浪費。

2 微服務架構

2.1 微服務架構概述

針對微服務的概述,引用James Lewis 和 Martin Fowler兩位大神在2014年寫的博客裏的一段話:

In short, the microservice architectural style [1] is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.

翻譯成中文是:

微服務是一種架構風格,是以開發一組小型服務的方式來作爲一個獨立的應用系統,每個服務都運行在自已的進程中,服務之間採用輕量級的HTTP通信機制 ( 通常是採用HTTP的RESTful API)進行通信。這些服務都是圍繞具體業務進行構建的,並且可以獨立部署到生產環境上。這些服務可以用不同的編程語言編寫,並且可以使用不同的數據存儲技術。對這些微服務我們只需要使用一個非常輕量級的集中式管理來進行協調。

以上這段話可以概述爲兩點:

  • 單個服務是圍繞具體業務進行構建的,一個服務是圍繞單個具體業務展開,一個服務解決的是一個業務問題。
  • 將自己的業務能力進行封裝,並對外提供接口,各個微服務之間可以相互調用。

單體應用架構與微服務架構比較圖:
在這裏插入圖片描述

2.2 微服務架構優缺點

優點:

  • 易於開發維護:一個微服務只關心一個業務,代碼量較少,維護起來較爲容易。
  • 易於修改:在對外提供的接口不變的情況下,修改單個服務的內部代碼邏輯不會對整體業務造成影響。
  • 開發靈活:不同服務之間可以使用不同的開發語言,不同的框架,不同的數據庫。
  • 按需伸縮:根據需求,實現細粒度的擴展。針對業務的併發訪問量大小,可以單獨擴展或伸縮。
  • 單個服務啓動快速。

缺點:

  • 維護成本變高:需要維護多個服務。
  • 分佈式系統固有的問題:系統容錯、網絡延遲、分佈式事務所帶來的問題。
  • 接口調整成本高:微服務對外提供接口,如果接口改動了,調用這個接口的所有服務可能都需要改動。

3 微服務技術棧

接下來,我們以spring cloud爲例進行微服務技術棧的介紹。

3.1 服務相互調用

服務相互調用有兩種常見方式,一種是調用RESTful接口,一種是RPC。spring cloud使用的是RESTful接口,Dubbo使用的是RPC方式。

3.2 註冊中心

前面我們提到了,一個微服務只關心某一個業務。這也就說在一個系統中往往有多個微服務通過相互調用的方式分工協作。那這些微服務該怎麼去管理呢?一個微服務該如何去發現其他服務呢?最容易想到的方式是在一個服務里人爲的去配置其他服務的訪問地址,那一旦服務多了怎麼辦呢?這樣做顯然不合理。於是,註冊中心應運而生。所有的服務都可以將自己註冊到註冊中心,並可以從註冊中心獲取其他服務清單。

在這裏插入圖片描述

spring cloud使用的註冊中心爲Eureka。註冊中心的出現,解決了服務的註冊與發現問題。

3.3 負載均衡

在微服務架構中,一個微服務負責一項業務。假設業務A併發訪問量變大,大到單臺機器在短時間內處理不過來時。就需要針對業務A進行一個擴展,擴展方式是在多臺主機上都部署該業務。那麼問題來了,客戶端如何才能均衡的去調用部署在不同主機上的業務A呢?會不會出現“累的累死,閒的閒死”的情況呢?那這樣的話就沒有擴展的必要了。負載均衡的提出解決了這個問題。負載均衡既可以在客戶端來做,也可以在服務端來做(Nginx)。使用Ribbon、Feign(集成了Ribbon)可以做到客戶端負載均衡,其負載均衡的實現機制是利用服務名通過註冊中心獲取服務A的所有地址列表,然後再採用輪訓的策略(默認策略)去調用不同主機上的服務A。

在這裏插入圖片描述
爲了實現高可用性,往往在一個項目中也需要部署多臺註冊中心服務器,以防止單臺註冊中心服務器掛掉導致整個系統不可用的問題。
在這裏插入圖片描述

3.4 熔斷器

各個微服務之間相互關聯緊密,處理一個客戶端請求,可能需要調用多個微服務才能完成。這就會帶來一個問題:假設在調用某個微服務的過程中因爲網絡、服務器內部錯誤或其他原因導致服務調用失敗,那這個服務可能就會因此出現線程阻塞,將會導致響應時間過長,或不能得到響應。此時若有大量請求湧入,將可能導致容器線程資源被消耗完,導致整個服務崩潰。服務與服務之間的依賴性很可能導致故障的傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的“雪崩”效應。
爲了解決這個問題,熔斷器應運而生。spring cloud 對Hystrix熔斷器提供了良好的支持。
在這裏插入圖片描述

3.5 路由網關

整個微服務系統中有那麼多的微服務,其中可能需要對外暴漏多個微服務,供外部訪問。這些對外暴漏的微服務可能運行在不同主機上。

在這裏插入圖片描述

如果將這些微服務直接暴漏給外界將會帶來兩個問題:

  • 這些微服務的訪問地址不統一,外部客戶端調用起來不方便。
  • 暴漏了真實地址,存在安全問題。

Zuul路由網關的出現,解決了這個問題。Zuul路由網關具有以下兩個作用:

  • 路由功能負責將外部請求轉發到具體的微服務實例上,是實現外部訪問統一入口的基礎。
  • 過濾功能則負責對請求的處理過程進行干預,是實現請求校驗等功能的基礎。

Zuul路由網關的引入:

在這裏插入圖片描述

3.6 配置中心

當我們的微服務多了之後,服務的部署又帶來了問題。假設服務A部署在了100臺服務器上,服務器A需要去改變配置文件(application.yml/application.properties),如果讓運維人員一個一個的去改這100臺服務器上的配置文件,那估計運維人員都要哭了。如果有一個統一的位置,管理了所有服務的配置文件,當修改配置時,只需要在此修改便可以同步到所有服務上那該多好啊。在Spring Cloud中,有分佈式配置中心組件Spring Cloud Config來解決這個問題。

配置中心

在這裏插入圖片描述

4 Spring Cloud

Spring Cloud,基於 Spring Boot 提供了一套微服務解決方案,包括服務註冊與發現,配置中心,全鏈路監
控,服務網關,負載均衡,熔斷器等組件,除了基於NetFlix的開源組件做高度抽象封裝之外,還有一些選型
中立的開源組件。

spring cloud官網提供的架構圖

在這裏插入圖片描述
spring cloud官網提供的這張架構圖比3.6節的架構圖看起來簡單了許多,兩者所表達的含義是完全一致的。在第三節提出的所有的技術棧,都可以在spring cloud中找到。spring cloud爲開發人員提供了一套完整的、便捷開發的微服務解決方案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章