天天看點

如何設計實作一個Dubbo RPC架構

作者:老吾頻道
如何設計實作一個Dubbo RPC架構

作為一名從事分布式服務端開發的工程師,随着技術底層認知的加深,不可避免地會思考:一個RPC架構(例如Dubbo)需要考慮哪些問題,以及如何解決這些問題。是以,本文将從實作的角度對RPC通信架構進行分析。

如何設計實作一個Dubbo RPC架構

01 RPC 架構簡介

在單體應用時代,隻需要内外網通信,并沒有服務間通信的需求。随着單機服務性能下降,我們進入了多服務分布式的時代,這時RPC架構才應運而生。

RPC(Remote Procedure Call),字面意思是遠端過程調用,主要解決服務間的連接配接和資料互動,但除了通信和資料互動,為了适應分布式架構/微服務架構的設計,一個好的RPC架構設計還需要解決以下問題:

  • 系統完整性:RPC架構需要提供完整的服務治理方案,包括服務的注冊、發現、負載均衡和容錯等,以確定系統在運作過程中的穩定性和可靠性。
  • 系統可擴充性:RPC架構需要支援快速的服務擴充,以應對系統負載的變化,同時需要提供靈活的服務調用方式,使得不同語言、不同技術棧的服務能夠無縫調用。
  • 系統性能:RPC架構需要保證高性能,包括網絡傳輸性能、序列化性能、服務調用性能等。
  • 系統可跟蹤性:RPC架構需要提供良好的跟蹤和監控方案,以便于排查和定位系統中出現的問題。
  • 系統設計模式:RPC架構需要支援常用的設計模式,比如服務熔斷、服務降級、服務限流等,以確定系統在高負載情況下依然能夠正常運作。

總之,一個優秀的RPC架構需要從服務的整個生命周期出發,提供全面、完善的服務治理方案,同時保證高性能、高可擴充性和高可靠性,進而滿足分布式服務的需求。

02 通信方式設計

通信的底層是TCP/IP,在Java中網絡傳輸通常使用Netty 或 Mina 的多路複用模型作為網絡通信的底層。

1.多傳輸協定支援

為什麼要支援多種傳輸協定呢?在業務中,通常會遇到各種問題,比如:

  • 跨網絡、機房問題
  • 跨語言問題
  • 長連接配接還是短連接配接
  • 傳輸安全
  • 傳輸性能

在分布式系統中,服務之間需要進行遠端調用,常用的傳輸協定包括Http、Dubbo、Rmi、Websocket、Https、Thrift TTransport等。Http協定靈活、易于管理、跨語言,适用于低并發、異構系統對接和對外網關等場景。然而,由于明文傳輸和性能較差,不适合高并發、大資料量傳輸等場景。Dubbo傳輸協定通過長連接配接實作高性能,但單條大檔案/資料傳輸可能會形成網絡瓶頸。Rmi性能較差,但對于單次大資料量傳輸較好。Websocket、Https、Thrift TTransport等協定也有各自的優缺點。是以,支援多種傳輸協定是必要的,以滿足不同場景下的需求。

2.多資料壓縮/序列化支援

為什麼要支援多序列化支援,主要考慮兩個方面

  • 跨語言/異構平台間互動
  • 性能方面考慮

這個其實跟傳輸協定是搭配的,比如RMI通常都是使用了标準的二進制序列化。現在常見的序列化方式有Protobuf、Dubbo序列化、Hessian、Java原生、JSON、Thrift的TCompactProtocol等,每種序列化方式都有其優缺點,需要根據業務場景進行選擇。例如,對于高并發、大資料量的場景,可以考慮使用Protobuf或Thrift的二進制序列化,而對于對可讀性要求較高的場景,可以選擇JSON或XML序列化。同時,也需要設計成可擴充的方式,以便支援新的序列化方式。

03 如何找到服務(尋址)并且實作資源合理

消費者如何知道提供者,并且知道目前是否存活,是設計RPC 架構需要考慮的第二大問題。

1.多樣的注冊中心支援

在設計RPC架構時,需要考慮不同業務系統對服務間一緻性的要求,這牽扯到CAP權衡問題。此外,還需要考慮是否需要推送提供者的變動、如何保證注冊中心的安全,以及如何支援跨語言平台等因素。

如何設計實作一個Dubbo RPC架構

比如:

  • zookeeper,支援強一緻并能通過Wacher機制主動進行通知,但可用性并不能完全保證
  • Consul ,通過Http方式滿足服務發現,沒有語言限制,但通知實時性比ZK Wacher略差

是以注冊中心需要做成插件化的可擴充方式。

2.多算法負載均衡、路由和多元度流量控制

負載均衡的主要目的是通過分攤流量,使得多個服務執行個體能夠協同處理請求,進而提高服務的可用性和性能。 在設計中,需要考慮服務執行個體的機器情況、服務的負載情況、網絡延遲等因素。 常見的負載均衡算法有:随機、輪詢、權重輪詢、最少連接配接、權重最少連接配接、活躍情況、一緻性Hash等。在選擇算法時需要根據實際場景進行選擇,并結合監控資料進行調優。

如何設計實作一個Dubbo RPC架構

在生産環境中能通過界面化的方式提供動态的更改權重、路由等規則,實作服務動态權重、熔斷、限流、灰階、多版本等功能。

3.容錯機制

容錯機制是保障系統穩定性的重要一環,當系統出現故障或異常情況時,能夠快速地恢複和處理問題至關重要。RPC架構的容錯機制通常包括:failover、failfast、failback、failsafe、forking、Broadcast等。這些機制可以與負載均衡搭配使用,以實作更高效、更穩定的服務調用。

failover: 在服務提供者出現故障時,自動切換到其他可用的服務提供者。

failfast: 快速失敗,即當某個服務提供者出現故障時,立即傳回錯誤資訊。

failback: 指故障恢複後自動恢複到原來的服務提供者。

failsafe: 在發生故障時,提供備用方案。

forking: 并行調用多個服務提供者,隻要有一個傳回成功結果即可。

Broadcast: 将請求廣播到所有服務提供者并彙總結果。

考慮選擇适合業務的容錯機制,能夠提高系統的可靠性和穩定性。

04 讓業務更友善的使用

支援主流架構的內建和不同的配置方式也是非常重要的。除了支援普通的配置檔案之外,還可以支援內建到Spring等主流架構中使用。在配置的方式上,可以支援XML、注解、YAML、Properties、JSON等多種配置方式,以便滿足不同的需求。

05 可跟蹤

可以進行依賴分析,資料的調用統計,并能圖形、資料化将其顯示出來。

可跟蹤需要解決這幾個問題:

  1. 服務調用鍊路或依賴關系
  2. 調用次數及時間,提供容量/機器預算基準資料
  3. 預警

實作上可以相容現有成型的APM鍊路跟蹤,也是設計的考慮因素之一

06 其他

從架構的角度要考慮到設計模式的使用,比如常用的責任鍊、代理模式等。

容器化,Kubernetes 支援等

如何設計實作一個Dubbo RPC架構

07 最後

實作一個高品質的RPC架構需要深厚的技術功底和對分布式系統的深刻了解。同時,它還需要提供簡單易用的接口和高性能、可靠的底層實作,以滿足現代分布式系統的服務治理需求。

繼續閱讀