微服務架構之服務架構演進

一、概述

本文闡述微服務架構演進的過程。

二、單體應用

英文稱之爲Monolithic Application,此時應用是單進程的,由該進程起EndPoint(即監聽端口)對外提供服務。

單體應用架構

優點:

  • 代碼調試簡單
  • 服務之間調用是簡單的方法調用,出錯概率低,錯誤處理簡單
  • 日誌聚合,方便排查問題。

缺點:

  • 隨着應用規模增長,無法支撐高併發量
  • 任意模塊代碼修改都要重新發布整個應用
  • 開發團隊規模大,難以管理

傳統解決方案:

  • 使用nginx等反向代理設備進行負載均衡,通過集羣的方式提供服務,解決併發訪問的問題
  • 後端數據庫服務,通過主從複製,分庫分表,或者通過數據庫中間件mycat等解決數據庫訪問壓力

三、微服務架構誕生

爲了解決單體架構存在的問題,微服務架構(micro service)誕生了。最初是Martin Fowler第一次系統性的闡述了這一架構:https://www.martinfowler.com/articles/microservices.html

簡單來說,微服務架構將單體應用,根據業務拆分爲多個獨立的微服務。微服務直接通過網絡通信的方式,相互調用,組成整個應用程序。

微服務架構

優點:

  • 微服務可橫向擴展,訪問量大的微服務實例多,訪問量少的可相對少
  • 一個微服務可以由一個小團隊管理
  • 微服務之間可以使用不同的技術棧,如java, nodejs等

缺點:

  • 引入了服務註冊發現,負載均衡、服務熔斷、服務治理等新的難題
  • 增加了業務代碼編寫的難度,現在要處理服務調用相關的問題
  • 排查問題困難,日誌分散
  • 根據技術棧的不同,微服務之間可能有很強的依賴性,如dubbo框架

在微服務架構剛開始流行的時候,大家主要通過SpringCloud、Dubbo等微服務框架實現微服務,難度較大,上手難度高。

四、容器化

隨着docker技術的流行,應用容器化成爲主流。

容器化解決的是應用部署的難題:通過把所有的環境打包到鏡像,只要當前環境部署了docker,應用就能隨時部署擴容。

並且,容器之間相互隔離,互不影響。

dcoker架構

五、Kubernetes

Kubernetes是Docker的分佈式解決方案,是一個分佈式的容器編排平臺。

docker雖然簡化了應用部署的難題,但是在服務治理方面的能力較弱,並且不是分佈式的解決方案。

通過Kubernetes,可以很容易實現應用的擴容縮容,應用監控、應用升級、服務註冊發現等功能。

其實在k8s的層面,已經實現了服務發現,負載均衡等功能了;可以發現SpringCloud、Dubbo等框架和k8s平臺存在功能重複的問題。

六、istio服務網格

Service Mesh是近兩年提出的概念,意爲微服務之間相互調用的網絡。

k8s雖然解決了服務自動擴容縮容等問題,但無法控制服務之間的網絡調用。

於是istio等服務網格平臺,通過sidecar模式,實現了在應用無感知的情況下,對服務之間網絡調用的控制。

原理如下:
istio架構
在k8s的pod中,除了service的container之外,會注入istio的sidecar container,這個sidecar會攔截所有進入pod的網絡流量(通過改寫iptable規則實現),也會攔截所有從pod發出去的流量。由於所有的網絡流量都經過sidecar,通過配置相關的規則,istio可以實現對網絡流量的控制、加密、觀測等功能。

最重要的是,這一些都是應用無感知的,也就是說,應用幾乎無需做任何改造,只需要提供相應的配置給到istio,就可以享受這些功能。

感覺上,有了istio,傳統微服務框架中,服務註冊發現、服務熔斷、限流、負載均衡等功能都沒有必要存在了。你需要做的只是簡單的發起一個http服務調用(或者是grpc等),其他的一切留給istio處理。

但目前服務網格還沒有大規模應用,並且由於引入sidecar等間接層,對服務性能也有一定的影響,服務網格的未來還不可知。

七、總結

單體架構轉化爲微服務架構,微服務架構是主流。

docker、k8s解決的是應用部署、應用狀態監控,應用擴容縮容等服務治理的問題。這些工具的出現,使得擁抱微服務架構的難度大大降低了。

istio的出現,進一步解決了微服務網格之間,網絡流量的控制、加密、觀測等問題。

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