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

作者引言

  • 自從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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章