1. 程式人生 > >《深入理解Spring Cloud與微服務構建》第2章 Spring Cloud簡介

《深入理解Spring Cloud與微服務構建》第2章 Spring Cloud簡介

開發十年,就只剩下這套架構體系了! >>>   

Spring Cloud作為Java語言的微服務框架,它依賴於Spring Boot,有快速開發、持續交付和容易部署等特點。

1、微服務應該具備的功能

1.1、服務的註冊和發現

微服務系統需要服務註冊中心來統一管理服務例項,方便檢視每一個微服務例項的健康狀態。服務註冊是指向服務註冊中心註冊一個服務例項,服務提供者將自己的服務資訊(如服務名、IP地址等)告知服務註冊中心。服務發現

是指當服務消費者需要消費另外一個服務時,服務註冊中心能夠告知服務消費者它所要消費服務的例項資訊。通常情況下,一個服務既是服務提供者,也是服務消費者。服務消費者一般使用HTTP協議或者訊息元件這種輕量級的通訊機制來進行服務消費。

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也支援ConsulZookeeper,用於註冊和發現服務。

  • 熔斷元件 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架構的流程如下。

  1. 服務提供者向服務中心註冊服務。
  2. 服務消費者訂閱服務。
  3. 服務消費者發現服務。
  4. 服務消費者遠端排程服務提供者進行服務消費,在排程過程中,使用了負載均衡策略、失敗容錯的功能。
  5. 服務消費者和提供者,在記憶體中記錄服務的呼叫次數和呼叫時間,並定時每分鐘傳送一次統計資料到監控中心。

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提出的微服務規範,社群異常活躍,它很可能成為微服務架構的標準。

5、Kubernetes簡介<