不管是商業應用仍是用戶應用,在業務初期都很簡單,咱們一般會把它實現爲單體結構的應用。可是,隨着業務逐漸發展,產品思想會變得愈來愈複雜,單體結構的應用也會愈來愈複雜。這就會給應用帶來以下的幾個問題:java
因爲單體結構的應用隨着系統複雜度的增高,會暴露出各類各樣的問題。近些年來,微服務架構逐漸取代了單體架構,且這種趨勢將會愈來愈流行。Spring Cloud是目前最經常使用的微服務開發框架,已經在企業級開發中大量的應用。git
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,如服務發現註冊、配置中心、智能路由、消息總線、負載均衡、斷路器、數據監控等,均可以用Spring Boot的開發風格作到一鍵啓動和部署。web
Spring Cloud並無重複製造輪子,它只是將各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,經過Spring Boot風格進行再封裝屏蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分佈式系統開發工具包。spring
協調各個微服務,簡化分佈式系統開發。編程
微服務的框架那麼多好比:dubbo、Kubernetes,爲何就要使用Spring Cloud的呢?api
優勢:安全
缺點:服務器
總的來講優勢大過於缺點,目前看來Spring Cloud是一套很是完善的分佈式框架,目前不少企業開始用微服務、Spring Cloud的優點是顯而易見的。所以對於想研究微服務架構的同窗來講,學習Spring Cloud是一個不錯的選擇。網絡
Spring Cloud對於中小型互聯網公司來講是一種福音,由於這類公司每每沒有實力或者沒有足夠的資金投入去開發本身的分佈式系統基礎設施,使用Spring Cloud一站式解決方案能在從容應對業務發展的同時大大減小開發成本。架構
同時,隨着近幾年微服務架構和Docker容器概念的火爆,也會讓Spring Cloud在將來愈來愈「雲」化的軟件開發風格中立有一席之地,尤爲是在五花八門的分佈式解決方案中提供了標準化的、全站式的技術方案,意義可能會堪比當年Servlet規範的誕生,有效推動服務端軟件系統技術水平的進步。
Spring Cloud的子項目,大體可分紅兩類,一類是對現有成熟框架"Spring Boot化"的封裝和抽象,也是數量最多的項目;第二類是開發了一部分分佈式系統的基礎設施的實現,如Spring Cloud Stream扮演的就是kafka, ActiveMQ這樣的角色。
集中配置管理工具,分佈式系統中統一的外部配置管理,默認使用Git來存儲配置,能夠支持客戶端配置的刷新及加密、解密操做。
Netflix OSS 開源組件集成,包括Eureka、Hystrix、Ribbon、Feign、Zuul等核心組件。
用於傳播集羣狀態變化的消息總線,使用輕量級消息代理連接分佈式系統中的節點,能夠用來動態刷新集羣中的服務配置。
基於Hashicorp Consul的服務治理組件。
安全工具包,對Zuul代理中的負載均衡OAuth2客戶端及登陸認證進行支持。
Spring Cloud應用程序的分佈式請求鏈路跟蹤,支持使用Zipkin、HTrace和基於日誌(例如ELK)的跟蹤。
輕量級事件驅動微服務框架,可使用簡單的聲明式模型來發送及接收消息,主要實現爲Apache Kafka及RabbitMQ。
用於快速構建短暫、有限數據處理任務的微服務框架,用於嚮應用中添加功能性和非功能性的特性。
基於Apache Zookeeper的服務治理組件。
API網關組件,對請求提供路由及過濾功能。
基於Ribbon和Hystrix的聲明式服務調用組件,能夠動態建立基於Spring MVC註解的接口實現用於服務調用,在Spring Cloud 2.0中已經取代Feign成爲了一等公民。
Spring Cloud是一個由許多子項目組成的綜合項目,各子項目有不一樣的發佈節奏。爲了管理Spring Cloud與各子項目的版本依賴關係,發佈了一個清單,其中包括了某個Spring Cloud版本對應的子項目版本。
爲了不Spring Cloud版本號與子項目版本號混淆,Spring Cloud版本採用了名稱而非版本號的命名,這些版本的名字採用了倫敦地鐵站的名字,根據字母表的順序來對應版本時間順序,例如Angel是第一個版本,Brixton是第二個版本。
當Spring Cloud的發佈內容積累到臨界點或者一個重大BUG被解決後,會發佈一個"service releases"版本,簡稱SRX版本,好比Greenwich.SR2就是Spring Cloud發佈的Greenwich版本的第2個SRX版本。目前Spring Cloud的最新版本是Hoxton。
注意:Hoxton版本是基於SpringBoot 2.2.x版本構建的,不適用於1.5.x版本。隨着2019年8月SpringBoot 1.5.x版本中止維護,Edgware版本也將中止維護。
SpringBoot專一於快速方便的開發單個個體微服務。
SpringCloud是關注全局的微服務協調整理治理框架,它將SpringBoot開發的一個個單體微服務整合並管理起來,
爲各個微服務之間提供,配置管理、服務發現、斷路器、路由、微代理、事件總線、全局鎖、決策競選、分佈式會話等等集成服務
SpringBoot能夠離開SpringCloud獨立使用開發項目, 可是SpringCloud離不開SpringBoot ,屬於依賴的關係
SpringBoot專一於快速、方便的開發單個微服務個體,SpringCloud關注全局的服務治理框架。
(1)與分佈式系統相關的複雜性-這種開銷包括網絡問題,延遲開銷,帶寬問題,安全問題。
(2)服務發現-服務發現工具管理羣集中的流程和服務如何查找和互相交談。它涉及一個服務目錄,在該目錄中註冊服務,而後可以查找並鏈接到該目錄中的服務。
(3)冗餘-分佈式系統中的冗餘問題。
(4)負載平衡 --負載平衡改善跨多個計算資源的工做負荷,諸如計算機,計算機集羣,網絡鏈路,中央處理單元,或磁盤驅動器的分佈。
(5)性能-問題 因爲各類運營開銷致使的性能問題。
(6)部署複雜性-Devops 技能的要求。
當咱們開始一個項目時,咱們一般在屬性文件中進行全部的配置。隨着愈來愈多的服務開發和部署,添加和修改這些屬性變得更加複雜。有些服務可能會降低,而某些位置可能會發生變化。手動更改屬性可能會產生問題。
Eureka 服務註冊和發現能夠在這種狀況下提供幫助。因爲全部服務都在 Eureka 服務器上註冊並經過調用 Eureka 服務器完成查找,所以無需處理服務地點的任何更改和處理。
(1)服務調用方式 dubbo是RPC springcloud Rest Api
(2)註冊中心,dubbo 是zookeeper springcloud是eureka,也能夠是zookeeper
(3)服務網關,dubbo自己沒有實現,只能經過其餘第三方技術整合,springcloud有Zuul路由網關,做爲路由服務器,進行消費者的請求分發,springcloud支持斷路器,與git完美集成配置文件支持版本控制,事物總線實現配置文件的更新與服務自動裝配等等一系列的微服務架構要素。
在計算中,負載平衡能夠改善跨計算機,計算機集羣,網絡連接,中央處理單元或磁盤驅動器等多種計算資源的工做負載分佈。負載平衡旨在優化資源使用,最大化吞吐量,最小化響應時間並避免任何單一資源的過載。使用多個組件進行負載平衡而不是單個組件可能會經過冗餘來提升可靠性和可用性。負載平衡一般涉及專用軟件或硬件,例如多層交換機或域名系統服務器進程。
Hystrix 是一個延遲和容錯庫,旨在隔離遠程系統,服務和第三方庫的訪問點,當出現故障是不可避免的故障時,中止級聯故障並在複雜的分佈式系統中實現彈性。
一般對於使用微服務架構開發的系統,涉及到許多微服務。這些微服務彼此協做。
思考如下微服務
假設若是上圖中的微服務 9 失敗了,那麼使用傳統方法咱們將傳播一個異常。但這仍然會致使整個系統崩潰。
隨着微服務數量的增長,這個問題變得更加複雜。微服務的數量能夠高達 1000.這是 hystrix 出現的地方 咱們將使用 Hystrix 在這種狀況下的 Fallback 方法功能。咱們有兩個服務 employee-consumer 使用由 employee-consumer 公開的服務。
簡化圖以下所示
如今假設因爲某種緣由,employee-producer 公開的服務會拋出異常。咱們在這種狀況下使用 Hystrix 定義了一個回退方法。這種後備方法應該具備與公開服務相同的返回類型。若是暴露服務中出現異常,則回退方法將返回一些值。[
](http://mp.weixin.qq.com/s?__b...
因爲某些緣由,employee-consumer 公開服務會引起異常。在這種狀況下使用Hystrix 咱們定義了一個回退方法。若是在公開服務中發生異常,則回退方法返回一些默認值。
若是 firstPage method() 中的異常繼續發生,則 Hystrix 電路將中斷,而且員工使用者將一塊兒跳過 firtsPage 方法,並直接調用回退方法。斷路器的目的是給第一頁方法或第一頁方法可能調用的其餘方法留出時間,並致使異常恢復。可能發生的狀況是,在負載較小的狀況下,致使異常的問題有更好的恢復機會 。
Feign 是受到 Retrofit,JAXRS-2.0 和 WebSocket 啓發的 java 客戶端聯編程序。
Feign 的第一個目標是將約束分母的複雜性統一到 http apis,而不考慮其穩定性。
在 employee-consumer 的例子中,咱們使用了 employee-producer 使用 REST模板公開的 REST 服務。
可是咱們必須編寫大量代碼才能執行如下步驟
(1)使用功能區進行負載平衡。
(2)獲取服務實例,而後獲取基本 URL。
(3)利用 REST 模板來使用服務。前面的代碼以下
@Controller public class ConsumerControllerClient { @Autowired private LoadBalancerClient loadBalancer; public void getEmployee() throws RestClientException, IOException { ServiceInstance serviceInstance=loadBalancer.choose("employee-producer"); System.out.println(serviceInstance.getUri()); String baseUrl=serviceInstance.getUri().toString(); baseUrl=baseUrl+"/employee"; RestTemplate restTemplate = new RestTemplate(); ResponseEntity<String> response=null; try{ response=restTemplate.exchange(baseUrl, HttpMethod.GET, getHeaders(),String.class); } catch (Exception ex) { System.out.println(ex); } System.out.println(response.getBody()); }
http://mp.weixin.qq.com/s?__b...
當一個服務調用另外一個服務因爲網絡緣由或自身緣由出現問題,調用者就會等待被調用者的響應 當更多的服務請求到這些資源致使更多的請求等待,發生連鎖效應(雪崩效應)
斷路器有徹底打開狀態:一段時間內 達到必定的次數沒法調用 而且屢次監測沒有恢復的跡象 斷路器徹底打開 那麼下次請求就不會請求到該服務
半開:短期內 有恢復跡象 斷路器會將部分請求發給該服務,正常調用時 斷路器關閉
關閉:當服務一直處於正常狀態 能正常調用
在分佈式系統中,因爲服務數量巨多,爲了方便服務配置文件統一管理,實時更新,因此須要分佈式配置中心組件。在Spring Cloud中,有分佈式配置中心組件spring cloud config ,它支持配置服務放在配置服務的內存中(即本地),也支持放在遠程Git倉庫中。在spring cloud config 組件中,分兩個角色,一是config server,二是config client。
使用:
(1)添加pom依賴
(2)配置文件添加相關配置
(3)啓動類添加註解@EnableConfigServer
Spring Cloud Gateway是Spring Cloud官方推出的第二代網關框架,取代Zuul網關。網關做爲流量的,在微服務系統中有着很是做用,網關常見的功能有路由轉發、權限校驗、限流控制等做用。
使用了一個RouteLocatorBuilder的bean去建立路由,除了建立路由RouteLocatorBuilder可讓你添加各類predicates和filters,predicates斷言的意思,顧名思義就是根據具體的請求的規則,由具體的route去處理,filters是各類過濾器,用來對請求作各類判斷和修改。
做者:ThinkWon
來源:https://thinkwon.blog.csdn.ne...本文首發於公衆號:Java版web項目,歡迎關注獲取更多精彩內容