天天看點

剖析 | 高可擴充性、高性能、生産級的 SOFARPC 架構

小螞蟻說:

SOFA(Scalable Open Financial Architecture)是螞蟻金服自主研發的金融級分布式中間件,包含了建構金融級雲原生架構所需的各個元件,是在金融場景裡錘煉出來的最佳實踐。

本篇文章整理自《剖析 | SOFARPC 架構》系列文章,由SOFA 團隊和源碼愛好者們共同出品,項目代号:<SOFA:RPCLab/>。由于原文 系列篇幅較長,小螞蟻為大家節選了部分内容,想要了解更多有關 SOFARPC 架構内容,可通過文中連結跳轉擷取~

相關閱讀:

開源 | 螞蟻金服啟動分布式中間件開源計劃,用于快速建構金融級雲原生架構 開源 | 螞蟻金服分布式中間件開源第二彈:豐富微服務架構體系

目錄

一、前言

二、SOFARPC 總體設計與擴充機制

三、SOFARPC 鍊路追蹤

四、SOFARPC 連接配接管理與心跳

五、SOFARPC 同步異步實作

六、SOFARPC 線程模型

七、SOFARPC 單機故障剔除

八、SOFARPC 泛化調用實作

九、SOFARPC 資料透傳

十、SOFARPC 優雅關閉

十一、SOFARPC 路由實作

十二、SOFARPC 注解支援

十三、《剖析 | SOFARPC 架構》系列曆史文章

SOFA(Scalable Open Financial Architecture)是螞蟻金服自主研發的金融級分布式中間件,專注為金融使用者提供安全、穩定、可靠、高效、靈活的基礎架構能力,幫助金融使用者解決傳統集中式架構轉型的困難,打造大規模高可用的分布式系統架構,加快金融網際網路+推進的速度。

RPC 架構作為分布式技術的基石,在分布式和微服務環境下,扮演着非常重要的角色。RPC 的概念術語在上世紀 80 年代由 Bruce Jay Nelson 提出,他在論文 "Implementing Remote Procedure Calls" 中提到3點:簡單、高效和通用,并認為 RPC 架構應包含 User、User-stub、RPC-Runtime、Server-stub、Server 5個部分。

SOFARPC 螞蟻金服開源的一個高可擴充性、高性能、生産級的 Java RPC 架構,是螞蟻金服服務化架構的基石。緻力于簡化應用之間的 RPC 調用,為應用提供友善透明、穩定高效的點對點遠端服務調用方案。SOFARPC 提供了負載均衡,流量轉發,鍊路追蹤,鍊路資料透傳,故障剔除等基礎能力。

二、SOFARPC 總體設計與擴充機制

了解更多 SOFARPC 總體設計與擴充機制内容,點選連結:

https://mp.weixin.qq.com/s/ZKUmmFT0NWEAvba2MJiJfA

總體設計

從下圖目前的 RPC 架構結構圖來看,core 和 core-impl 是核心的功能,包含 API 和一些擴充機制,extension-impl 中,則包含了不同的實作和擴充,比如對 http、rest、對 metrics,以及其他注冊中心的內建和擴充。

剖析 | 高可擴充性、高性能、生産級的 SOFARPC 架構

擴充機制

為了 RPC 各個環節都有充足的可擴充性,提供 SPI 的能力,所有内部的實作和第三方實作都是絕對平等的,我們實作了一套自己的 SPI 機制。基于這套擴充加載機制,我們可以實作自定義擴充點,實作 SOFARPC 内部及第三方的自由擴充。

三、SOFARPC 鍊路追蹤

了解更多 SOFARPC 鍊路追蹤技術内容,點選連結:

https://mp.weixin.qq.com/s/JNuibHtkBH3YsGS5m_hbmw

SOFARPC 的依靠內建 SOFATrace 來實作鍊路追蹤技術,SOFARPC 作為公共元件在整個鍊路追蹤技術系統中負責資料埋點工作。依賴 SOFARPC 自身強大的可擴充性設計,如微核心設計和事件總線設計,使得 SOFARPC 在不破壞開發封閉原則的基礎上快速實作了鍊路追蹤埋點工作。 SOFARPC 的鍊路追蹤技術具有以下特點:

1、作為公共基礎的通訊元件,SOFARPC 的鍊路追蹤埋點對業務代碼實作零侵入。

2、采用日志資料異步重新整理機制,不影響正常業務性能。

3、采用了自适應采樣設計,巧妙平衡了資料采集和性能的問題。

4、支援資料上報 zipkin, 通過與 zipkin 結合可以快速建構一個完整的連續追蹤系統。

5、解決了異步線程鍊路調用資料問題。

6、采用了 OpenTracing 規範,是以可以和其他鍊路追蹤手機和展示的技術架構快速整合。

四、SOFARPC 連接配接管理與心跳

了解更多 SOFARPC 連接配接管理與心跳内容,點選連結:

https://mp.weixin.qq.com/s/2aZz9Slxh8XlhU5U1993uw

在 RPC 調用過程中,我們經常會和多個服務端進行遠端調用,如果在每次調用的時候,都進行 TCP 連接配接,會對 RPC 的性能造成比較大的影響。是以,實際的場景中,我們經常要對連接配接進行管理和保持。

SOFARPC 應用心跳包以及斷線重連實作,結合系統 tcp-keepalive 機制,可以實作對 RPC 連接配接的管理和保持。

了解更多 SOFARPC 同步異步實作内容,點選連結:

https://mp.weixin.qq.com/s/446N2dA0gA17EO0D5wteNw

SOFARPC 以基于 Netty 實作的網絡通信架構 SOFABolt 用作遠端通信架構,使用者不用關心如何實作私有協定的細節,直接使用内置 RPC 通信協定,啟動用戶端與服務端,同時注冊使用者請求處理器即可完成遠端調用。

SOFARPC 服務調用提供同步 Sync、異步 Future、回調 Callback 以及單向 Oneway 四種調用類型:

1、在 Sync 上,支援方法級别,接口級别,方法級别的逾時設定。調用會阻塞請求線程,待響應傳回後才能進行下一個請求。這是最常用的一種通信模型。

2、在 Callback 上,支援方法級别,接口級别,線程級别的回調設定。是真正的異步調用,永遠不會阻塞線程,結果處理是在異步線程裡執行。

3、在 Future 上,對使用者提供了統一的 API 操作。支援原生 Future 和自定義 Future。使用者 可以直接在目前線程上下文擷取。在調用過程不會阻塞線程,但擷取結果的過程會阻塞線程。

4、在 Oneway 上,設定簡單。直接支援。為了防止應用出現類型轉換異常,根據傳回值設定不同的預設值。不關心響應,請求線程不會被阻塞,但使用時需要注意控制調用節奏,防止壓垮接收方。

六、SOFARPC 線程模型

了解更多 SOFARPC 線程模型内容,點選連結:

https://mp.weixin.qq.com/s/yEu1RedULcljHsyY--F0Ww

對于 SOFARPC 來說,和底層的 SOFABolt 一起,在使用 Netty 的 Reactor 主從模型的基礎上,支援業務線程池的選擇。

剖析 | 高可擴充性、高性能、生産級的 SOFARPC 架構

目前 SOFARPC 服務端的線程模型在綜合考慮,和一些曆史壓測的資料支撐的情況下,我們選了主從線程模型,并對序列化和業務代碼執行使用一個 BizThreadPool(允許對線程池的核心線程數,隊列等進行調整),或者自定義的線程池。将序列化,反序列化等這些耗時的操作全部放在了Biz線程池中,這樣可以有效地提高系統的整體吞吐量。

七、SOFARPC 單機故障剔除

了解更多 SOFARPC 單機故障剔除内容,點選連結:

https://mp.weixin.qq.com/s/WusXmhMnsvQ1tQh5wiCyDw

SOFARPC 5.3.0 支援故障剔除功能,能夠将存在長連接配接但因為處于亞健康狀态的服務進行降級,使得用戶端的請求更多地指向健康節點。當這些異常節點恢複正常後,故障剔除功能會對該節點進行恢複,使得用戶端請求逐漸将流量分發到該節點。這種政策類似軟負責,所有的邏輯都在用戶端執行。

SOFARPC 的核心設計和事件總線設計,能夠在不破壞開發封閉性的情況下輕松引入故障剔除功能。FaultToleranceModule 包含了兩部分:

1、事件訂閱,負責訂閱同步和異步結果事件,作為入口統計手機 RPC 調用資訊。

2、調節器。根據收集的資訊,以及内置的一些政策完成服務的降級和恢複操作。其中包含了資訊收集器、計算政策、度量政策、降級政策和恢複政策。

了解更多 SOFARPC 泛化調用實作内容,點選連結:

https://mp.weixin.qq.com/s/li1Ob7O9R1AyQkwq7xAjDg

在 RPC 調用中,用戶端需要加載服務端提供的接口定義類衍生了泛化調用的需求,一個成熟的、功能完善的 RPC 架構一般都會支援泛化調用。

當用戶端因為某種原因無法得到服務提供方的接口 jar 包時,或者是用戶端是一個比較通用的系統,并不想依賴每個服務提供方提供的 facade 接口,但是又需要進行調用,那麼此時就需要進行泛化調用。

SOFARPC 的泛化設計與實作

1、設計目标是:服務端無需感覺是否泛化,一切都是由用戶端進行處理。

帶來的好處是:應用如果想要支援泛化,不需要改動服務端,隻需要修改用戶端即可。這是和其他 RPC 架構泛化調用最大的差別。

2、實作方式:通過 SOFA-Hessian 序列化支援泛化序列化,在進行泛化調用時,bolt 會根據上下文的序列化标記來使用對應的序列化器,SOFA-Hessian 特有的泛化序列化器可将 GenericObject 對象序列化成目标對象的位元組流,服務端按正常反序列化即可。SOFA-Hessian 特有的泛化反序列化器也可将目标傳回值反序列化成 GenericObject 等對象。

了解更多 SOFARPC 資料透傳内容,點選連結:

https://mp.weixin.qq.com/s/WzhzJtawjRf-jC1jWMrVuw

在 RPC 調用中,資料的傳遞是通過接口方法參數來傳遞的,需要接口方定義好一些參數允許傳遞才可以。資料透傳功能,就是指資料不需要以作為方法參數的形式在調用鍊路中進行傳遞,而是直接存儲到調用上下文中,之後通過 RPC 的内置對象,進行傳遞,調用雙端可從上下文中擷取資料而不需要去關注資料的傳輸過程。SOFARPC 提供的資料透傳支援請求資料透傳(用戶端向服務端)和響應資料透傳(服務端向用戶端)。

了解更多 SOFARPC 優雅關閉内容,點選連結:

https://mp.weixin.qq.com/s/7hs2eVRYQOo_XZrxGtbQSA

在微服務架構中,假如應用沒有支援優雅停機,則會帶來譬如資料丢失,交易中斷、檔案損壞以及服務未下線等情況。微服務的優雅停機需要遵循"登出釋出服務 → 通知登出服務 → 更新服務清單 → 開啟請求屏蔽 → 調用銷毀業務服務 → 檢查所有請求是否完成 → 逾時強制停機"應用服務停機流程。

SOFARPC 提供服務端/用戶端優雅關閉功能特性,用來解決 kill PID,應用意外自動退出譬如 System.exit() 退出 JVM,使用腳本或指令方式停止應用等使用場景,避免服務版本疊代上線人工幹預的工作量,提高微服務架構的服務高可靠性。

在設計優雅關閉的時候,可以考慮按照如下幾個約定來進行實作。

(1) 應用能夠支援優雅停機

(2) 優先登出注冊中心注冊的服務執行個體

(3) 待停機的服務應用的接入點标記拒絕服務

(4) 上遊服務支援故障轉移因優雅停機而拒絕的服務

(5) 根據實際業務場景提供适當的停機接口。

了解更多 SOFARPC 路由實作内容,點選連結:

https://mp.weixin.qq.com/s/kjAYRxLwiSgFAjqJU-z41Q

RPC 架構需要創造一種調用遠端服務如同調用本地般的體驗,是以在實作一個基于 RPC 架構的微服務架構的系統時,服務消費者(用戶端)往往隻需要知道服務端提供了哪些接口和方法,并不需要知道服務具體由哪些 IP 在提供。RPC 架構本身的服務發現和路由尋址功能解決了如何知道目标位址的問題,該過程對于 RPC 用戶端調用方來說應該是完全透明的。整個路由尋址過程的階段如下圖所示。

剖析 | 高可擴充性、高性能、生産級的 SOFARPC 架構

在這個過程中,RPC 架構需要接入注冊中心來完成服務發現和路由尋址的功能。同時,在應用大規模請求時,微服務系統還需要對請求服務叢集化,同時通過負載均衡來達到降低通路壓力的效果。

了解更多 SOFARPC 注解支援内容,點選連結:

https://mp.weixin.qq.com/s/ccOHOWIUb-TQLPToX2y5kw

通過 XML 的方式去配置 SOFA 的 JVM 服務和引用非常簡潔,但是多了一定的編碼工作量。

是以,除了通過 XML 方式釋出 JVM 服務和引用之外,SOFA 還提供了 Annotation 的方式來釋出和引用 JVM 服務。

@SofaService

 注解省去了

<sofa:service>

 聲明,但 bean 的定義還是必須要有的。

SOFA 實際上是注冊了一個BeanPostProcessor 來處理

@SofaService

 和 

@SofaReference

注解。需要釋出引用的對象屬于目前 bean 的執行個體變量,使用 xml 的方式進行服務釋出和引用,可以直接通過 Bean 生命周期的 

InitializingBean#afterPropertiesSet

 方法進行擴充。在工程中注解掃描是一個對所有 bean 的操作,隻能通過實作 spring 的 beanpostprocessor 這個接口,另外有些屬性可能在釋出時需要用到。

是以使用注解的方式進行服務釋出和引用,分别基于 Bean 生命周期的 

BeanPostProcessor#postProcessAfterInitialization

#postProcessBeforeInitialization

方法進行擴充。

十三、《剖析 | SOFARPC架構》系列曆史文章

  • 【剖析 | SOFARPC 架構】之總體設計與擴充機制

連結:https://mp.weixin.qq.com/s/ZKUmmFT0NWEAvba2MJiJfA

  • 【剖析 | SOFARPC 架構】系列之鍊路追蹤剖析

連結:https://mp.weixin.qq.com/s/JNuibHtkBH3YsGS5m_hbmw

  • 【剖析 | SOFARPC 架構】系列之連接配接管理與心跳剖析

連結:https://mp.weixin.qq.com/s/2aZz9Slxh8XlhU5U1993uw

  • 【剖析 | SOFARPC 架構】系列之 SOFARPC 同步異步實作剖析

連結:https://mp.weixin.qq.com/s/446N2dA0gA17EO0D5wteNw

  • 【剖析 | SOFARPC 架構】系列之 SOFARPC 線程模型剖析

連結:https://mp.weixin.qq.com/s/yEu1RedULcljHsyY--F0Ww

  • 【剖析 | SOFARPC 架構】系列之 SOFARPC 單機故障剔除剖析

連結:https://mp.weixin.qq.com/s/WusXmhMnsvQ1tQh5wiCyDw

  • 【剖析 | SOFARPC 架構】系列之 SOFARPC 泛化調用實作剖析

連結:https://mp.weixin.qq.com/s/li1Ob7O9R1AyQkwq7xAjDg

  • 【剖析 | SOFARPC 架構】系列之 SOFARPC 資料透傳剖析

連結:https://mp.weixin.qq.com/s/WzhzJtawjRf-jC1jWMrVuw

  • 【剖析 | SOFARPC 架構】系列之 SOFARPC 優雅關閉剖析

連結:https://mp.weixin.qq.com/s/7hs2eVRYQOo_XZrxGtbQSA

  • 【剖析 | SOFARPC 架構】系列之 SOFARPC 路由實作剖析

連結:https://mp.weixin.qq.com/s/kjAYRxLwiSgFAjqJU-z41Q

  • 【剖析 | SOFARPC 架構】系列之 SOFARPC 注解支援剖析

連結:https://mp.weixin.qq.com/s/ccOHOWIUb-TQLPToX2y5kw

— END —