本系列為之前系列的整理重啟版,隨着項目的發展以及項目中的使用,之前系列里面很多東西發生了變化,並且還有一些東西之前系列並沒有提到,所以重啟這個系列重新整理下,歡迎各位留言交流,謝謝!~
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: