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

除gRPC之外的另一个选择,IceRPC-支持QUIC的更多相关文章
- HttpClient + ASP.NET Web API, WCF之外的另一个选择
WCF的野心造成了它的庞大复杂,HTTP的单纯造就了它的简单优美.为了实现分布式Web应用,我们不得不将两者凑合在一起 —— WCF服务以HTTP绑定宿主于IIS. 于是有了让人晕头转向的配置.让人郁 ...
- IntelliJ IDEA —— Android开发的另一个选择
IntelliJ IDEA —— Android开发的另一个选择 很早就听过Eclipse的大名,但在我初学Java的时候,一位前辈推荐的IDE却是IntelliJ IDEA.因为之前用过JetBra ...
- Element-ui 下拉列表 全选 多选时 select全选 新增一个选择所有的选项
项目里经常会用到,在一个多选下拉框里新增一个选择所有的选项,例如: <!DOCTYPE html> <html lang="en"> <head> ...
- [开源精品] .NET Redis Client 又多了一个选择,还在被 StackExchange.Redis Timeout 问题困扰吗?
前言 .NET 下 RedisClient SDK 选择挺多,国人常用免费的有 StackExchange.Redis/CSRedis/Newlife.Redis,收费的有 ServiceStack. ...
- 类 ArrayBlockingQueue<E>(一个由数组支持的有界阻塞队列。)
类型参数: E - 在此 collection 中保持的元素类型 所有已实现的接口: Serializable, Iterable<E>, Collection<E>, Blo ...
- SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.
SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis. 特性 替代 Redis 数据库, Redis 的 100 倍容量 LevelDB 网络支持, 使用 C/C++ ...
- 修复一个mysqlbinlog_flashback不支持json格式问题
修复一个mysqlbinlog_flashback不支持json格式问题 , 有问题可以反馈留言 , 如下盘: 最简单的例子为 python mysqlbinlog_back.py --host=&q ...
- Mcrouter-基于Memcached协议的缓存层流量管理工具(Memcached集群的另一个选择)(转)
Mcrouter 是一个基于Memcached协议的路由器,它是 Facebook缓存架构的核心组件,在峰值的时候,它能够处理每秒50亿次的请求.近日,Facebook开放了Mcrouter的源代码, ...
- vagrant 设置除默认工项目之外的synced_folder一个坑
vagrant和host共享的目录,模式是以host主机目录为主,vagrant目录为从,所以记住当你新建同步目录的时候一定要先把vagratn目录文件备份一下,不然会被host目录覆盖
- Github Pages另一个选择:GitCafe-Pages
今天找资料时,瞥到了GitCafe-Pages字样,记得前些日子就看到过GitCafe,知道这个是国内的类似Github的代码托管平台,所以一看字样就明白了这个是与Github Pages一样的东东. ...
随机推荐
- .NET Core开发实战(第15课:选项框架:服务组件集成配置的最佳实践)--学习笔记
15 | 选项框架:服务组件集成配置的最佳实践 这一节讲解如何使用选项框架来处理服务和配置的关系 选项框架的特性: 1.支持单例模式读取配置 2.支持快照 3.支持配置变更通知 4.支持运行时动态修改 ...
- Hadoop-大数据组件版本号查看
1.操作系统 cat /etc/redhat-release ; 2.JDK java -version 3.SCALA scala --version 4.MySQL mysql --versio ...
- 浅谈 2-SAT
SAT 是适定性(Satisfiability)问题的简称.一般形式为 k - 适定性问题,简称 k-SAT.而当 \(k>2\) 时该问题为 NP 完全的.所以我们只研究 \(k=2\) 的情 ...
- NC16576 [NOIP2012]摆花
题目链接 题目 题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m 盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n 种花,从1 到n 标号.为了在门口展出更多种花,规定第i ...
- Go语言的100个错误使用场景(48-54)|错误管理
目录 前言 7. 错误管理 7.1 panicking(#48) 7.2 不清楚何时应该包裹一个 error(#49) 7.3 检查错误类型不够精确(#50) 7.4 检查错误值不够精确(#51) 7 ...
- 【树莓派】拷贝系统到新SD卡(系统备份/部署到另一台树莓派上)适用ubuntu 20.04.3
本教程适用ubuntu 20.04.3 其他版本也大同小异.这种方法能更快的将系统部署下去,如果重新安装一遍加上各种配置相信你会比较疯狂即使做了自动化脚本! 一.树莓派sd卡拷贝 把旧SD卡插入树莓派 ...
- 解决VMware与win10无法共享目录
1.安装VMware Tools 这一步适用于多数情况,但对于高版本的VMWare这一步无效,当然了,先试一试总没有坏处. 有看见网上说如果VMware内安装的是高版本的Ubuntu,安装的VMwar ...
- 以二进制文件安装K8S之环境准备
为了k8s集群能正常运行,需要先完成4项准备工作: 1.关闭防火墙 2.禁用SeLinux 3.关闭Swap 4.安装Docker 关闭防火墙 # 查看防火墙状态 getenforce #关闭防火墙, ...
- java基础集合类之ArrayList---01
集合类之ArrayList ArrayList<E>: 1.可调整大小的数组实现 2.<E>:是一种特殊的数据类型,泛型 3.在出现E的地方我们使用引用数据类型替换即可:Arr ...
- VMware虚拟机Ubuntu系统连接网络过程
网络和Internet设置--高级网络设置--更多网络适配器选项--WLAN. 右键选择属性--共享,勾选允许连接,选择VMnet8.(若勾选了其它,之后再想换回来,可以先取消勾选,点确定,再进入勾选 ...