Spring Cloud學習核心功能和核心組件(第一天)

一、Spring Cloud簡介

       儘管Spring Cloud帶有“Cloud”的字樣,但它並不是雲計算解決方案,而是在Spring Boot基礎上構建的,用於快速構建分佈式系統的通用模式的工具集

       使用Spring Cloud開發的應用程序非常適合在Docker或者PaaS(例如Cloud Foundry)上部署,所以又叫做雲原生應用(Cloud Native Application)。雲原生(Cloud Native)可簡單理解爲面向雲環境的軟件架構。

二、核心功能

  • Distributed/versioned configuration 分佈式/版本化的配置管理
  • Service registration and discovery 服務註冊與服務發現
  • Routing 路由
  • Service-to-service calls 端到端的調用
  • Load balancing 負載均衡
  • Circuit Breakers 斷路器
  • Global locks 全局鎖
  • Leadership election and cluster state 選舉與集羣狀態管理
  • Distributed messaging 分佈式消息

三、核心組件

  • Spring Cloud Config

       Spring Cloud Config爲分佈式系統中的外部配置提供服務器和客戶端支持。方便部署與運維。分客戶端、服務端。
       服務端也稱分佈式配置中心,是一個獨立的微服務應用,用來連接配置服務器併爲客戶端提供獲取配置信息,加密/解密信息等訪問接口。
       客戶端則是通過指定配置中心來管理應用資源,以及與業務相關的配置內容,並在啓動的時候從配置中心獲取和加載配置信息。默認採用 git,並且可以通過 git 客戶端工具來方便管理和訪問配置內容。

優點:

  1. 集中管理配置文件
  2. 不同環境不同配置,動態化的配置更新
  3. 運行期間,不需要去服務器修改配置文件,服務會想配置中心拉取自己的信息
  4. 配置信息改變時,不需要重啓即可更新配置信息到服務
  5. 配置信息以 rest 接口暴露

 

  • Spring Cloud Netflix

       Spring Cloud Netflix框架剛好就滿足了上面的核心功能,而且最重要的是,使用起來非常的簡單。Spring Cloud Netflix包含的組件及其主要功能大致如下:

       Eureka,服務註冊和發現,它提供了一個服務註冊中心、服務發現的客戶端,還有一個方便的查看所有註冊的服務的界面。 所有的服務使用Eureka的服務發現客戶端來將自己註冊到Eureka的服務器上。

       Zuul,網關,所有的客戶端請求通過這個網關訪問後臺的服務。他可以使用一定的路由配置來判斷某一個URL由哪個服務來處理。並從Eureka獲取註冊的服務來轉發請求。

       Ribbon,即負載均衡,Zuul網關將一個請求發送給某一個服務的應用的時候,如果一個服務啓動了多個實例,就會通過Ribbon來通過一定的負載均衡策略來發送給某一個服務實例。

       Feign,服務客戶端,服務之間如果需要相互訪問,可以使用RestTemplate,也可以使用Feign客戶端訪問。它默認會使用Ribbon來實現負載均衡。

       Hystrix,監控和熔斷器。我們只需要在服務接口上添加Hystrix標籤,就可以實現對這個接口的監控和斷路器功能。

       Hystrix Dashboard,監控面板,他提供了一個界面,可以監控各個服務上的服務調用所消耗的時間等。

       Turbine,監控聚合,使用Hystrix監控,我們需要打開每一個服務實例的監控信息來查看。而Turbine可以幫助我們把所有的服務實例的監控信息聚合到一個地方統一查看。這樣就不需要挨個打開一個個的頁面一個個查看。

 

  • Spring Cloud Bus

       Spring Cloud Bus將分佈式系統的節點與輕量級消息代理鏈接。這可以用於廣播狀態更改(例如配置更改)或其他管理指令。一個關鍵的想法是,Bus就像一個擴展的Spring Boot應用程序的分佈式執行器,但也可以用作應用程序之間的通信渠道。當前唯一的實現是使用AMQP代理作爲傳輸,但是相同的基本功能集(還有一些取決於傳輸)在其他傳輸的路線圖上。

 

  • Spring Cloud Cloudfoundry

       Spring Cloud for Cloudfoundry可以輕鬆地在Cloud Foundry(平臺即服務)中運行Spring Cloud應用程序。 Cloud Foundry具有“服務”的概念,即“綁定”到應用程序的中間件,實質上爲其提供包含憑據的環境變量(例如,用於服務的位置和用戶名)。

特性

        spring-cloud-cloudfoundry-web項目爲Cloud Foundry中的一些增強的Web應用功能提供基本支持:自動綁定到單點登錄服務,並可選擇爲發現啓用粘性路由。
        spring-cloud-cloudfoundry-discovery項目提供Spring Cloud Commons DiscoveryClient的實現,因此您可以@EnableDiscoveryClient並提供您的憑據spring.cloud.cloudfoundry.discovery。[email,password]然後您可以直接使用DiscoveryClient或通過一個LoadBalancerClient(如果你沒有連接到Pivotal Web Services,也是* .url)。

 

  • Spring Cloud Open Service Broker

       Spring Cloud Open Service Broker是一個用於構建實現Open Service Broker API的Spring Boot應用程序的框架。
       Open Service Broker API項目允許開發人員爲雲本地平臺(如Cloud Foundry,Kubernetes和OpenShift)中運行的應用程序提供服務。 Spring Cloud Open Service Broker提供了一個基於Spring Boot的框架,使您能夠在支持Open Service Broker API的平臺上爲您自己的託管服務快速創建服務代理。

 

  • Spring Cloud Cluster

       提供Leadership選舉,如:Zookeeper, Redis, Hazelcast, Consul等常見狀態模式的抽象和實現。

       此項目現在已被Spring Integration中的代碼取代。 這裏的所有接口都有主Spring庫中的對應部分,並且實現大部分是並行的(etcd是一個例外,因爲第三方庫中缺乏對v3的支持)。 1.0.1版本棄用了所有有利於Spring Integration的東西。

注: 對於Hazelcast,支持是在擴展項目中。
       Spring Cloud Cluster提供了一組用於在分佈式系統中構建“集羣”功能的原語。 例如領導選舉,集羣狀態的一致存儲,全局鎖和一次性令牌。

  • Spring Cloud Consul

        Spring Cloud Consul 項目是針對 Consul 的服務治理實現。Consul 是一個分佈式高可用的系統,它包含多個組件,但是作爲一個整體,在微服務架構中爲我們的基礎設施提供服務發現和服務配置的工具。

Eureka 和 Consul 的對比:

       Eureka 是一個服務發現工具。該體系結構主要是客戶端/服務器,每個數據中心有一組 Eureka 服務器,通常每個可用區域一個。通常 Eureka 的客戶使用嵌入式 SDK 來註冊和發現服務。對於非本地集成的客戶,官方提供的 Eureka 一些 REST 操作 API,其它語言可以使用這些 API 來實現對 Eureka Server 的操作從而實現一個非 jvm 語言的 Eureka Client。

       Eureka 提供了一個弱一致的服務視圖,儘可能的提供服務可用性。當客戶端向服務器註冊時,該服務器將嘗試複製到其它服務器,但不提供保證複製完成。服務註冊的生存時間(TTL)較短,要求客戶端對服務器心跳檢測。不健康的服務或節點停止心跳,導致它們超時並從註冊表中刪除。服務發現可以路由到註冊的任何服務,由於心跳檢測機制有時間間隔,可能會導致部分服務不可用。這個簡化的模型允許簡單的羣集管理和高可擴展性。

       Eureka 提供了一些列特性,包括更豐富的健康檢查,鍵值對存儲以及多數據中心。Consul 需要每個數據中心都有一套服務,以及每個客戶端的 agent,類似於使用像 Ribbon 這樣的服務。Consul agent 允許大多數應用程序成爲 Consul 不知情者,通過配置文件執行服務註冊並通過 DNS 或負載平衡器 sidecars 發現。

       Consul 提供強大的一致性保證,因爲服務器使用 Raft 協議複製狀態 。Consul 支持豐富的健康檢查,包括 TCP,HTTP,Nagios / Sensu 兼容腳本或基於 Eureka 的 TTL。客戶端節點參與基於 Gossip 協議的健康檢查,該檢查分發健康檢查工作,而不像集中式心跳檢測那樣成爲可擴展性挑戰。發現請求被路由到選舉出來的 leader,這使他們默認情況下強一致性。允許客戶端過時讀取取使任何服務器處理他們的請求,從而實現像 Eureka 這樣的線性可伸縮性。

       Consul 強烈的一致性意味着它可以作爲領導選舉和集羣協調的鎖定服務。Eureka 不提供類似的保證,並且通常需要爲需要執行協調或具有更強一致性需求的服務運行 ZooKeeper。

       Consul 提供了支持面向服務的體系結構所需的一系列功能。這包括服務發現,還包括豐富的運行狀況檢查,鎖定,密鑰/值,多數據中心聯合,事件系統和 ACL。Consul 和 consul-template 和 envconsul 等工具生態系統都試圖儘量減少集成所需的應用程序更改,以避免需要通過 SDK 進行本地集成。Eureka 是一個更大的 Netflix OSS 套件的一部分,該套件預計應用程序相對均勻且緊密集成。因此 Eureka 只解決了一小部分問題,可以和 ZooKeeper 等其它工具可以一起使用。

Consul 強一致性(C)帶來的是:

       服務註冊相比 Eureka 會稍慢一些。因爲 Consul 的 raft 協議要求必須過半數的節點都寫入成功才認爲註冊成功 Leader 掛掉時,重新選舉期間整個 Consul 不可用。保證了強一致性但犧牲了可用性。

Eureka 保證高可用(A)和最終一致性:

       服務註冊相對要快,因爲不需要等註冊信息 replicate 到其它節點,也不保證註冊信息是否 replicate 成功 當數據出現不一致時,雖然 A, B 上的註冊信息不完全相同,但每個 Eureka 節點依然能夠正常對外提供服務,這會出現查詢服務信息時如果請求 A 查不到,但請求 B 就能查到。如此保證了可用性但犧牲了一致性。

       其它方面,eureka 就是個 servlet 程序,跑在 servlet 容器中; Consul 則是 go 編寫而成。

  • Spring Cloud Security

    Spring Cloud Security 爲構建安全的SpringBoot應用提供了一系列解決方案,結合Oauth2可以實現單點登錄、令牌中繼、令牌交換等功能,本文將對其結合Oauth2入門使用進行詳細介紹。

關於OAuth2.0在維基百科中描述如下:

       開放授權(OAuth)是一個開放標準,允許用戶讓第三方應用訪問該用戶在某一網站上存儲的私密的資源(如照片,視頻,聯繫人列表),而無需將用戶名和密碼提供給第三方應用。

       OAuth允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每一個令牌授權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth讓用戶可以授權第三方網站訪問他們存儲在另外服務提供者的某些特定信息,而非所有內容。

      OAuth 2.0是OAuth協議的下一版本,但不向下兼容OAuth 1.0。OAuth 2.0關注客戶端開發者的簡易性,同時爲Web應用,桌面應用和手機,和起居室設備提供專門的認證流程。

  1. Resource Owner: 資源所有者,我們可以直接理解爲:用戶(User);
  2. User Agent: 用戶代理,對於Web應用可以直接理解爲瀏覽器;
  3. Authorization server: 認證服務器,即提供用戶認證和授權的服務器,可以是獨立服務器;
  4. Resource server: 資源服務器,這裏我們可以理解爲需要保護的微服務。

授權模式:

  1. 授權碼模式(authorization code): 該種模式是功能最完整、流程最嚴密的授權模式;
  2. 簡化模式(implicit): 該模式不需要通過第三方應用程序的服務器,跳過了"授權碼"這個步驟,直接在瀏覽器中向認證服務器申請令牌,因此稱爲簡化模式;
  3. 密碼模式(password): 用戶向客戶端提供自己的用戶名和密碼,客戶端通過這些信息直接向認證服務器獲取授權;
  4. 客戶端模式(client credentials): 指客戶端以自己的名義,而不是以用戶的名義向認證服務器獲取認證,這種方式下認證服務器會將客戶端作爲一個用戶來對待。

 

  • Spring Cloud Sleuth

        Spring Cloud Sleuth[sluːθ]是Spring Cloud提供的分佈式系統服務鏈追蹤組件,它大量借用了Google的Dapper,Twitter的Zipkin。

        Spring Cloud Sleuth是一個在應用中實現日誌跟蹤的強有力的工具。使用Sleuth庫可以應用於計劃任務 、多線程服務或複雜的Web請求,尤其是在一個由多個服務組成的系統中。當我們在這些應用中來診斷問題時,即使有日誌記錄也很難判斷出一個請求需要將哪些操作關聯在一起。
  如果想要診斷複雜操作,通常的解決方案是在請求中傳遞唯一的ID到每個方法來識別日誌。 而Sleuth可以與日誌框架Logback、SLF4J輕鬆地集成,通過添加獨特的標識符來使用日誌跟蹤和診斷問題。
  微服務跟蹤(sleuth)其實是一個工具,它在整個分佈式系統中能跟蹤一個用戶請求的過程(包括數據採集,數據傳輸,數據存儲,數據分析,數據可視化),捕獲這些跟蹤數據,就能構建微服務的整個調用鏈的視圖,這是調試和監控微服務的關鍵工具。

  • Spring Cloud Data Flow

       Spring Cloud Data Flow是用於構建數據集成和實時數據處理管道的工具包。

       管道由Spring Boot應用程序組成,使用Spring Cloud Stream或Spring Cloud Task微服務框架構建。 這使得Spring Cloud Data Flow適用於各種數據處理用例,從導入/導出到事件流和預測分析。

 

  • Spring Cloud Stream

       Spring Cloud Stream 是消息中間件組件,它集成了 kafka 和 rabbitmq 。

       Spring Cloud Stream 中的幾個重要概念:

       Destination Binders:目標綁定器,目標指的是 kafka 還是 RabbitMQ,綁定器就是封裝了目標中間件的包。如果操作的是 kafka 就使用 kafka binder ,如果操作的是 RabbitMQ 就使用 rabbitmq binder。

       Destination Bindings:外部消息傳遞系統和應用程序之間的橋樑,提供消息的“生產者”和“消費者”(由目標綁定器創建)

       Message:一種規範化的數據結構,生產者和消費者基於這個數據結構通過外部消息系統與目標綁定器和其他應用程序通信。

 

  • Spring Cloud Stream App Starters

       Spring Cloud Stream Application Starters是基於Spring BootSpring Integration應用程序,可提供與外部系統的集成。 Spring Cloud Stream應用程序可與Spring Cloud Data Flow一起使用,以創建,部署和編排消息驅動的微服務應用程序。

       Spring Cloud Stream Application Starters是獨立的可執行應用程序,可通過Apache Kafka和RabbitMQ等消息傳遞中間件進行通信。 這些應用程序可以在各種運行時平臺上獨立運行,包括:Cloud Foundry,Apache Yarn,Apache Mesos,Kubernetes,Docker,甚至可以在您的筆記本電腦上運行。

特性

  1. 獨立運行作爲Spring Boot應用程序
  2. 將微服務組合爲Spring Cloud Data Flow中的流管道
  3. 將微服務應用程序用作maven或docker工件
  4. 通過命令行,環境變量或YAML文件覆蓋配置參數
  5. 提供基礎架構以單獨測試應用程序
  6. 從此版本的Spring Initializr下載爲初學者

 

  • Spring Cloud Task

       Spring Cloud Task的目標是爲Spring Boot應用程序提供創建短運行期微服務的功能。在Spring Cloud Task中,我們可以靈活地動態運行任何任務,按需分配資源並在任務完成後檢索結果。Tasks是Spring Cloud Data Flow中的一個基礎項目,允許用戶將幾乎任何Spring Boot應用程序作爲一個短期任務執行。
 

  • Spring Cloud Task App Starters

       Spring Cloud Task Application Starters是Spring Boot應用程序,可能是任何進程,包括不能永久運行的Spring Batch作業,並且它們在某些時候結束/停止。 Spring Cloud Task Applications可與Spring Cloud Data Flow一起使用,以創建,部署和編排短期數據微服務。

        Spring Cloud Task Application Starters是獨立的可執行應用程序,可用於按需用例,例如數據庫遷移,機器學習和計劃操作。 這些應用程序可以在各種運行時平臺上獨立運行,包括:Cloud Foundry,Apache Yarn,Apache Mesos,Kubernetes,Docker,甚至可以在您的筆記本電腦上運行。

特性

  1.      獨立運行作爲Spring Boot應用程序
  2.      編排爲短暫的數據微服務
  3.      將數據微服務應用程序用作maven或docker工件
  4.      通過命令行,環境變量或YAML文件覆蓋配置參數
  5.      提供基礎架構以單獨測試應用程序
  6.      從此版本的Spring Initializr下載爲初學者
  • Spring Cloud Zookeeper

        通過Spring Cloud Zookeeper爲應用程序提供一種Spring Boot集成,將Zookeeper通過自動配置和綁定 的方式集成到Spring環境中。

        Spring Cloud Eureka實現的服務治理機制強調了CAP原理中的AP,即可用性與可靠性,而Zookeeper這類強調CP(一致性、可靠性)。Eureka爲了實現更高的服務可用性,犧牲了一定的一致性,在極端情況下它寧願接受故障實例也不要丟掉“健康”實例,比如,當服務註冊中心的網絡發生故障斷開時,由於所有的服務實例無法維持續約心跳,在強調CP的服務治理中將會把所有服務實例都剔除掉,而Eureka則會觸發保護機制,保留此時的所有節點,以實現服務間依然可以進行互相調用的場景。

 

  • Spring Cloud Connectors

       Spring Cloud Connectors簡化了雲平臺(如Cloud Foundry和Heroku)中連接服務和獲取操作環境感知的過程,尤其適用於Spring應用程序。 它是爲可擴展性而設計的:您可以使用提供的雲連接器之一或爲您的雲平臺編寫一個,並且您可以使用內置支持常用服務(關係數據庫,MongoDB,Redis,RabbitMQ)或擴展Spring 雲連接器可與您自己的服務配合使用。

  • Spring Cloud Starters

       Spring Boot風格的starter項目可以簡化Spring Cloud用戶的依賴管理。(作爲項目中止,並在Angel.SR2.)

  • Spring Cloud CLI

       Spring Boot Cloud CLI(或簡稱Cloud CLI)。該工具爲Spring Boot CLI提供了一組命令行增強功能,有助於進一步抽象和簡化Spring Cloud部署。

       CLI於2016年底推出,允許使用命令行、.yml配置文件和Groovy腳本快速自動配置和部署標準Spring Cloud服務。

 

  • Spring Cloud Contract

       Spring Cloud Contract 爲通過CDC(Customer Driven Contracts)開發基於JVM的應用提供了支持。它爲TDD(測試驅動開發)提供了一種新的測試方式 - 基於接口。

 

  • Spring Cloud Gateway

       Spring Cloud Gateway 是 Spring Cloud 的一個全新項目,該項目是基於 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技術開發的網關,它旨在爲微服務架構提供一種簡單有效的統一的 API 路由管理方式。

       Spring Cloud Gateway 作爲 Spring Cloud 生態系統中的網關,目標是替代 Netflix Zuul,其不僅提供統一的路由方式,並且基於 Filter 鏈的方式提供了網關基本的功能,例如:安全,監控/指標,和限流。

特徵:

  1. 基於 Spring Framework 5,Project Reactor 和 Spring Boot 2.0

  2. 動態路由

  3. Predicates 和 Filters 作用於特定路由

  4. 集成 Hystrix 斷路器

  5. 集成 Spring Cloud DiscoveryClient

  6. 易於編寫的 Predicates 和 Filters

  7. 限流

  8. 路徑重寫

與Zuul的區別:

  1. Zuul是Netflix開源的一個項目,Spring只是將Zuul集成在了Spring Cloud中。而Spring Cloud Gateway是Spring Cloud的一個子項目。
  2. 網上很多地方都說Zuul是阻塞的,Gateway是非阻塞的,這麼說是不嚴謹的,準確的講Zuul1.x是阻塞的,而在2.x的版本中,Zuul也是基於Netty,也是非阻塞的,如果一定要說性能,其實這個真沒多大差距。
  • Spring Cloud OpenFeign

OpenFeign:是一個聲明式的WebService客戶端,內部封裝了restTemplate,用於實現微服務系統之間的遠程調用。
  • Spring Cloud Pipelines

       該項目已棄用。它被遷移到:Cloud Pipelines。你可以在這裏讀更多關於它的內容。
       Spring,Spring Boot和Spring Cloud是允許開發人員加快創建新業務功能的工具。然而,衆所周知,該功能只有在生產中才有價值。這就是爲什麼公司花費大量時間和資源來構建自己的部署管道。

該項目試圖解決以下問題:

  1.     創建公共部署管道
  2.     傳播良好的測試和部署實踐
  3.     加快將功能部署到生產所需的時間
  • Spring Cloud Function

Spring Cloud Function是一個具有以下高級目標的項目:

  1.      通過功能促進業務邏輯的實現。
  2.      將業務邏輯的開發生命週期與任何特定的運行時目標分離,以便相同的代碼可以作爲Web端點,流處理器或任務運行。
  3.      支持無服務器提供商之間的統一編程模型,以及獨立運行(本地或PaaS)的能力。
  4.      在無服務器提供商上啓用Spring Boot功能(自動配置,依賴注入,指標)。

它抽象出所有傳輸細節和基礎架構,允許開發人員保留所有熟悉的工具和流程,並專注於業務邏輯。

特性:

Spring Cloud功能特性:

  1.      函數-Function,消費者-Consumer和供應商-Supplier類型的@Beans的包裝器,使用RabbitMQ,Kafka等將它們作爲HTTP端點和/或消息流監聽器/發佈者公開給外部世界。
  2.      將作爲Java函數體的字符串編譯爲字節碼,然後將它們轉換爲可以如上所述進行包裝的@Beans。
  3.      使用隔離的類加載器部署包含此類應用程序上下文的JAR文件,以便您可以將它們打包在一個JVM中。
  4.      AWS LambdaMicrosoft AzureApache OpenWhisk以及可能的其他“無服務器”服務提供商的適配器。

這是一個完整的,可執行的,可測試的Spring Boot應用程序(實現簡單的字符串操作):

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章