• 除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时,请求和响应通过调用管道(在客户端)
    和一个调度管道(在服务器端)进行传输:

    Client-side
    Invocation pipeline
    request
    response
    Deadline
    interceptor
    Retry
    interceptor
    network
    connection
    client
    Client-side
    Server-side
    Dispatch pipeline
    request
    response
    Logger
    middleware
    Deadline
    middleware
    service
    network
    connection
    Server-side

    这些管道会拦截请求和响应,由您来决定如何处理它们.
    如果想打个日志记录, 就加 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.

    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定义新类型,也可以使用SequenceDictionary定义集和等. 可以让Slice处理在成功或失败时,返回不同类型,如Result.

    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
  • 相关阅读:
    【秋招面经】菜鸟前端题目总结
    数据分析思维-分析方法(基础)
    【Leetcode】217.存在重复元素
    SpringBoot旅游网源码和论文java旅游管理系统
    OpenHarmony UI动画-recyclerview_animators
    【 java 面向对象】Object 类结构的剖析
    oracle执行计划中,同一条语句块,在不同情况下执行计划不一样问题。子查询,union 导致索引失效。
    手机远程控制plc有什么优势
    小车-16线 Lidar启动命令&编译指令_20220805
    python+appium自动化测试如何控制App的启动和退出
  • 原文地址:https://www.cnblogs.com/xlgwr/p/18080133