本系列為之前系列的整理重啟版,隨著專案的發展以及專案中的使用,之前系列裡面很多東西發生了變化,並且還有一些東西之前系列並沒有提到,所以重啟這個系列重新整理下,歡迎各位留言交流,謝謝!~
Spring Cloud 官方文件說了,它是一個完整的微服務體系,使用者可以通過使用 Spring Cloud 快速搭建一個自己的微服務系統。那麼 Spring Cloud 究竟是如何使用的呢?他到底有哪些元件?
spring-cloud-commons
元件裡面,就有 Spring Cloud 預設提供的所有元件功能的抽象介面,有的還有預設實現。目前的 2020.0.x (按照之前的命名規則應該是 iiford),也就是spring-cloud-commons-3.0.x
包括:
- 服務發現:
DiscoveryClient
,從註冊中心發現微服務。 - 服務註冊:
ServiceRegistry
,註冊微服務到註冊中心。 - 負載均衡:
LoadBalancerClient
,客戶端呼叫負載均衡。其中,重試策略從spring-cloud-commons-2.2.6
加入了負載均衡的抽象中。 - 斷路器:
CircuitBreaker
,負責什麼情況下將服務斷路並降級 - 呼叫 http 客戶端:內部 RPC 呼叫都是 http 呼叫
然後,一般一個完整的微服務系統還包括:
- 統一閘道器
- 配置中心
- 全鏈路監控與監控中心
Spring Cloud 一直處於非常活躍,非常快速迭代的過程,並且 Spring Cloud 高度依賴 Spring Boot,Spring Boot 與 Spring Cloud 相輔相成。但是,快速迭代帶來的不只是新功能的引入以及原有功能的優化,還有就是升級過程中帶來了很多相容性,功能性,完整性,穩定性的煩惱。本系列旨在幫助廣大讀者瞭解不同大版本 Spring Boot & Spring Cloud 的特性功能以及底層原理的同時,使用這些元件實現一個具有完整功能的微服務體系,同時這個體系會適應目前最新的雲原生環境。
我們使用的是目前最流行的 Docker + Kubernetes 的組合。目前一般微服務架構,都不會直接使用物理機,因為現代的網際網路業務一般都具有這樣的特性(我們拿電子商城舉例):
- 業務會在某一時刻開始突然開始快速增長,例如我們開始在各地投放廣告,使用者不斷進入網站,隨著口碑不斷變好,使用者增長速度越來越快。
- 業務在一段時間內,有高峰有低谷。例如在一天內,白天一般都在上班,晚上訪問網站下單的人數比較多。
- 業務在一段時間內,最高峰與最低峰之間的差距隨著業務增長越來越大。由於大部分使用者都在晚上訪問網站下單,導致白天和晚上的流量相差越來越大。
- 會突然出現流量尖峰,並且很難預測這個時間點以及估計量。例如雙 11 促銷的時候,人們大量湧入,很難能估計的好會有多少流量。還有就是突然大家需要某個商品的時候,例如新冠剛開始的時候,口罩搶購一空。
對於這些特性,根據業務壓力,智慧並且快速動態擴容縮容這個功能變得越來越重要,但是這個功能在直接部署業務到物理機上很難實現。這時候出現了虛擬機器,將物理機虛擬化抽象成多個虛擬機器,比如 vmware 和 openstack,我們可以使用虛擬機器在我們的作業系統中模擬出多臺子電腦,子電腦之間是相互隔離的,這樣可以更細緻動態的分配物理機的資源。但是虛擬機器對於開發和運維人員而言,還是太過於笨重了,存在啟動慢,佔用空間大,不易遷移的缺點。
接著,容器化技術應運而生,它不需要虛擬出整個作業系統,只需要虛擬一個小規模的環境即可,而且啟動速度很快,除了執行其中應用以外,基本不消耗額外的系統資源。Docker 是應用最為廣泛的容器技術,通過打包映象,啟動容器來建立一個服務。但是隨著應用越來越複雜,容器的數量也越來越多,由此衍生了管理運維容器的這個重要場景。這個場景目前最流行的解決方案就是 Kubernetes(k8s)。
Kubernetes 能為我們提供如下功能:
- 容器編排與管理,機器資源管理以及儲存卷掛載
- 服務的健康檢查以及自愈
- 服務彈性擴容
- 配置中心
- 服務發現與排程
- 負載均衡
在我們公司中,專案團隊包括了運維團隊以及後端開發團隊。對於 Docker 映象打包與管理以及對於 K8s 的開發維護部署,主要交給運維團隊。微服務業務開發維護,實現微服務特性的框架的開發維護是交給後端開發團隊的。所以對於 K8s 的功能,我們只使用了前三個,對於配置中心、服務發現與排程還有負載均衡,我們還是主要交給實現微服務特性的框架實現的,未來可能會將這三個功能使用起來。
微服務框架需要考慮與 K8s 的互動,主要是服務的健康檢查以及自愈以及服務彈性擴容:
- 服務的健康檢查以及自愈:K8s 可以通過檢查埠是否被監聽使用,呼叫 http 介面來檢查程序是否啟動以及程序的健康性,我們需要提供這種健康檢查介面。主要通過 spring boot 的 actuator 實現
- 服務彈性擴容:K8s 需要獲取程序的監控指標來決定是否需要擴容,並且我們也需要監控中心採集這些指標。我們主要通過 grafana(監控中心) + prometheus(採集指標) + actuator(暴露介面) 實現。
本篇主要交代了我們使用 Spring Cloud 作為我們微服務框架的背景以及底層的雲元件和功能邊界,接下來我們會繼續介紹我們要使用微服務框架實現的功能,以及包含的元件和使用中要考慮的問題。
微信搜尋“我的程式設計喵”關注公眾號,每日一刷,輕鬆提升技術,斬獲各種offer: