除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一样的东东. ...
随机推荐
- yapi 个人空间 这个分组的问题
总结:yapi个人空间分组的问题,我暂时不用理睬 他自己自由,但是 不允许他 创建非个人空间的分组.这点留意 避免不统一.所有的分组都必须我自己来创建,不允许他们私自创建.
- Python-目录下相同格式的Excel文件合并
最近在客户现场接到一个任务,需要将全国所有省份的数据进行合并.目录是分层级的,首先是省份目录.然后地级市目录.最里面是区县目录.需要将每个目录中的数据进行合并,然后添加4列数据,并将某一个列的数据进行 ...
- MySQL的执行流程和执行顺序
MySQL执行过程以及顺序 前言:MySQL在我们的开发中基本每天都要面对的,作为开发中的数据的来源,MySQL承担者存储数据和读写数据的职责.因为学习和了解MySQL是至关重要的,那么当我们在客户端 ...
- Spring Boot 单元测试笔记
1. 导入JUnit5测试框架 <dependency> <groupId>org.springframework.boot</groupId> <artif ...
- HASHTEAM香山杯2023WP
目录 前言 misc 签到题 web PHP_unserialize_pro Re URL从哪儿来 hello python pwn Move pwthon 附上c-python调试方法 crypto ...
- Power BI 15 DAY
业务(表结构)数据分析 1.业务理解 准确 全面 2.数据收集 了解需要用到的数据有哪些 5W2H 结构化数据 SQL.通过查询获取数据库资源 多源表结构数据 企业数据库数据 文本文件数据 Excel ...
- NC16498 [NOIP2014]寻找道路
题目链接 题目 题目描述 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指向的点都直接或间接与终点连通. 2. ...
- Java线程状态(生命周期)--一篇入魂
1.线程状态(生命周期) 一个线程在给定的时间点只能处于一种状态. 线程可以有如下6 种状态: New (新创建):未启动的线程: Runnable (可运行):可运行的线程,需要等待操作系统资源: ...
- 利用javax.validation实现对bean属性校验
1.使用场景介绍 controller层对传入的bean的属性进行非空.属性长度等合法性的校验. 传统的方式是我们要自己写if-else-去判断,比较麻烦. 2.实现效果 3.代码介绍 代码结构: p ...
- Java使用正则表达式判断字符串中是否包含某子字符串
需求: 给定一个字符串s,判断当s中包含"tree fiddy"或"3.50"或"three thirty"子字符串返回true,否则返回f ...