《深入理解Spring Cloud與微服務構建》第2章 Spring Cloud簡介
Spring Cloud作為Java語言的微服務框架,它依賴於Spring Boot,有快速開發、持續交付和容易部署等特點。
1、微服務應該具備的功能
1.1、服務的註冊和發現
微服務系統需要服務註冊中心來統一管理服務例項,方便檢視每一個微服務例項的健康狀態。服務註冊是指向服務註冊中心註冊一個服務例項,服務提供者將自己的服務資訊(如服務名、IP地址等)告知服務註冊中心。服務發現
1.2、服務的負載均衡
為了保證服務的高可用,服務單元往往是叢集化部署。例如將服務提供者進行叢集化部署,那麼服務消費者該呼叫哪個服務提供者的例項呢?這就涉及到了服務的負載均衡。
服務消費者整合負載均衡元件,該元件會向服務消費者獲取服務註冊列表資訊,並每隔一段時間重新重新整理獲取該列表。當服務消費者消費服務時,負載均衡元件獲取服務提供者所有例項的註冊資訊,並通過一定的負載均衡策略(開發者可以配置),選擇一個服務提供者的例項,向該例項進行服務消費,這樣就實現了負載均衡。當服務例項資料很多時,為了實現高可用,將服務註冊中心叢集化。
1.3、服務的容錯
為了解決分散式系統的雪崩效應,分散式系統引進了熔斷器機制。
它不僅能夠防止系統的“雪崩”效應,還具有以下作用。
- 將資源隔離,只會隔離出故障的API介面,不會影響到其他API介面。
- 服務降級的功能。大量的請求在短時間內同時湧入,超過了服務的處理能力,熔斷器被開啟,將服務降級,以免伺服器因負載過高而出現故障。
- 自我修復能力。例如網路服務商的問題,導致網路在短時間內不可用,熔斷器被開啟。
1.4、服務閘道器
在微服務系統中,API介面資源通常是由服務閘道器(也稱API閘道器)統一暴露,內部服務不直接對外提供API資源的暴露。這樣做的好處是將內部服務隱藏起來,外界還以為是一個服務在提供服務,在一定程度上保護了微服務系統的安全。
API閘道器通常有請求轉發的作用,另外它可能需要負責一定的安全驗證,例如判斷某個請求是否合法,該請求對某一個資源是否具有操作許可權等。
通常情況下,閘道器層以叢集的形式存在。在服務閘道器層之前,有可能需要加上負載均衡層,通常為Nginx雙機熱備,通過一定的路由策略,將請求轉發到閘道器層。到達閘道器層後,經過一系列的使用者身份驗證、許可權判斷,最終轉發到具體的服務。具體的服務經過一系列的邏輯運算和資料操作,最終將結果返回給使用者。
閘道器層具有很重要的意義,具體體現在以下方面。
- 將所有服務的API介面資源統一聚合,對外統一暴露。
- 使用者身份認證、許可權認證,防止非法請求操作API介面,對內部服務起到保護作用。
- 實現監控功能,實時日誌輸出,對請求進行記錄。
- 流量監控,在高流量的情況下,對服務進行降級。
- API介面從內部服務分離出來,方便做測試。
閘道器實現這些功能,需要做高可用,否則閘道器很可能成為架構中的瓶頸。最常用的閘道器元件有Zuul、Nginx等。
1.5、服務配置的統一管理
在實際開發過程中,每個服務都有大量的配置檔案,例如資料庫的配置、日誌輸出級別的配置等,而往往這些配置在不同的環境中也是不一樣的。隨著服務數量的增加,配置檔案的管理也是一件非常複雜的事。
在微服務架構中,需要有統一管理配置檔案的元件,例如Spring Cloud的Spring Cloud Config元件、阿里的Diamond、百度的Disconf、攜程的Apollo等。
下面以Spring Cloud Config為例來闡述服務配置的統一管理。
對於叢集化的服務,可以通過使用訊息匯流排來重新整理多個服務例項。如果服務數量較多,對配置中心需要考慮叢集化部署,從而使配置中心高可用,做分散式叢集。
1.6、服務鏈路追蹤
在微服務架構中,必須實現分散式鏈路追蹤,去跟進一個請求到底有哪些服務參與,參與的順序又是怎樣的,從而使每個請求鏈路清晰可見,出了問題很快就能定位。
常見的鏈路追蹤元件有Google的Dapper、Twitter的Zipkin,以及阿里的Eagleeye等,都是非常優秀的鏈路追蹤開源元件。
2、Spring Cloud
2.1、簡介
Spring Cloud是基於Spring Boot的。Spring Boot是由Pivotal團隊提供的全新的Web框架,它主要的特點就是簡化了開發和部署的過程,簡化了Spring複雜的配置和依賴管理,通過起步依賴和內建Servlet容器能夠使開發者迅速搭起一個Web工程。所以Spring Cloud在開發部署上繼承了Spring Boot的一些優點,提高其在開發和部署上的效率。
Spring Cloud的首要目標就是通過提供一系列開發元件和框架,幫助開發者迅速搭建一個分散式的微服務系統。Spring Cloud提供了分散式微服務系統的一些常用元件,例如服務註冊和發現、配置中心、熔斷器、智慧路由、微代理、控制匯流排、全域性鎖、分散式會話等。
2.2、常用元件
- 服務註冊和發現元件 Eureka
Eureka元件提供了服務的健康監測,以及介面友好的UI。另外Spring Cloud也支援Consul和Zookeeper,用於註冊和發現服務。
- 熔斷元件 Hystrix
除了有一些基本的熔斷器功能外,還能夠實現服務降級、服務限流的功能。另外Hystrix提供了熔斷器的健康監測,以及熔斷器健康資料的API介面。Hystrix Dashboard元件提供了單個服務熔斷器的健康狀態資料的介面展示功能,Hystrix Turbine元件提供了多個服務的熔斷器的健康狀態資料的介面展示功能。
- 負載均衡元件 Ribbon
Ribbon和Zuul配合,很容易做到負載均衡,將請求根據負載均衡策略分配到不同的服務例項中。Ribbon和RestTemplate、Feign配合,在消費服務時能夠做到負載均衡。
- 路由閘道器 Zuul
Zuul有智慧路由和過濾的功能。內部服務的API介面通過Zuul閘道器統一對外暴露,內部服務的API介面不直接暴露,防止了內部服務敏感資訊對外暴露。Zuul的過濾功能是通過攔截器請求來實現的,可以對一些使用者的角色和許可權進行判斷,起到安全驗證的作用,同時也可以用於輸出實時的請求日誌。
- Spring Cloud Config
Spring Cloud Config提供了配置檔案統一管理的功能。它包括Server端和Client端,Server端讀取本地倉庫或者遠端倉庫的配置檔案,所有的Client向Server讀取配置資訊,從而達到配置檔案統一管理的目的。通常情況下,Spring Cloud Config和Spring Cloud Bus相互配合重新整理指定Client或所有Client的配置檔案。
- Spring Cloud Security
Spring Cloud Security是對Spring Security元件的封裝,Spring Cloud Security向服務單元提供了使用者驗證和許可權認證。一般來說,單獨在微服務系統中使用Spring Cloud Security是很少見的,一般它會配合Spring Security OAuth2元件一起使用,通過搭建授權服務,驗證Token或者JWT這種形式對整個微服務系統進行安全驗證。
- Spring Cloud Sleuth
Spring Cloud Sleuth是一個分散式鏈路追蹤元件,它封裝了Dapper、Zipkin和Kibana等元件,通過它可以知道服務之間的相互依賴關係,並實時觀察鏈路的呼叫情況。
- Spring Cloud Stream
Spring Cloud Stream是Spring Cloud框架的資料流操作包,可以封裝RabbitMQ、ActiveMQ、Kafaka、Redis等訊息元件,利用Spring Cloud Stream可以實現訊息的接收和傳送。
3、Dubbo簡介
Dubbo是阿里巴巴開源的一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,以及SOA服務治理方案。Dubbo廣泛應用於阿里巴巴的各大站點,有很多網際網路公司也在使用這個框架,它包含如下核心內容。
- RPC遠端呼叫
封裝了長連線NIO框架,如Netty、Mina等,採用的是多執行緒模式。
- 叢集容錯
提供了基於介面方法的遠端呼叫的功能,並實現了負載均衡策略、失敗容錯等功能。
- 服務發現
集成了Apache的Zookeeper元件,用於服務的註冊和發現。
Dubbo架構的流程如下。
- 服務提供者向服務中心註冊服務。
- 服務消費者訂閱服務。
- 服務消費者發現服務。
- 服務消費者遠端排程服務提供者進行服務消費,在排程過程中,使用了負載均衡策略、失敗容錯的功能。
- 服務消費者和提供者,在記憶體中記錄服務的呼叫次數和呼叫時間,並定時每分鐘傳送一次統計資料到監控中心。
Dubbo是一個非常優秀的服務治理框架,在國內網際網路公司應用廣泛。它具有以下特性。
- 連通性:註冊中心負責服務的註冊;監控中心負責收集呼叫次數、呼叫時間;註冊中心、服務提供者、服務消費者為長連線。
- 健壯性:監控中心宕機不影響其他服務的使用;註冊中心叢集,任意一個例項宕機自動切換到另一個註冊中心例項;服務例項叢集,任意一個例項宕機,自動切換到另外一個可用的例項。
- 伸縮性:可以動態增減註冊中心和服務的例項數量。
- 升級性:服務叢集升級,不會對現有架構造成壓力。
4、Spring Cloud與Dubbo比較
Spring Cloud擁有很多的專案模組,包含了微服務系統的方方面面。Dubbo是一個非常優秀的服務治理和服務呼叫框架,但缺少很多功能模組,例如閘道器、鏈路追蹤等。在專案模組上,Spring Cloud佔據著更大的優勢。
從學習成本上考慮,Dubbo的版本趨於穩定,文件完善,可以即學即用,沒有太大難度。Spring Cloud基於Spring Boot開發,需要開發者先學會Spring Boot。另外,Spring Cloud版本迭代快,需要快速跟進學習。
從開發風格上來講,Dubbo更傾向於Spring Xml的配置方式,Dubbo官方也推薦這種方式。Spring Cloud基於Spring Boot,Spring Boot採用的是基於註解和JavaBean配置方式的敏捷開發。從開發速度上講,Spring Cloud具有更高的開發和部署速度。
最後,Spring Cloud的通訊方式大多數是基於HTTP Restful風格的,服務與服務之間完全無關、無耦合。由於採用的是HTTP Rest,因此服務無關乎語言和平臺,只需要提供相應的API介面,就可以相互呼叫。Dubbo的通訊方式基於遠端呼叫,對介面、平臺和語言有強依賴性。
Dubbo更易上手,並且廣泛使用於阿里巴巴的各大站點,經歷了“雙11”期間高併發、大流量的檢驗,Dubbo框架非常成熟和穩定。Spring Cloud服務框架嚴格遵守Martin Fowler提出的微服務規範,社群異常活躍,它很可能成為微服務架構的標準。