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

-? ? ?前言? ? -


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

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

Eureka 的競(jìng)品分析:Nacos、ZooKeeper、Etcd

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

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

Spring Cloud Config:配置管理工具包,讓你可以把配置放到遠(yuǎn)程服務(wù)器,集中化管理集群配置,目前支持本地存儲(chǔ)、Git 以及 Subversion。 Spring Cloud Bus:事件、消息總線,用于在集群(例如,配置變化事件)中傳播狀態(tài)變化,可與 Spring Cloud Config 聯(lián)合實(shí)現(xiàn)熱部署。 Eureka:云端服務(wù)發(fā)現(xiàn),一個(gè)基于 REST 的服務(wù),用于定位服務(wù),以實(shí)現(xiàn)云端中間層服務(wù)發(fā)現(xiàn)和故障轉(zhuǎn)移。Hystrix:熔斷器,容錯(cuò)管理工具,旨在通過熔斷機(jī)制控制服務(wù)和第三方庫的節(jié)點(diǎn),從而對(duì)延遲和故障提供更強(qiáng)大的容錯(cuò)能力。Zuul:Zuul 是在云平臺(tái)上提供動(dòng)態(tài)路由,監(jiān)控,彈性,安全等邊緣服務(wù)的框架。Zuul 相當(dāng)于是設(shè)備和 Netflix 流應(yīng)用的 Web 網(wǎng)站后端所有請(qǐng)求的前門。Archaius:配置管理 API,包含一系列配置管理 API,提供動(dòng)態(tài)類型化屬性、線程安全配置操作、輪詢框架、回調(diào)機(jī)制等功能。 Consul:封裝了 Consul 操作,Consul 是一個(gè)服務(wù)發(fā)現(xiàn)與配置工具,與 Docker 容器可以無縫集成。 Spring Cloud for Cloud Foundry:通過 Oauth2 協(xié)議綁定服務(wù)到 CloudFoundry,CloudFoundry 是 VMware 推出的開源 PaaS 云平臺(tái)。 Spring Cloud Sleuth:日志收集工具包,封裝了 Dapper 和 log-based 追蹤以及 Zipkin 和 HTrace 操作,為 Spring Cloud 應(yīng)用實(shí)現(xiàn)了一種分布式追蹤解決方案。 Spring Cloud Data Flow:大數(shù)據(jù)操作工具,作為 Spring XD 的替代產(chǎn)品,它是一個(gè)混合計(jì)算模型,結(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ù)的一個(gè)工具,用來監(jiān)控集群下 Hystrix 的 Metrics 情況。 Feign:Feign 是一種聲明式、模板化的 HTTP 客戶端。Spring Cloud Task:提供云端計(jì)劃任務(wù)管理、任務(wù)調(diào)度。 Spring Cloud Connectors:便于云端應(yīng)用程序在各種 PaaS 平臺(tái)連接到后端,如:數(shù)據(jù)庫和消息代理服務(wù)。 Spring Cloud Cluster:提供 Leadership 選舉,如:Zookeeper,Redis,Hazelcast,Consul 等常見狀態(tài)模式的抽象和實(shí)現(xiàn)。 Spring Cloud Starters:Spring Boot 式的啟動(dòng)項(xiàng)目,為 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/
評(píng)論
圖片
表情
