除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接口,这些接口都是可等待的,与本地同步调用时,可以快速查看. 如下所示:

csharp 复制代码
// 异步代码 (旧RPC风格)

//目前尚不清楚这是一个需要几毫秒的远程呼叫还是一个需要
//至多几微秒。在任何情况下,此调用都会保持其线程,直到
//完成。
string greeting = greeter.Greet(name);
csharp 复制代码
//异步代码(现代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"接口非常简单:

slice 复制代码
// 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 还支持双向流. 如下示:

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.

作者结语

  • 从第一行翻译开始,查看各种翻译,比如 百度翻译,有道翻译,加上自已的理解,有点小累啊
  • 翻译的不好,请手下留情,人也要成长的,谢谢
  • 如果对我有点小兴趣,如可加我个人微信哦,大家交个朋友,一起探讨人生。