基于 Spring Cloud 的微服務(wù)架構(gòu)分析

-? ? ?前言? ? -


-? ? ?核心組件剖析? ? -
1. Eureka(注冊中心)
Eureka服務(wù)端:也稱服務(wù)注冊中心,同其他服務(wù)注冊中心一樣,支持高可用配置。如果Eureka以集群模式部署,當(dāng)集群中有分片出現(xiàn)故障時,那么Eureka就轉(zhuǎn)入自我保護(hù)模式。它允許在分片故障期間繼續(xù)提供服務(wù)的發(fā)現(xiàn)和注冊,當(dāng)故障分片恢復(fù)運行時,集群中其他分片會把它們的狀態(tài)再次同步回來Eureka客戶端:主要處理服務(wù)的注冊與發(fā)現(xiàn)。客戶端服務(wù)通過注解和參數(shù)配置的方式,嵌入在客戶端應(yīng)用程序的代碼中,在應(yīng)用程序運行時,Eureka客戶端想注冊中心注冊自身提供的服務(wù)并周期性地發(fā)送心跳來更新它的服務(wù)租約。同時,它也能從服務(wù)端查詢當(dāng)前注冊的服務(wù)信息并把它們緩存到本地并周期性地刷新服務(wù)狀態(tài)
2. Zuul(服務(wù)網(wǎng)關(guān))
3. Ribbon(負(fù)載均衡)
ribbonServerList服務(wù)端列表去輪詢訪問以達(dá)到服務(wù)均衡的作用。RibbonServerList會被DiscoveryEnabledNIWSServerList重寫,擴展成從Eureka注冊中心中獲取服務(wù)端列表。同時它也會用NIWSDiscoveryPing來取代IPing,它將職責(zé)委托給Eureka來去定服務(wù)端是否已經(jīng)啟動服務(wù)提供者只需要啟動多個服務(wù)實例并且注冊到一個注冊中心或是多個相關(guān)聯(lián)的服務(wù)注冊中心 服務(wù)消費者直接通過調(diào)用被@LoadBalanced注解修飾過的RestTemplate來實現(xiàn)面向服務(wù)的接口調(diào)用
4. Hystrix(熔斷保護(hù)器)
提供線程池不同的服務(wù)走不同的線程池,實現(xiàn)了不同服務(wù)調(diào)用的隔離,避免了服務(wù)器雪崩的問題。
5. Feign(REST轉(zhuǎn)換器)
首先,對某個接口定義了@FeignClient注解,F(xiàn)eign就會針對這個接口創(chuàng)建一個動態(tài)代理 接著調(diào)用接口的時候,本質(zhì)就是調(diào)用Feign創(chuàng)建的動態(tài)代理 Feign的動態(tài)代理會根據(jù)在接口上的@RequestMapping等注解,來動態(tài)構(gòu)造要請求的服務(wù)的地址 針對這個地址,發(fā)起請求、解析響應(yīng)
首先Ribbon會從Eureka Client里獲取到對應(yīng)的服務(wù)注冊表,也就知道了所有的服務(wù)都部署在了哪些機器上,在監(jiān)聽哪些端口 然后Ribbon就可以使用默認(rèn)的Round Robin算法,從中選擇一臺機器 Feign就會針對這臺機器,構(gòu)造并發(fā)起請求
6. Config(分布式配置)

-? ? ?注冊中心與 API 網(wǎng)關(guān)? ?-
一個獨立的開發(fā)團(tuán)隊,為保證獨立自治,以及內(nèi)部多個微服務(wù)模塊間的交互集成,最好啟用獨立的服務(wù)注冊中心實現(xiàn)服務(wù)注冊,發(fā)現(xiàn)能力。即開發(fā)團(tuán)隊內(nèi)部多個微服務(wù)模塊間的集成,不需要通過網(wǎng)關(guān),只需要通過服務(wù)注冊中心進(jìn)行集成即可。 開發(fā)團(tuán)隊需要暴露能力給外部,包括暴露能力給其它的開發(fā)團(tuán)隊,需要考慮將該API接口注冊到外部的網(wǎng)關(guān)上。在這里建議是拆分兩個獨立網(wǎng)關(guān),一個是內(nèi)部API網(wǎng)關(guān),一個是放置到DMZ區(qū)面對公網(wǎng)訪問的API網(wǎng)關(guān)。對于服務(wù)如果同時涉及到內(nèi)部和外部使用,則兩邊注冊。建議不要通過兩次網(wǎng)關(guān)去路由,一個是影響性能,一個是不方便后續(xù)問題排查。 構(gòu)建在開發(fā)團(tuán)隊之外的API網(wǎng)關(guān)必須具備負(fù)載均衡能力,可以配置多個IP地址。通過該API網(wǎng)關(guān)也最好具備和Docker容器擴展后的服務(wù)自動注冊和地址加入擴展能力。

Eureka 的競品分析:Nacos、ZooKeeper、Etcd

Eureka
Spring Cloud Eureka所選擇的是AP,采用的是去中心化結(jié)構(gòu),放棄了強一致性。也就是說Eureka集群中的各個結(jié)點都是平等的,沒有主從的概念。通過互相注冊的方式來進(jìn)行消息同步和保證高可用。并且一個Eureka Server結(jié)點掛掉了,還有其他同等的結(jié)點來提供服務(wù),并不會引發(fā)服務(wù)的中斷 Eureka只能當(dāng)注冊中心,想搞配置中心的話,還得搭配Spring Cloud Config+Spring Cloud Bus。其中后者支持Rabbiimq和Kafka兩種模式。 使用Java語言來開發(fā)的,并且也是Spring Cloud的子項目,所以可以直接通過引入jar包的方式來集成Eureka,這點非常方便
1. ZooKeeper
Apache Zookeeper所選擇的是CP,也就是放棄了高可用性。Zookeeper集群在進(jìn)行消息同步的時候,必須有一半以上結(jié)點完成了同步才會返回;而當(dāng)Master結(jié)點掛了或者集群中有過半的結(jié)點不能工作了,此時就會觸發(fā)故障恢復(fù),重新進(jìn)行Master選舉。在這個過程中,整個Zookeeper集群無法對外提供服務(wù),從而實去了A(可用性) 為了達(dá)到C,Zookeeper采用的是自己的ZAB協(xié)議。
2. Nacos
Nacos一大特性是即支持CP,也支持AP。可以根據(jù)需要靈活選擇。 Nacos除了注冊中心之外,也能充當(dāng)配置中心的作用。且配置中心可以按照namespace,group等維度來進(jìn)行數(shù)據(jù)隔離,來達(dá)到不同環(huán)境之間配置隔離的功能。
值得一提的是,Nacos作為配置中心的持久化機制可以依賴于 Mysql來完成(默認(rèn)依賴于內(nèi)置數(shù)據(jù)庫)。只需要將Nacos目錄下的sql腳本放到mysql中執(zhí)行(會生成11個表),然后在nacos配置文件里面配一下mysql的賬號密碼即可。這樣使用mysql作為數(shù)據(jù)源的方式相比于nacos內(nèi)置數(shù)據(jù)庫來說更容易管理
3. Consul
Consul是用Go語言編寫的,所以無法像Eureka那樣直接引入jar包就能集成,它還需要去服務(wù)器中進(jìn)行額外的安裝。 除了注冊中心的功能之外,Consul還能起到配置中心的作用。
Consul它保證的是CP,使用raft協(xié)議,要求必須有過半的結(jié)點都寫入成功才算是注冊成功了,并且它也有Master和Follower的概念,在Master掛掉后,也需要自己內(nèi)部進(jìn)行
4. Etcd(待續(xù))

-? ? ?一圖詳解Spring Cloud全家桶? ? -

Spring Cloud Config:配置管理工具包,讓你可以把配置放到遠(yuǎn)程服務(wù)器,集中化管理集群配置,目前支持本地存儲、Git 以及 Subversion。 Spring Cloud Bus:事件、消息總線,用于在集群(例如,配置變化事件)中傳播狀態(tài)變化,可與 Spring Cloud Config 聯(lián)合實現(xiàn)熱部署。 Eureka:云端服務(wù)發(fā)現(xiàn),一個基于 REST 的服務(wù),用于定位服務(wù),以實現(xiàn)云端中間層服務(wù)發(fā)現(xiàn)和故障轉(zhuǎn)移。Hystrix:熔斷器,容錯管理工具,旨在通過熔斷機制控制服務(wù)和第三方庫的節(jié)點,從而對延遲和故障提供更強大的容錯能力。Zuul:Zuul 是在云平臺上提供動態(tài)路由,監(jiān)控,彈性,安全等邊緣服務(wù)的框架。Zuul 相當(dāng)于是設(shè)備和 Netflix 流應(yīng)用的 Web 網(wǎng)站后端所有請求的前門。Archaius:配置管理 API,包含一系列配置管理 API,提供動態(tài)類型化屬性、線程安全配置操作、輪詢框架、回調(diào)機制等功能。 Consul:封裝了 Consul 操作,Consul 是一個服務(wù)發(fā)現(xiàn)與配置工具,與 Docker 容器可以無縫集成。 Spring Cloud for Cloud Foundry:通過 Oauth2 協(xié)議綁定服務(wù)到 CloudFoundry,CloudFoundry 是 VMware 推出的開源 PaaS 云平臺。 Spring Cloud Sleuth:日志收集工具包,封裝了 Dapper 和 log-based 追蹤以及 Zipkin 和 HTrace 操作,為 Spring Cloud 應(yīng)用實現(xiàn)了一種分布式追蹤解決方案。 Spring Cloud Data Flow:大數(shù)據(jù)操作工具,作為 Spring XD 的替代產(chǎn)品,它是一個混合計算模型,結(jié)合了流數(shù)據(jù)與批量數(shù)據(jù)的處理方式。 Spring Cloud Security:基于 Spring Security 的安全工具包,為你的應(yīng)用程序添加安全控制。 Spring Cloud Zookeeper:操作 Zookeeper 的工具包,用于使用 Zookeeper 方式的服務(wù)發(fā)現(xiàn)和配置管理。 Spring Cloud Stream:數(shù)據(jù)流操作開發(fā)包,封裝了與 Redis、Rabbit、Kafka 等發(fā)送接收消息。 Spring Cloud CLI:基于 Spring Boot CLI,可以讓你以命令行方式快速建立云組件。 Ribbon:提供云端負(fù)載均衡,有多種負(fù)載均衡策略可供選擇,可配合服務(wù)發(fā)現(xiàn)和斷路器使用。Turbine:Turbine 是聚合服務(wù)器發(fā)送事件流數(shù)據(jù)的一個工具,用來監(jiān)控集群下 Hystrix 的 Metrics 情況。 Feign:Feign 是一種聲明式、模板化的 HTTP 客戶端。Spring Cloud Task:提供云端計劃任務(wù)管理、任務(wù)調(diào)度。 Spring Cloud Connectors:便于云端應(yīng)用程序在各種 PaaS 平臺連接到后端,如:數(shù)據(jù)庫和消息代理服務(wù)。 Spring Cloud Cluster:提供 Leadership 選舉,如:Zookeeper,Redis,Hazelcast,Consul 等常見狀態(tài)模式的抽象和實現(xiàn)。 Spring Cloud Starters:Spring Boot 式的啟動項目,為 Spring Cloud 提供開箱即用的依賴管理。
作者:Alex
來源:
blog.caogo.cn/2021/06/20/%E5%9F%BA%E4%BA%8ESpring-Cloud%E7%9A%84%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E5%88%86%E6%9E%90/

評論
圖片
表情
