除gRPC之外的另一個選擇,IceRPC-支援QUIC

xlgwr發表於2024-03-18

作者引言

  • 自從19年開始接觸到RPC,當時完全沒有相關概念,接觸到的都是http,tcp等,當時公司用的是zeroc出品的ice框架,對應rpc非常強大,跨平臺,跨語言。可惜的國內並不是主流,主流是gRPC,萬物諸途同歸,最終的目地是一樣的。主要上看誰簡單,方便,好理解。就在去年重新出一個新的RPC框架IceRPC,從0重新構建,並以QUIC為基礎,開創一個新的RPC.我感到非常欣慰。特別是有一句話,我深有同感:更少的程式碼意味著更簡單的邏輯、更少的依賴關係和更快的執行以及更少的bug,作為一直在一線開的人員,我想一樣很有感觸。本是平凡人,只能默默幹,什麼時候當韭菜,看天決定。
  • 不知道如何是推廣新的IceRPC,為RPC做個小小的貢獻,我還是從[https://github.com/icerpc]原始碼README.md翻譯開始吧,如果讀者英語棒棒的好,還是直接看原文吧,本翻譯是我平生第一次翻譯,如有不爽的地方,希望大家可以回覆交流,我會及時改
  • 萬事開頭難,就怕不斷幹。希望以後能不斷更新,同時想認識到更多的朋友

IceRPC - C# 語言版

IceRPC是一個現代化、模組化PRC框架,可以幫助您以最少的工作量,快速構建網路應用(生產力強,更多選擇).

以QUIC協議構建

IceRPC 充分利用HTTP/3的新型多路傳輸QUIC協議,從零開始構建RPC.

QUIC 協議天生適合RPC: RPC 對映到雙向QUIC流,承載請求/響應對.
多個請求/響應對,可以在同一個QUIC連線內,並行進行,並且不會相互干擾.

IceRPC 使用自已的應用程式協議, icerpc, 交換連線設定,處理傳輸請求及響應,確保連線有序關閉. 這個新的以RPC為中心的協議,是QUIC上的一層薄薄的協議.

除了 QUIC,還支援更多協議

IceRPC的主要傳輸是QUIC, 但目前仍處QUIC協議的早期階段,所以僅支援QUIC協議並不是實際.

為了彌合這一差距, IceRPC 提供了一個名為 Slic 的多路複用介面卡. Slic 實現了類似QUIC的多路複用,並透過任何雙工傳輸(如TCP)進行傳輸. 透過這種方式,可以將IceRPC與QUIC,及TCP一起使用(透過Slic), 也可以與其他傳統傳輸方式使用,如藍芽和命名管道.

現代化的 C# 與 .NET

IceRPC(C#) 充分利用了最新C#語法和.NET功能,並提供了現代化C# API介面.

最主的特性就是 async/await. Async/await 允許在進行呼叫時,有效地利用執行緒來等待 I/O, 而 RPCs 都與網路 I/O 有關. Async/await 還使程式碼更易於閱讀及維護:
所有的RPC呼叫都有 Async Api介面,這些介面都是可等待的,與本地同步呼叫時,可以快速檢視. 如下所示:

// 非同步程式碼 (舊RPC風格)

//目前尚不清楚這是一個需要幾毫秒的遠端呼叫還是一個需要
//至多幾微秒。在任何情況下,此呼叫都會保持其執行緒,直到
//完成。
string greeting = greeter.Greet(name);
//非同步程式碼(現代RPC風格)

//由於wait和Async字尾,我們看到這是一個特殊的呼叫。GreetSync釋出
//執行緒,同時等待來自對等方的響應,並且編寫起來和
//同步版本一樣。
string greeting = await greeter.GreetAsync(name);

使用IceRPC,所有進行網路I/O的呼叫,都是非同步的,而且只有非同步。
IceRPC不提供並行阻塞、同步介面。

IceRPC 利用 System.IO.Pipelines 獲取最大效率管道. IceRPC從相同的可配置記憶體池中,租用其所有位元組緩衝區.

IceRPC天然地支援取消(cancellation),就像所有現代C#庫一樣,帶有取消令牌引數.
如取消“跨線”工作:當取消一個未完成的RPC呼叫時,會通知遠端服務
,進而可以取消進一步的操作處理.

模組化和可擴充套件性

使用IceRPC進行RPC時,請求和響應透過呼叫管道(在客戶端)
和一個排程管道(在伺服器端)進行傳輸:

--- title: Client-side --- flowchart LR subgraph pipeline[Invocation pipeline] direction LR di[Deadline\ninterceptor] --> ri[Retry\ninterceptor] --> connection[network\nconnection] --> ri --> di end client -- request --> di client -- response --- di
--- title: Server-side --- flowchart LR subgraph pipeline [Dispatch pipeline] direction LR lm[Logger\nmiddleware] --> dm[Deadline\nmiddleware] --> service --> dm --> lm end connection[network\nconnection] -- request --> lm connection -- response --- lm

這些管道會攔截請求和響應,由您來決定如何處理它們.
如果想打個日誌記錄, 就加 Logger 攔截器到呼叫管道中去,或將Logger中介軟體新增到排程中就行了.
如果想自動重試,失敗的請求,可以加個“重試”攔截器到呼叫管道中就行了.
IceRPC 提供了許多攔截器和中介軟體如: compression, deadlines, logging,
metrics, OpenTelemetry integration, 等.
我們自已也可以輕鬆地建立和安裝自己的攔截器或中介軟體.或者自定義上面的攔截器、中介軟體。

所有這些功能(自帶攔截器和中介軟體)都是可選的,因此可以準確地選擇,所需要的行為功能.
比如, 如果不壓縮任何內容,則移除Compress攔截器: 如果都沒有安裝這個Compress攔截器,就根本無法壓縮請求資料. 更少的程式碼意味著更簡單的邏輯、更少的依賴關係和更快的執行以及更少的bug

在IceRPC中,模組化和可擴充套件性無處不在. 可以很輕鬆實現新的雙工或多路複用傳輸,然後作為IceRPC的外掛。所有傳輸介面都是公共的,並且有完整詳細的文件說明.

可以選擇的將IceRPC與 DI container一起使用.

選擇 IDL(介面描述語言)

IceRPC提供了一個一流的面向位元組的API,使用 IDL 來構建RPC,及可選的序列化格式.

IceRPC完全支援兩個IDLs: Slice (詳細見如下) and Protobuf. 可以使用Slice或Protobuf來定義客戶端和伺服器之間的介面契約.

Slice

SliceIDL和序列化格式,可以清晰簡潔的定義RPCs功能設定. Slice 與IceRPC無繫結關係: 可以在不使用任何RPC框架的情況下使用Slice,也可以使用其他RPC框架.

當前倉庫提供了IceRPC+Slice整合,可以無縫地將IceRPC和Slice一起使用.

在Slice中自定義的“Greeter”介面非常簡單:

// Interface Greeter由伺服器中託管的服務實現.
interface Greeter {
    // The greet request carries the name of the person to greet and
    // the greet response carries the greeting created by the service
    // that implements Greeter.
    greet(name: string) -> string
}

不需要編寫特殊的請求和回覆訊息型別:可以內聯指定對應引數.

然後,Slice編譯器用這個“Greeter”介面檔案,生成可讀且簡潔的C#程式碼:

  • 客戶端,生成具有單個“GreetSync”方法的“IGreeter”介面.

  • 客戶端 透過GreeterProxy代理使用IceRPC傳送請求/接收響應來實現“IGreeter”

  • 服務端 實現 IGreeterService 介面來實現Greeter的服務功能

Slice 還支援雙向流. 如下示:

interface Generator {
    // Returns a (possibly infinite) stream of int32
    generateNumbers() -> stream int32
}

interface Uploader {
    // Uploads an image (can be very large)
    uploadImage(image: stream uint8)
}

uint8的流被對映到C#的PipeReader,而任何其他型別的流則被對映到
IAsyncEnumerable<T>.

Slice 提供了易於理解的基元型別,如下:

  • string
  • bool
  • fixed-size integral types (int8, int16, int32, int64, uint8, uint16, uint32, uint64)
  • variable-size integral types (varint32, varint62, varuint32, varuint62)
  • floating point types (float32, float64)

可以使用struct, enum, 各 custom定義新型別,也可以使用Sequence<T>Dictionary<Key, Value>定義集和等. 可以讓Slice處理在成功或失敗時,返回不同型別,如Result<Success, Failure>.

custom 允許透過Slice傳送任何想要的C#型別,這是IceRPC的模組化和
可擴充套件性魔法。只需要提供對自定義型別的例項進行編碼和解碼的方法.

Protobuf

Protocol Buffers, 簡稱 Protobuf, 是Google開發的一種流行的 IDL 和 序列化格式. 它是很多RPC框架的首選IDL,包括 gRPC.

IceRPC+Protobuf整合,只需幾行程式碼就可以使用IceRPC呼叫和實現Protobuf服務
.

Ice 相關互動操作

IceRPC(C#)提供了與Ice的高階別互操作性。可以使用IceRPC為舊的
Ice伺服器寫客戶端,可以從Ice客戶端呼叫,由IceRPC伺服器託管的服務.

IceRPC for Ice users 提供了所有詳細資訊.

License 許可證

IceRPC is licensed under the Apache License version 2.0, a permissive open-source license.

This license allows you to use IceRPC in both open-source and closed source applications, free of charge. Please refer
to the license for the full terms and conditions.

作者結語

  • 從第一行翻譯開始,檢視各種翻譯,比如 百度翻譯,有道翻譯,加上自已的理解,有點小累啊
  • 翻譯的不好,請手下留情,人也要成長的,謝謝
  • 如果對我有點小興趣,如可加我個人微信哦,大家交個朋友,一起探討人生。
    image

相關文章