微服務框架-SpringCloud簡介
前面一篇文章談到微服務基礎框架,而Netflix的多個開源元件一起正好可以提供完整的分散式微服務基礎架構環境,而對於Spring Cloud正是對Netflix的多個開源元件進一步的封裝而成,同時又實現了和雲端平臺,和Spring Boot開發框架很好的整合。
Spring Cloud是一個相對比較新的微服務框架,今年(2016)才推出1.0的release版本. 雖然Spring Cloud時間最短, 但是相比Dubbo等RPC框架, Spring Cloud提供的全套的分散式系統解決方案。
Spring Cloud 為開發者提供了在分散式系統(配置管理,服務發現,熔斷,路由,微代理,控制匯流排,一次性token,全居瑣,leader選舉,分散式session,叢集狀態)中快速構建的工具,使用Spring Cloud的開發者可以快速的啟動服務或構建應用、同時能夠快速和雲平臺資源進行對接。
我們先簡單闡述下Spring Cloud中文社群對四個基礎關鍵元件的描述:
Spring Cloud Config配置中心
Spring Cloud Config就是我們通常意義上的配置中心。Spring Cloud Config-把應用原本放在本地檔案的配置抽取出來放在中心伺服器,本質是配置資訊從本地遷移到雲端。從而能夠提供更好的管理、釋出能力。
Spring Cloud Config分服務端和客戶端,服務端負責將git(svn)中儲存的配置檔案釋出成REST介面,客戶端可以從服務端REST介面獲取配置。但客戶端並不能主動感知到配置的變化,從而主動去獲取新的配置,這需要每個客戶端通過POST方法觸發各自的/refresh。
Spring Cloud Netflix 服務發現
Spring Cloud Eureka提供在分散式環境下的服務發現,服務註冊的功能。
Spring Cloud Netflix,該專案是Spring Cloud的子專案之一,主要內容是對Netflix公司一系列開源產品的包裝,它為Spring Boot應用提供了自配置的Netflix OSS整合。
通過一些簡單的註解,開發者就可以快速的在應用中配置一下常用模組並構建龐大的分散式系統。它主要提供的模組包括:服務發現(Eureka),斷路器(Hystrix),智慧路由(Zuul),客戶端負載均衡(Ribbon)等。
Spring cloud Hystrix 熔斷器
斷路器(Cricuit Breaker)是一種能夠在遠端服務不可用時自動熔斷(開啟開關),並在遠端服務恢復時自動恢復(閉合開關)的設施。
斷路器(Cricuit Breaker)是一種能夠在遠端服務不可用時自動熔斷(開啟開關),並在遠端服務恢復時自動恢復(閉合開關)的設施,Spring Cloud通過Netflix的Hystrix元件提供斷路器、資源隔離與自我修復功能。
Spring Cloud Zuul 服務閘道器
Spring Cloud Eureka提供在分散式環境下的服務發現,服務註冊的功能。
Spring Cloud Netflix,該專案是Spring Cloud的子專案之一,主要內容是對Netflix公司一系列開源產品的包裝,它為Spring Boot應用提供了自配置的Netflix OSS整合。通過一些簡單的註解,開發者就可以快速的在應用中配置一下常用模組並構建龐大的分散式系統。它主要提供的模組包括:服務發現(Eureka),斷路器(Hystrix),智慧路有(Zuul),客戶端負載均衡(Ribbon)等。
當然Spring Cloud還有額外擴充套件的其它很多元件,包括了服務鏈路監控和跟蹤(很關鍵的一個功能),訊息匯流排,資料流處理,批量任務處理等。而對於整個Spring Cloud微服務框架簡單來說,即是:
你只要劃分到你的微服務元件和模組,並定義好需要暴露的API介面,那麼剩下的整個開發和傳統方式沒有太大的區別,你開發完成的元件整合起來就是一個分散式可擴充套件的微服務環境。裡面設計到的介面釋出,服務註冊,服務呼叫和路由,服務監控,健康檢測和流控等都會由微服務框架來幫你完成。
正是有了成熟的微服務框架,我們才更應該將微服務架構設計重心從技術底層轉移到元件劃分和介面設計上。
SpringCloud和Dubbo的區別問題
可以看到SpringCLoud能夠提供的基礎能力要多於Dubbo,Dubbo可以看作是SpringCLoud簡單實現。
Dubbo是RPC服務治理框架,和Spring Cloud一樣具備服務註冊、發現、路由、負載均衡等能力。但是沒有配置中心,完整的好用全鏈路監控,需要採用開源的解決方案定製或者自研。Spring cloud的配置中心,全鏈路監控等元件。從目前來看,Spring Cloud國內中小型企業用的比較多,大型企業可能需要對其需要的元件進行定製化處理。
但是也需要看到Spring Cloud基於註解的服務發現,服務治理等功能具有程式碼侵入性,dubbo沒有程式碼侵入性,業務開發人員不需要通過註解的方式去關注框架級別的處理。從中介軟體或者做基礎架構的角度來看,其實服務治理等功能對普通的業務程式設計師應該是透明的,業務程式設計師不需要關注服務治理框架的使用,專注於業務程式碼即可。
基於SpringCLoud微服務框架的實踐
對於基於SpringCLoud框架的具體實踐,建議參考翟永超部落格的系列文章,具體如下:
服務註冊和發現
注意這裡仍然使用的是SpringBoot框架,並和SpringBoot框架進行了整合,在pom.xml配置檔案中增加了對SpringCLoud相關包和元件的依賴。在原有的介面API定義的基礎上,我們增加@EnableDiscoveryClient註解後,即可以讓服務註冊中心很輕鬆的發現服務提供方以及提供的服務。
服務消費
方式1 - Ribbon是一個基於HTTP和TCP客戶端的負載均衡器。Ribbon可以在通過客戶端中配置的ribbonServerList服務端列表去輪詢訪問以達到均衡負載的作用。當Ribbon與Eureka聯合使用時,ribbonServerList會被DiscoveryEnabledNIWSServerList重寫,擴充套件成從Eureka註冊中心中獲取服務端列表。
方式2 - Feign是一個宣告式的Web Service客戶端,它使得編寫Web Serivce客戶端變得更加簡單。我們只需要使用Feign來建立一個介面並用註解來配置它既可完成。它具備可插拔的註解支援,包括Feign註解和JAX-RS註解。Feign也支援可插拔的編碼器和解碼器。Spring Cloud為Feign增加了對Spring MVC註解的支援,還整合了Ribbon和Eureka來提供均衡負載的HTTP客戶端實現。
斷路器
首先在pom.xml檔案中增加引入對hystrix依賴,同時在消費端Application主類上增加@EnableCircuitBreaker註解開啟斷路器功能。注意原有的服務消費方式也涉及到修改,增加了服務Callback的回撥函式。
服務閘道器
服務閘道器是微服務架構中一個不可或缺的部分。通過服務閘道器統一向外系統提供REST API的過程中,除了具備服務路由、均衡負載功能之外,它還具備了許可權控制等功能。Spring Cloud Netflix中的Zuul就擔任了這樣的一個角色,為微服務架構提供了前門保護的作用,同時將許可權控制這些較重的非業務邏輯內容遷移到服務路由層面,使得服務叢集主體能夠具備更高的可複用性和可測試性。