天天看點

SpringCloud基礎概念篇

作者:程式設計俠Java

Spring Cloud是一個服務治理平台,是若幹個架構的集合,提供了全套的分布式系統解決方案。它的目标是簡化分布式系統基礎設施的開發,包含了衆多功能子產品,讓開發者能夠快速建構和部署分布式系統。

SpringCloud基礎概念篇

1. Spring Cloud主要功能

SpringCloud的核心思想是将系統中的各個服務子產品化,每個子產品對外提供一組API接口,其他子產品可以通過這些API接口來調用該子產品提供的服務,在保證互不影響的同時完成各自的任務。Spring Cloud的主要功能如下:

1.1. 配置中心

通過配置中心集中管理配置資訊,實作動态調整分布式系統的配置,避免了重新開機服務的麻煩,使得分布式系統中的配置可以在不重新開機服務的情況下進行動态調整。

1.2. 服務網關

作為整個系統的入口,統一處理外部請求,實作路由和過濾等功能。

1.3. 服務注冊與發現

允許服務在啟動時注冊自己的資訊,并通過服務注冊中心發現其他服務的位置,實作服務之間的通信。

1.4. 路由

實作智能路由功能,根據條件将請求路由到不同的服務執行個體。

1.5. 服務間調用

支援服務之間的互相調用。

1.6. 負載均衡

在多個服務執行個體之間均衡地分發請求,提高系統性能和可靠性。

1.7. 斷路器

在微服務架構中,由于服務之間的調用可能會出現故障或逾時,為了防止故障在系統間蔓延,斷路器模式可以在服務出現故障時進行熔斷,保護整個系統。

1.8. 分布式消息隊列

實作異步消息通信,解耦服務間的依賴,實作解耦和削峰填谷等功能。

微服務架構是Spring Cloud的背景之一。微服務架構将一個大型應用程式劃分成一組小的服務,每個服務都可以獨立部署和擴充,通過輕量級的通信機制互相協調和配合,進而提供最終價值給使用者。Spring Cloud正是針對這種架構模式提供了一套簡單易懂、易部署和易維護的分布式系統開發工具包。

2. Spring Cloud 元件

Spring Cloud采用了Spring Boot風格的封裝,屏蔽掉了複雜的配置和實作原理,使得開發者可以更專注于業務邏輯的開發。它也提供了多個子項目,重點圍繞Netflix、Alibaba以及Spring Cloud官方元件這幾個标準來實作。

2.1. Spring Cloud Netflix元件

Spring Cloud內建了許多Netflix(美國奈飛公司)開發的優秀元件,這些元件提供了服務注冊與發現、配置中心、負載均衡、斷路器、智能路由等功能。其中一些Netflix元件包括Eureka(服務注冊與發現)、Ribbon(負載均衡)、Hystrix(斷路器)、Zuul(服務網關)等。

2.1.1. Eureka服務注冊和發現

它提供了一個服務注冊中心、服務發現的用戶端,還有一個友善的檢視所有注冊的服務的界面。

SpringCloud基礎概念篇

(1) Service Provider: 暴露服務的服務提供方;

(2) Service Consumer: 調用遠端服務的服務消費方;

(3) EureKa Server: 服務注冊中心和服務發現中心;

2.1.2. Zuul網關

所有的用戶端請求通過這個網關通路背景的服務。他可以使用一定的路由配置來判斷某一個URL由哪個服務來處理。并從Eureka擷取注冊的服務來轉發請求。

2.1.3. Ribbon負載均衡

Zuul網關将一個請求發送給某一個服務的應用的時候,如果一個服務啟動了多個執行個體,就會通過Ribbon來通過一定的負載均衡政策來發送給某一個服務執行個體。

2.1.4. Feign服務用戶端

服務之間如果需要互相通路,可以使用RestTemplate,也可以使用Feign用戶端通路。它預設會使用Ribbon來實作負載均衡。

2.1.5. Hystrix監控和熔斷器

我們隻需要在服務接口上添加Hystrix标簽,就可以實作對這個接口的監控和斷路器功能。

2.2. Spring Cloud Alibaba元件

Spring Cloud Alibaba提供了一整套完整的解決方案,通過使用Spring Cloud Alibaba的各個元件,可以實作微服務架構中的服務注冊發現、配置管理、流量控制、熔斷降級、消息傳遞、對象存儲、應用配置管理和日志收集等功能,提高系統的可用性、可靠性和可維護性。

SpringCloud基礎概念篇

2.2.1. Nacos

Nacos是一個服務發現和配置管理平台,用于實作動态服務注冊、發現和配置管理。

通過Nacos,可以實作服務的注冊和發現,同時提供了配置中心的功能,能夠動态地管理應用的配置資訊。

2.2.2. Sentinel

Sentinel是一個流量控制和熔斷降級的元件,用于保護微服務架構中的穩定性和可靠性。

Sentinel可以對流量進行實時的監控與控制,提供了豐富的流控規則和熔斷降級政策,能夠有效地保護系統免受異常流量的影響。

2.2.3. RocketMQ

RocketMQ是一個分布式消息隊列,用于實作異步消息傳遞和解耦微服務之間的通信。

RocketMQ具有高吞吐量、低延遲和高可靠性的特點,支援順序消息和廣播消息,适用于大規模分布式系統的消息通信。

2.2.4. Dubbo

Dubbo 是一個分布式服務架構,它提供了遠端過程調用(RPC)、服務注冊與發現、負載均衡、容錯容災等功能,可以用于建構高性能、高可用、高擴充的分布式應用。

2.2.5. Seata

Seata是阿裡巴巴開源的高性能微服務分布式事務解決方案。

2.3. Spring Cloud 官方元件

除了Spring Cloud Netflix和Spring Cloud Alibaba兩大元件庫之外,Spring自己也開發了開源元件,是以經常會看到這樣一個情況,在某個領域中這三家的元件會紮堆出現。比如服務治理,這三家各自都有一個獨立元件。

2.3.1. Spring Cloud OpenFeign

OpenFeign是一種聲明式、模闆化的HTTP用戶端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP請求通路遠端服務,就像調用本地方法一樣的,開發者完全感覺不到這是在調用遠端方法,更感覺不到在通路HTTP請求。

2.3.2. Spring Cloud Config

提供了分布式系統的配置管理功能,通過統一的配置中心管理各個微服務的配置資訊。

2.3.3. Spring Cloud Gateway

用于建構服務網關,實作統一的請求入口和路由功能。

2.3.4. Spring Cloud Bus

用于在分布式系統中實作消息總線功能,友善配置資訊的動态更新和傳播。

2.3.5. Spring Cloud Stream

用于建構消息驅動的微服務,支援多種消息中間件。

2.3.6. Spring Cloud Sleuth

用于實作分布式系統的鍊路追蹤功能,幫助開發者快速定位和解決分布式系統中的問題。

2.4. 其他通用元件

2.4.1. Zookeeper

Zookeeper 是一個開源的分布式 協調服務架構,它是一個為分布式應用提供一緻性的服務軟體,是雅虎公司建立,是 Gooqle的Chubby一個開源的實作。

2.4.2. Consul

Consul是一套開源的分布式服務發現和配置管理系統,由 HashiCorp 公司用 Go 語言開發。

(1)服務發現:一個用戶端提供自己的服務,例如api服務,或者mysql服務,另一個用戶端就可以利用Consul通過DNS或者http來發現這些服務的提供者。

(2)健康檢查:Consul支援多種檢查類型,包括TCP檢查、HTTP檢查、Docker檢查、Script檢查等。根據具體場景和需求,可以選擇不同的檢查類型。

2.4.3. Nginx

Nginx是一個輕量級、高性能、穩定性高、并發性好的HTTP和反向代理伺服器。Nginx作用是反向代理、負載均衡以及動靜分離。

2.4.4. Apollo

Apollo(阿波羅)是攜程架構部門研發的分布式配置中心,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,并且具備規範的權限、流程治理等特性,适用于微服務配置管理場景。

2.4.5. Kong

Kong是一款基于OpenResty(Nginx + Lua子產品)編寫的高可用、易擴充的,由Mashape公司開源的API Gateway項目。Kong是基于NGINX和Apache Cassandra或PostgreSQL建構的,能提供易于使用的RESTful API來操作和配置API管理系統,是以它可以水準擴充多個Kong伺服器,通過前置的負載均衡配置把請求均勻地分發到各個Server,來應對大批量的網絡請求。

2.4.6. Traefik

Traefik (發音和 traffic 相同,采用 Golang 編寫)是一個雲原生的新型的 HTTP 反向代理、負載均衡軟體。它負責接收系統的請求,然後使用合适的元件來對這些請求進行處理。

3. 五大元件技術選型

3.1. 配置中心

當超過了一定量級的服務之後,系統配置的修改和釋出就會成為項目發展一個不得不關注的難點,是以就誕生了配置中心。配置中心通過集中管理服務配置,提供統一的配置拉取接口來解決因規模不斷擴充導緻的配置管理問題。一般提供版本管理,權限控制,灰階釋出,動态重新整理等功能特性來完善配置管理體系。

3.1.1. Spring Cloud Config

Spring Cloud Config是官方提供的分布式系統的外部配置中心提供伺服器和用戶端支援。

3.1.2. Nacos

Nacos 阿裡開源的架構,緻力發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實作動态服務發現、服務配置、服務中繼資料及流量管理。

3.1.3. Apollo

Apollo(阿波羅)是攜程架構部門研發的開源配置管理中心,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,并且具備規範的權限、流程治理等特性。

SpringCloud基礎概念篇

3.2. 服務注冊與發現

(1) 注冊中心主要有三種角色:

服務提供者(RPC Server):在啟動時,向 Registry 注冊自身服務,并向 Registry 定期發送心跳彙報存活狀态。

服務消費者(RPC Client):在啟動時,向 Registry 訂閱服務,把 Registry 傳回的服務節點清單緩存在本地記憶體中,并與 RPC Sever 建立連接配接。

服務注冊中心(Registry):用于儲存 RPC Server 的注冊資訊,當 RPC Server 節點發生變更時,Registry 會同步變更,RPC Client 感覺後會重新整理本地 記憶體中緩存的服務節點清單。

(2) CAP理論是分布式架構中重要理論:

一緻性(Consistency):所有節點在同一時間具有相同的資料;

可用性(Availability) :保證每個請求不管成功或者失敗都有響應;

分隔容忍(Partition tolerance) :系統中任意資訊的丢失或失敗不會影響系統的繼續運作。

SpringCloud基礎概念篇

在一個分布式系統中,CAP理論不可能三者兼顧,最多隻能同時實作兩點,是以出現了AP/CP的選擇。

SpringCloud基礎概念篇

常見的CP注冊中心有:Zookeeper\Consul\Nacos;

常見的AP注冊中心有:Nacos\Eureka;

3.2.1. Zookeeper

經常是Zookeeper + Doubbo這個組合;

3.2.2. Consul

Consul是一個功能強大的分布式服務注冊和發現系統,具有多資料中心感覺,健康檢查和KV存儲等功能。 Spring Cloud提供了Consul Discovery Client和Spring Cloud Consul Config用于與Consul進行通信。

3.2.3. Nacos

相容AP\CP兩種類型,更靈活和容易地建構、傳遞和管理微服務平台;

3.2.4. Eureka

Eureka是一個開源的、高可用性、彈性可伸縮的服務注冊中心,具有外網發現,地理位置感覺和自我保護等功能。 Spring Cloud提供了Eureka Server和Eureka Client,用于搭建服務注冊中心和将微服務注冊到注冊中心。

注意:Eureka 2.0已經閉源,停止更新了。

SpringCloud基礎概念篇

3.3. 服務網關

服務網關是Spring Cloud微服務架構中的關鍵元件之一,它可以用來路由、過濾和攔截微服務的請求。

3.3.1. Spring Cloud Gateway

Spring Cloud Gateway是Spring Cloud生态系統中最新的服務網關,它使用基于React的Netty網絡架構來實作。它提供了動态路由、請求限制和請求轉發等功能,還可以與Eureka、Consul和Ribbon等技術內建,以實作服務注冊和負載均衡。

3.3.2. Netflix Zuul 2

Netflix Zuul 2是Netflix公司維護的服務網關,具有較好的可擴充性和可定制性。由于Netflix宣布停止對Zuul 1.x的支援,是以Spring Cloud社群現在更喜歡Spring Cloud Gateway,但對于以前使用Zuul 1.x的組織,還可以繼續使用Zuul 2.x版本。

3.3.3. Nginx

Nginx是一個高性能的HTTP和反向代理伺服器。Nginx一方面可以做反向代理,另外一方面可以做靜态資源伺服器,接口使用Lua動态語言可以完成靈活的定制功能。

3.3.4. Kong

Kong基于OpenResty開發,也是流量層網關, 是一個雲原生、快速、可擴充、分布式的Api 網關。繼承了OpenResty的高性能、易擴充性等特點。Kong通過簡單的增加機器節點,可以很容易的水準擴充。同時功能插件化,可通過插件來擴充其能力。而且在任何基礎架構上都可以運作。

3.3.5. Traefik

Traefik 是一個為了讓部署微服務更加便捷而誕生的現代HTTP反向代理、負載均衡工具。它支援多種背景 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API) 來自動化、動态的應用它的配置檔案設定。

3.4. 服務調用和負載均衡

在Spring Cloud微服務架構中,服務之間的通信是通過RESTful API實作的。開發人員必須選擇一種負載均衡器來管理服務之間的互動。以下是目前Spring Cloud中可用的幾種負載均衡器:

3.4.1. Ribbon

Ribbon是一個用戶端負載均衡器,具有對多種協定的支援,如HTTP、TCP和UDP。它可以內建到Eureka或Consul等注冊中心中,以自動發現可用服務。除了提供負載均衡功能,還有其他功能,如斷路器和自定義路由等。

3.4.2. Spring Cloud LoadBalancer

Spring Cloud LoadBalancer是一個基于Java的标準API開發的負載均衡器,它提供了Spring Cloud應用程式中的負載均衡功能。它可以內建到多個注冊中心中,如Eureka、Consul和Zookeeper等,并且與Spring Cloud Gateway和Spring Cloud Service Mesh等元件緊密內建。

Netflix Ribbon已經閉源了,是以Spring官方自己開發了用戶端負載均衡器 Spring Cloud LoadBalancer,代替Netfix Ribbon。

Ribbon隻支援RestTemplate,Spring Cloud LoadBalancer支援RestTemplate和WebClient。

3.4.3. OpenFeign

Feign是一個聲名式WebService用戶端,使用Feign能讓編寫WebService用戶端更加簡單。它的使用方法是定義一個服務接口然後在上面添加注解。Feign也支援可拔插式的編碼器和解碼器。SpringCloud對Feign進行了封裝,使其支援了Spring MVC标準注解和HttpMessageConverters。Feign可以與Eureka和Ribbon組合使用以支援負載均衡。

本質上Feign是基于Ribbon的,Ribbon的配置不變,隻不過Feign在Ribbon的基礎上做了一層封裝,把遠端調用給使用者透明化了:在寫代碼時感覺不是在遠端調用,而是正常的Controller調Service。Service層接口在原來基礎上加一個注解 @FeignClient 。

Feign已經停止維護,是以我們隻需要關注OpenFeign的使用即可。

SpringCloud基礎概念篇

3.5. 斷路器

“斷路器”本身是一種開關裝置,用于在電路上保護線路過載,當線路中有電器發生短路時,“斷路器”能夠及時的切斷故障電路,防止發生過載、發熱、甚至起火等嚴重後果。

在分布式架構中,斷路器模式的作用也是類似的,當某個服務單元發生故障(類似用電器發生短路)之後,通過斷路器的故障監控(類似熔斷保險絲),向調用方傳回一個錯誤響應,而不是長時間的等待。這樣就不會使得線程因調用故障服務被長時間占用不釋放,避免了故障在分布式系統中的蔓延。

3.5.1. Hystrix

在Spring Cloud中使用了Hystrix 來實作斷路器的功能。Hystrix是Netflix開源的微服務架構套件之一,該架構目标在于通過控制那些通路遠端系統、服務和第三方庫的節點,進而對延遲和故障提供更強大的容錯能力。Hystrix具備擁有回退機制和斷路器功能的線程和信号隔離,請求緩存和請求打包,以及監控和配置等功能。

3.5.2. Sentinel

Sentinel是阿裡巴巴開源的一種服務降級架構,它提供了實時監控、規則管理、流量控制等功能,能夠幫助應用程式在高并發場景下保證穩定性和可靠性。

Sentinel是一種功能強大的服務降級架構,可以幫助應用程式在高并發場景下保證穩定性和可靠性,并提供了實時監控、規則管理、流量控制等功能,非常适合于大規模分布式系統中的服務降級場景。

Sentinel提供了實時監控功能,可以對系統的請求進行實時監控,包括請求次數、成功率、響應時間等名額,通過可視化的方式展示出來,幫助開發人員及時發現系統問題。