SpringCloud Alibaba體系一覽
Spring Cloud Alibaba 致力于提供微服務(wù)開發(fā)的一站式解決方案。包含開發(fā)分布式應(yīng)用微服務(wù)的必需組件,方便開發(fā)者通過 Spring Cloud 編程模型輕松使用這些組件來開發(fā)分布式應(yīng)用服務(wù)。本文基于官方文檔,對(duì)整個(gè)體系做了整體梳理。
SpringCloud Alibaba體系一覽
注冊(cè)中心-Nacos
Nacos(Dynamic Naming and Configuration Service):一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái)。
Nacos就是注冊(cè)中心+配置中心的組合 --> 等價(jià)于 Nacos = Eureka+Config +Bus
注冊(cè)中心對(duì)比
CAP原則:Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區(qū)容錯(cuò)性)。分布式系統(tǒng)要么滿足CA,要么CP,要么AP。無法同時(shí)滿足CAP。
Nacos支持AP和CP切換。何時(shí)選擇使用何種模式?
- 如果不需要存儲(chǔ)服務(wù)級(jí)別的信息且服務(wù)實(shí)例是通過nacos-chient注冊(cè),并能夠保持心跳上報(bào),那么就可以選擇AP模式。 當(dāng)前主流的服務(wù)如Spring cloud 和 Dubbo 服務(wù),都適用于AP模式。 AP模式為了服務(wù)的可能性而減弱了一致性,因此AP模式下只支持注冊(cè)臨時(shí)實(shí)例。
- 如果需要在服務(wù)級(jí)別編輯或者存儲(chǔ)配置信息,那么CP是必須。K8S服務(wù)和DNS服務(wù)則適用于CP模式。 CP模式下則支持注冊(cè)持久化實(shí)例,此時(shí)則是以 Raft協(xié)議為集群運(yùn)行模式,該模式下注冊(cè)實(shí)例之前必須先注冊(cè)服務(wù),如果服務(wù)不存在,則會(huì)返回錯(cuò)識(shí)。
服務(wù)調(diào)用-OpenFeign
(1)Feign
Feign是Spring Cloud組件中的一個(gè)輕量級(jí)RESTful的HTTP服務(wù)客戶端
Feign內(nèi)置了Ribbon,用來做客戶端負(fù)載均衡,去調(diào)用服務(wù)注冊(cè)中心的服務(wù)。 Feign的使用方式是:使用Feign的注解定義接口,調(diào)用這個(gè)接口,就可以調(diào)用服務(wù)注冊(cè)中心的服務(wù)
依賴:
spring-cloud-starter-feign
(2)OpenFeign
OpenFeign是Spring Cloud在Feign的基礎(chǔ)上支持了SpringMVC的注解,如@RequesMapping等等。
OpenFeign的@Feignclient可以解析SpringMvc的@RequestMapping注解下的接口,并通過動(dòng)態(tài)代理的方式產(chǎn)生實(shí)現(xiàn)類,實(shí)現(xiàn)類中做負(fù)載均衡并調(diào)用其他服務(wù)。
依賴:
spring-cloud-starter-openfeign
負(fù)載均衡-LoadBalancer
從Spring Cloud 2020版本開始,Spring Cloud移除了 Ribbon,使用Spring Cloud Loadbalancer作為客戶端的負(fù)載均衡組件。其使用方式與Ribbon基本兼容,可以從Ribbon進(jìn)行平滑過渡。
兩種負(fù)載均衡的客戶端:
(1)RestTemplate
RestTemplate是Spring提供的用于訪問Rest服務(wù)的客戶端,RestTemplate提供了多種便捷訪問遠(yuǎn)程Http服務(wù)的方法,能夠大大提高客戶端的編寫效率。默認(rèn)情況下,RestTemplate默認(rèn)依賴jdk的HTTP連接工具。
(2)WebClient
WebClient是從Spring WebFlux 5.0版本開始提供的一個(gè)非阻塞的基于響應(yīng)式編程的進(jìn)行Http請(qǐng)求的客戶端工具。它的響應(yīng)式編程的基于Reactor的。WebClient中提供了標(biāo)準(zhǔn)Http請(qǐng)求方式對(duì)應(yīng)的get、post、put、delete等方法,可以用來發(fā)起相應(yīng)的請(qǐng)求
以RestTemplate配置LoadBalaced為例,二者對(duì)比:
- 都是使用LoadBalancerInterceptor作為RestTemplate的攔截器。
- 在LoadBalancerInterceptor中持有LoadBalancerClient對(duì)象,在Spring Cloud LoadBalancer中是BlockingLoadBalancerClient,在Spring Cloud Ribbon中是RibbonLoadBalancerClient。
- LoadBalancerClient中持有NamedContextFactory對(duì)象,在Spring Cloud LoadBalancer中是LoadBalancerClientFactory,在Spring Cloud Ribbon中是SpringClientFactory。
- Spring Cloud LoadBalancer通過實(shí)現(xiàn)ReactorServiceInstanceLoadBalancer接口自定義負(fù)載均衡器,Spring Cloud Ribbon通過實(shí)現(xiàn)ILoadBalancer接口。
- Spring Cloud LoadBalancer通過注解@LoadBalancerClient或@LoadBalancerClients實(shí)現(xiàn)自定義配置,Spring Cloud Ribbon也可以使用這兩個(gè)注解,另外還可以使用@RibbonClient或@RibbonClients。
- Spring Cloud LoadBalancer支持響應(yīng)式編程負(fù)載均衡,即結(jié)合Spring Web Flux使用,Spring Cloud Ribbon是不支持的。
- 目前Ribbon提供的負(fù)載均衡算法實(shí)現(xiàn)較Spring Cloud LoadBalancer更豐富。
微服務(wù)網(wǎng)關(guān)-Gateway
Gateway是在Spring生態(tài)系統(tǒng)之上構(gòu)建的API網(wǎng)關(guān)服務(wù),基于Spring 5,Spring Boot 2和Project Reactor等技術(shù)。Gateway旨在提供一種簡(jiǎn)單而有效的方式來對(duì)API進(jìn)行路由,以及提供一些強(qiáng)大的過濾器功能,例如:熔斷、限流、重試等。
Spring Cloud Gateway是Spring Cloud的一個(gè)全新項(xiàng)目,基于Spring 5.0+Spring Boot 2.0和 Project Reactor等技術(shù)開發(fā)的網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供─種簡(jiǎn)單有效的統(tǒng)一的API路由管理方式。
SpringCloud Gateway作為 Spring Cloud 生態(tài)系統(tǒng)中的網(wǎng)關(guān),目標(biāo)是替代Zuul,在Spring Cloud 2.0以上版本中,沒有對(duì)新版本的Zuul 2.0以上最新高性能版本進(jìn)行集成,仍然還是使用的Zuul 1.x非Reactor模式的老版本。而為了提升網(wǎng)關(guān)的性能,SpringCloud Gateway是基于WebFlux框架實(shí)現(xiàn)的,而WebFlux框架底層則使用了高性能的Reactor模式通信框架Netty。
Spring Cloud Gateway的目標(biāo)提供統(tǒng)一的路由方式且基于Filter鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全,監(jiān)控/指標(biāo),和限流。
SpringCloud Gateway使用的Webflux中的reactor-netty響應(yīng)式編程組件,底層使用了Netty通訊框架。
微服務(wù)限流-Sentinel
Sentinel 以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性。
Sentinel 具有以下特征:
- 豐富的應(yīng)用場(chǎng)景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場(chǎng)景,例如秒殺(即突發(fā)流量控制在系統(tǒng)容量可以承受的范圍)、消息削峰填谷、集群流量控制、實(shí)時(shí)熔斷下游不可用應(yīng)用等。
- 完備的實(shí)時(shí)監(jiān)控:Sentinel 同時(shí)提供實(shí)時(shí)的監(jiān)控功能。您可以在控制臺(tái)中看到接入應(yīng)用的單臺(tái)機(jī)器秒級(jí)數(shù)據(jù),甚至 500 臺(tái)以下規(guī)模的集群的匯總運(yùn)行情況。
- 廣泛的開源生態(tài):Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相應(yīng)的依賴并進(jìn)行簡(jiǎn)單的配置即可快速地接入 Sentinel。同時(shí) Sentinel 提供 Java/Go/C++ 等多語言的原生實(shí)現(xiàn)。
- 完善的 SPI 擴(kuò)展機(jī)制:Sentinel 提供簡(jiǎn)單易用、完善的 SPI 擴(kuò)展接口。您可以通過實(shí)現(xiàn)擴(kuò)展接口來快速地定制邏輯。例如定制規(guī)則管理、適配動(dòng)態(tài)數(shù)據(jù)源等。
Sentinel 的主要特性
分布式事務(wù)-seata
Seata 是一款開源的分布式事務(wù)解決方案,致力于提供高性能和簡(jiǎn)單易用的分布式事務(wù)服務(wù)。Seata 將為用戶提供了 AT、TCC、SAGA 和 XA 事務(wù)模式,為用戶打造一站式的分布式解決方案。
一個(gè)典型的分布式事務(wù)過程:
分布式事務(wù)處理過程可以概括為:1 ID + 3組件模型
Transaction lD XID :
- 全局唯一的事務(wù)ID
三組件概念 (opens new window)
- Transaction Coordinator (TC):事務(wù)協(xié)調(diào)器,維護(hù)全局事務(wù)的運(yùn)行狀態(tài),負(fù)責(zé)協(xié)調(diào)并驅(qū)動(dòng)全局事務(wù)的提交或回滾;
- Transaction Manager (TM):控制全局事務(wù)的邊界,負(fù)責(zé)開啟一個(gè)全局事務(wù),并最終發(fā)起全局提交或全局回滾的決議;
- Resource Manager (RM):控制分支事務(wù),負(fù)責(zé)分支注冊(cè)、狀態(tài)匯報(bào),并接收事務(wù)協(xié)調(diào)器的指令,驅(qū)動(dòng)分支(本地)事務(wù)的提交和回滾
處理過程:
- TM 向 TC 申請(qǐng)開啟一個(gè)全局事務(wù),全局事務(wù)創(chuàng)建成功并生成一個(gè)全局唯一的XID;
- XID 在微服務(wù)調(diào)用鏈路的上下文中傳播;
- RM 向 TC 注冊(cè)分支事務(wù),將其納入XID對(duì)應(yīng)全局事務(wù)的管轄;
- TM 向 TC 發(fā)起針對(duì)XID的全局提交或回滾決議;
- TC 調(diào)度 XID 下管轄的全部分支事務(wù)完成提交或回滾請(qǐng)求。
分布式鏈路追蹤-Skywalking
SkyWalking是一個(gè)開源APM系統(tǒng),包含了云原生架構(gòu)下的分布式系統(tǒng)的監(jiān)控、跟蹤、診斷功能。
SkyWalking支持dubbo,SpringCloud,SpringBoot集成,代碼無侵入,通信方式采用GRPC,性能較好,實(shí)現(xiàn)方式是java探針,支持告警,支持JVM監(jiān)控,支持全局調(diào)用統(tǒng)計(jì)等等,功能較完善。
Skywalking架構(gòu)
- 上面的Agent:負(fù)責(zé)收集日志數(shù)據(jù),并且傳遞給中間的OAP服務(wù)器
- 中間的OAP:負(fù)責(zé)接收 Agent 發(fā)送的 Tracing 和Metric的數(shù)據(jù)信息,然后進(jìn)行分析(Analysis Core) ,存儲(chǔ)到外部存儲(chǔ)器( Storage ),最終提供查詢( Query )功能。
- 左面的UI:負(fù)責(zé)提供web控制臺(tái),查看鏈路,查看各種指標(biāo),性能等等。
- 右面Storage:負(fù)責(zé)數(shù)據(jù)的存儲(chǔ),支持多種存儲(chǔ)類型。
大致流程就是Agent負(fù)責(zé)收集日志傳輸數(shù)據(jù),通過GRPC的方式傳遞給OAP進(jìn)行分析并且存儲(chǔ)到數(shù)據(jù)庫中,最終通過UI界面將分析的統(tǒng)計(jì)報(bào)表、服務(wù)依賴、拓?fù)潢P(guān)系圖展示出來。
附錄
組件版本關(guān)系