幾個Spring Cloud核心組件,在微服務架構中,分別扮演的角色:
- Eureka:各個服務啟動時,Eureka Client都會將服務注冊到Eureka Server,並且Eureka Client還可以反過來從Eureka Server拉取注冊表,從而知道其他服務在哪里。服務注冊中心,特性有失效剔除、服務保護。
- Ribbon:服務間發起請求的時候,基於Ribbon做負載均衡,從一個服務的多台機器中選擇一台。客戶端負載均衡,特性有區域親和、重試機制。
- Feign:基於Feign的動態代理機制,根據注解和選擇的機器,拼接請求URL地址,發起請求。聲明式服務調用,本質上就是Ribbon+Hystrix
- Hystrix:發起請求是通過Hystrix的線程池來走的,不同的服務走不同的線程池,實現了不同服務調用的隔離,避免了服務雪崩的問題。客戶端容錯保護,特性有服務降級、服務熔斷、請求緩存、請求合並、依賴隔離。Hystrix為了優化Ribbon、防止整個微服務架構因為某個服務節點的問題導致崩潰,是個保險絲的作用。
- Zuul:如果前端、移動端要調用后端系統,統一從Zuul網關進入,由Zuul網關轉發請求給對應的服務。API服務網關,功能有路由分發和過濾。加在整個微服務最前沿的防火牆和代理器,隱藏微服務結點IP端口信息,加強安全保護的。
zuul起一個路由,分發服務(比如https://www.oschina.net/tweet/路徑交給feign,而https://www.oschina.net/blog/交給bibbon)的作用,偶爾還能和自定義的過濾器協同工作。
feign和ribbon都是做負載均衡(服務消費)的,和hystrix結合可以爆發強大的威力。
其余的組件,例如eureka、config client/server、zipkin、hystrixdashboard、sleuth、consul、turbine根據項目需要使用。
Stream,消息驅動,有Sink、Source、Processor三種通道,特性有訂閱發布、消費組、消息分區。通過Redis ,Rabbit,Kafka 實現消息微服務,可以用過消息隊列形式發送和接受消息
Bus,消息總線,配合Config倉庫修改的一種Stream實現。事件,消息總線,用於集群中消息傳遞、狀態變化、事件等動作,觸發后續的業務聯動性
Sleuth,分布式服務追蹤,需要搞清楚TraceID和SpanID以及抽樣,如何與ELK整合。獨挑大梁,獨自啟動不需要依賴其它組件。
Dashboard,Hystrix儀表盤,監控集群模式和單點模式,其中集群模式需要收集器Turbine配合。
Config,分布式配置中心,支持本地倉庫、SVN、Git、Jar包內配置等模式。Config是為了解決所有微服務各自維護各自的配置,設置一個統一的配置中心,方便修改配置的。
每個組件都不是平白無故的產生的,是為了解決某一特定的問題而存在。
Dashboard給Hystrix統計和展示用的,而且監控服務節點的整體壓力和健康情況。
Turbine是集群收集器,服務於Dashboard的。
Bus是因為config修改完配置后各個結點都要refresh才能生效實在太麻煩,所以交給bus來通知服務節點刷新配置的。
Stream是為了簡化研發人員對MQ使用的復雜度,弱化MQ的差異性,達到程序和MQ松耦合。
Sleuth是因為單次請求在微服務節點中跳轉無法追溯,解決任務鏈日志追蹤問題的。
特殊成員Zipkin,之所以特殊是因為從jar包和包名來看它不屬於Spring Cloud的一員,但是它與Spring Cloud Sleuth的抽樣日志結合的天衣無縫。乍一看它與Hystrix的Dashboard作用有重疊的部分,但是他們的側重點完全不同。Dashboard側重的是單個服務的統計和是否可用,Zipkin側重的監控環節時長。簡言之,Dashboard側重故障診斷,Ziokin側重性能優化。
- Spring Cloud Config:配置管理開發工具包,可以讓你把配置放到遠程服務器,目前支持本地存儲、Git以及Subversion。
- Spring Cloud Bus:事件、消息總線,用於在集群(例如,配置變化事件)中傳播狀態變化,可與Spring Cloud Config聯合實現熱部署。
- Spring Cloud Netflix:針對多種Netflix組件提供的開發工具包,其中包括Eureka、Hystrix、Zuul、Archaius等。
- Netflix Eureka:雲端負載均衡,一個基於 REST 的服務,用於定位服務,以實現雲端的負載均衡和中間層服務器的故障轉移。
- Netflix Hystrix:容錯管理工具,旨在通過控制服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。
- Netflix Zuul:邊緣服務工具,是提供動態路由,監控,彈性,安全等的邊緣服務。
- Netflix Archaius:配置管理API,包含一系列配置管理API,提供動態類型化屬性、線程安全配置操作、輪詢框架、回調機制等功能。
- Spring Cloud for Cloud Foundry:通過Oauth2協議綁定服務到CloudFoundry,CloudFoundry是VMware推出的開源PaaS雲平台。
- Spring Cloud Sleuth:日志收集工具包,封裝了Dapper,Zipkin和HTrace操作。
- Spring Cloud Data Flow:大數據操作工具,通過命令行方式操作數據流。\
- Spring Cloud Security:安全工具包,為你的應用程序添加安全控制,主要是指OAuth2。
- Spring Cloud Consul:封裝了Consul操作,consul是一個服務發現與配置工具,與Docker容器可以無縫集成。
- Spring Cloud Zookeeper:操作Zookeeper的工具包,用於使用zookeeper方式的服務注冊和發現。
- Spring Cloud Stream:數據流操作開發包,封裝了與Redis,Rabbit、Kafka等發送接收消息。
- Spring Cloud CLI:基於 Spring Boot CLI,可以讓你以命令行方式快速建立雲組件。
我們從整體上來看一下Spring Cloud各個組件如何來配套使用:
從上圖可以看出Spring Cloud各個組件相互配合,合作支持了一套完整的微服務架構。
其中Eureka負責服務的注冊與發現,很好將各服務連接起來
Hystrix 負責監控服務之間的調用情況,連續多次失敗進行熔斷保護。
Hystrix dashboard,Turbine 負責監控 Hystrix的熔斷情況,並給予圖形化的展示
Spring Cloud Config 提供了統一的配置中心服務
當配置文件發生變化的時候,Spring Cloud Bus 負責通知各服務去獲取最新的配置信息
所有對外的請求和服務,我們都通過Zuul來進行轉發,起到API網關的作用
最后我們使用Sleuth+Zipkin將所有的請求數據記錄下來,方便我們進行后續分析
Spring Cloud從設計之初就考慮了絕大多數互聯網公司架構演化所需的功能,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、數據監控等。這些功能都是以插拔的形式提供出來,方便我們系統架構演進的過程中,可以合理的選擇需要的組件進行集成,從而在架構演進的過程中會更加平滑、順利。
微服務架構是一種趨勢,Spring Cloud提供了標准化的、全站式的技術方案,意義可能會堪比當前Servlet規范的誕生,有效推進服務端軟件系統技術水平的進步。
從現在開始,我這邊會將近期研發的spring cloud微服務雲架構的搭建過程和精髓記錄下來,幫助更多有興趣研發spring cloud框架的朋友,希望可以幫助更多的好學者。大家來一起探討spring cloud架構的搭建過程及如何運用於企業項目。
