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

-? ? ?前言? ? -


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

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

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

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

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

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

評論
圖片
表情
