spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排、全域性鎖、決策競選、分散式會話和叢集狀態管理等操作提供了一種簡單的開發方式。
Spring Cloud與Dubbo對比
提到Dubbo,我想順便提下ESB,目前央視新華社也在用ESB來做任務編排,這裡先比較下Dubbo和ESB:
ESB(企業資料匯流排),一般採用集中式轉發請求,適合大量異構系統整合,側重任務的編排,效能問題可通過異構的方式來進行規避,無法支援特別大的併發。
Dubbo(服務註冊管理),採用的是分散式呼叫,註冊中心只記錄地址資訊,然後直連呼叫,適合併發及壓力比較大的情況;其側重服務的治理,將各個服務顆粒化,各個子業務系統在程式邏輯上完成業務的編排。
迴歸主題,Spring Cloud和Dubbo又有什麼不同那,首先,我們看下有什麼相同之處,它們兩都具備分散式服務治理相關的功能,都能夠提供服務註冊、發現、路由、負載均衡等。說到這,Dubbo的功能好像也就這麼多了,但是Spring Cloud是提供了一整套企業級分散式雲應用的完美解決方案,能夠結合Spring Boot,Docker實現快速開發的目的,所以說Dubbo只有Spring Cloud的一部分RPC功能,而且也談不上誰好誰壞。不過,Dubbo專案現已停止了更新,淘寶內部由hsf替代dubbo,我想這會有更多人傾向Spring Cloud了。
從開發角度上說,Dubbo常與Spring、zookeeper結合,而且實現只是通過xml來配置服務地址、名稱、埠,程式碼的侵入性是很小的,相對Spring Cloud,它的實現需要類註解等,多少具有一定侵入性。
Spring Cloud子專案
Spring Cloud包含了多個子專案(針對分散式系統中涉及的多個不同開源產品),之前在第一章節也介紹這些,比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等專案,可以跳至(一)看下。
配置服務
Spring Cloud提供了Config Server,它有在分散式系統開發中做外部配置的功能,通過Config Server我們可以集中儲存所有應用的配置檔案。Config Server支援Git或者在檔案系統中放置配置檔案(GitLab),通常我們使用不同格式來區分不同應用的不同配置檔案。雲端計算環境下,習慣上使用YAML配置,而且一般配置檔案的位置都放在類路徑下的config目錄下,配置檔案規則:應用名+profile.yml:
[html] view plain copy
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
Spring Cloud提供了註解@EnableConfigServer來啟動配置服務。
服務發現
Spring Cloud通過Netflix OSS的Eureka來實現服務發現,服務發現的主要目的是為了讓每個服務之間可以互相通訊。Eureka Server為微服務的註冊中心。談到Spring Cloud Netflix,它是Spring Cloud的子專案之一,主要提供的模組包括:服務發現(Eureka),斷路器(Hystrix),智慧路有(Zuul),客戶端負載均衡(Ribbon)等。
Spring Cloud使用註解的方式提供了Eureka服務端(@EnableEurekaServer)和客戶端(@EnableEurekaClient)。
路由閘道器
路由閘道器的主要目的是為了讓所有的微服務對外只有一個介面,我們只需訪問一個閘道器地址,即可由閘道器將所有的請求代理到不同的服務中。Spring Cloud是通過Zuul來實現的,支援自動路由對映到在Eureka Server上註冊的服務。Spring Cloud提供了註解@EnableZuulProxy來啟用路由代理。
負載均衡
Spring Cloud提供了Ribbon和Feign作為客戶端的負載均衡。在Spring Cloud下,使用Ribbon直接注入一個RestTemplate物件即可,此RestTemplate已做好負載均衡的配置;而使用Feign只需定義個註解,有@FeignClient註解的介面,然後使用@RequestMapping註解在方法上對映遠端的REST服務,此方法也是做好了負載均衡配置。
斷路器
斷路器(Circuit Breaker)主要是為了解決當某個方法呼叫失敗的時候,呼叫後備方法來替代失敗的方法,已達到容錯/阻止級聯錯誤的功能。Spring Cloud使用@EnableCircuitBreaker來啟用斷路器支援,使用@HystrixCommand的fallbackMethod來指定後備方法。(@HystrixCommand(fallbackMethod="fallbackOper"))
Spring Cloud還提供了一個控制檯來監控斷路器的執行情況,通過@EnableHystrixDashboard註解開啟。
Spring Cloud依賴庫
這裡我會羅列下常用的一些依賴包,為了更好理解每個依賴所負責的區域,我還是用一張和之前類似的圖來展示各塊的功能:
常用依賴包如下:
[html] view plain copy
spring-cloud-starter-parent 具備spring-boot-starter-parent同樣功能並附加Spring Cloud的依賴
spring-cloud-starter-config 預設的配置服務依賴,快速自動引入服務的方式,埠8888
spring-cloud-config-server/client 使用者自定義配置服務的服務端/客戶端依賴
spring-cloud-starter-eureka-server 服務發現的Eureka Server依賴
spring-cloud-starter-eureka 服務發現的Eureka客戶端依賴
spring-cloud-starter-hystrix/zuul/feign/ribbon 斷路器(Hystrix),智慧路有(Zuul),客戶端負載均衡(Ribbon)的依賴
angular-ui-router 頁面分發路由依賴
總結
這裡所有的總結只是停留在對Spring Cloud的理解上,我推薦去http://projects.spring.io/spring-cloud/官網導讀多實踐下專案,瞭解下各個模組的服務訊息通訊方式等,大概就是這樣。
如果你對Spring Cloud感興趣,想了解Spring Boot快速開發,以及使用JHipster生成構建Spring Boot +AngularJS的應用程式碼,歡迎加QQ群:58612944,裡面有很多大牛指導,我也在學習中。另外,群裡我們在組織翻譯GitHub上JHipster的官方文件,如果感興趣,可以進來一塊為開源做貢獻。
關於JHipster擴充套件
JHipster -> 關於SpringBoot,AngularJS及Spring生態融合的技術棧, 是SpringBoot的最佳實踐,是SpringCloud對Netflix技術棧的最佳實踐,是J2EE-Cloud微服務的最佳實踐,是Docker,Kubernetes和AngularJS1/2的最佳實踐,是全棧式開發,敏捷開發最理想的工具。