如何详细说明 net core高吞吐量远程方法调用组件XRPC
前言
XRPC的目标非常明确,那就是实现一个百万级的RPC通信组件用于远程方法调用。net核心平台。其设计理念与GRPC相同,基于连接复用机制实现高吞咽性能;XRPC采用HTTP2复用的思想,其协议设计类似于文本和二进制的结合;在应用程序级别,不使用消息,但使用接口代理使其更容易使用。
协议序列化
XRPC采用基于文本和二进制相结合的通信协议,报头以文本形式表示,主要描述请求的位置和附加信息。这种设计的优点是,在实现网关时,只需要解释报头,就可以做出很好的负载策略。二进制处理并没有让Protobuf像GPRC一样,而是使用了MessagePack,一个在下相对更高效的组件。net核心平台。
通信机制
在早期,许多RPC是基于独占连接和连接池构建的,具有实现方便简单的优点,但是这种设计不能将不同的请求混合到一个io中。因此,网络IO会随着并发消息的增加而增加,从而限制了性能。XRPC旨在以最少的连接数发挥更高效的网络处理能力,使n个请求的数据可以在一个io上重用,网络利用率大大提高。
然而,这种设计的缺点是使用起来非常复杂。但是,在提供的异步/等待支持下。NET,整体设计和应用变得相对简单明了。现在模块已经完成了基本功能版本,下面介绍如何使用。
组件使用
现在组件只完成最基本的功能,Actor的一些基本元素会在后面引用,使得并发业务中的数据处理更加高效。可以通过Nuget引用组件
安装包beetlex . xrpc-版本x定义了接口服务
XRPC通过接口描述服务,并通过接口制定相关服务的逻辑。具体实现如下:
[Controller(type of(IUserService))]public class User service : IUserService { public tasksuser Add(字符串名称、字符串电子邮件、字符串城市、字符串备注){ User User=new User();用户。Name=name用户。EMail=email用户。城市=城市;用户。备注=备注;返回任务。FromResult(用户);}公共任务列表用户列表(int count) {列表用户结果=新列表用户();for(int I=0;我数;i ) {用户用户=新用户();用户。ID=Guid。NewGuid()。ToString(' N ');用户。城市='广州';用户。EMail='[EMail protected]';用户。名称=' henryfan用户。备注=' http://ikende.com结果。添加(用户);}返回任务。FromResult(结果);} public bool Login(字符串名称,字符串pwd){ return(name==' admin ' pwd==' 123456 ');}公共用户修改(用户用户){返回用户;}公共void Save() { Console。WriteLine('用户已保存');}}启动服务
程序类{私有静态XRPCServer mXRPCServer静态void Main(字符串[]args){ mXRPCServer=new XRPCServer();//mXRPCServer。server options . defaultlisten . port=80;mXRPCServer。寄存器(程序的类型)。装配);mXRPCServer。open();控制台。read();}}通过Register注册相关的程序集,组件会将程序集中的所有控制器加载到内存中,可以通过log :加载
客户端定义
client=new XRPCClient(' localhost ',9090);客户。connect();客户。NetError=(c,e)={ Console。写线(即错误消息);};客户。超时=10000;为远程访问定义一个XRPCClient对象。对象默认最大连接数为2,也可以根据自身实际情况进行调整。如果不建,会导致网络IO增加,影响整体性能。
var api=客户端。CreateIUserService();var lresult=等待api。登录(' admin ',' 123456 ');控制台。write line(lresult);var结果=等待api。添加(' henry ','[emailprotected]',' gz ',' http://github.com ');控制台。WriteLine($'{result。名称} \ t {结果。EMail}\t{result。城市} \ t {结果。备注} ');等待api。save();控制台。WriteLine('保存完成');用户用户=新用户();用户。ID=Guid。NewGuid()。ToString(' N ');用户。名字='亨利';用户。EMail='[EMail protected]';用户。城市='广州';用户。备注=' http://github.com/ike NDE ';结果=等待api。修改(用户);控制台。WriteLine($'{result。名称} \ t {结果。EMail}\t{result。城市} \ t {结果。备注} ');var items=await api。清单(5);foreach(项目中的var项目){ Console。WriteLine($'{item。名称}\t{item。EMail}\t{item。城市{ t }项。备注} ');}您可以通过Create方法创建接口代理。这个代理是线程安全的。正常情况下,只需要创建一个静态成员;创建接口后,只能通过调用相关方法来调用远程方法。
基本性能
组件设计的性能目标是百万RPS的远程方法调用。然而,在4芯材料机器上作为服务的测试并没有达到这个目标,但是测试结果相当令人满意。在上面的示例代码登录方法中,RPS达到了近700,000个,并发模拟有500个。以下是不同并发数下不同方法的测试结果。
详细测试代码:https://github.com/IKende/XRPC/tree/master/Samples/Performance
摘要
以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。谢谢你的支持。
版权声明:如何详细说明 net core高吞吐量远程方法调用组件XRPC是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。