.net core高吞吐远程方法如何调用组件XRPC详解
更新时间:2019年05月19日 09:07:44 作者:smark
这篇文章主要给大家介绍了关于.net core高吞吐远程方法如何调用组件XRPC的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用.net core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
前言
XRPC的目标非常明确,就是给.net core平台实现一个百万级别的远程方法调用RPC通讯组件。它的设计理念和GRPC一样,基于连接复用的机制实现高吞的性能;XRPC采用了HTTP2复用的思想,在协议设计上也类似文本和二进制相结合;在应用层面并没使用消息而是基于接口代理的方式让使用更简便。
协议序列化
XRPC采用了基于文本+二进制相结合的通讯协议,头以文本的方式表现主要是描述请求的位置和附加信息,这样设计的好处就是在实现网关的时候只需要解释头部就能做很好的负载策略。二进制处理并没有像GPRC一样使 Protobuf,而是使用了在.net core平台下相对更高效的组件MessagePack。
通讯机制
在早期很多RPC是基于独享连和连接池的方式进行构建,这样的好处就是实现起来方便简单,但这种设计就无法把不同请求的请求混合到一个IO上。导致网络IO随并发消息的增长而增长,从而局限了性能的发挥。XRPC的设计是尽量在最少连接情况发挥更高效的网络处理能力,这样就可以把N个请求的数据复用在一个IO上,而从让网络利用率大大提升。
但这种设计的缺点就是使用起来非常复杂,不过在.NET提供async/await支持下整体设计和应用就变得相对简单和清晰很多了。现在模块已经完成基础功能版本,以下介绍一下如何使用。
组件使用
组件现在只完成最基础的功能,后面会引用Actor的一些基础元素,让在并发业务处理数据上更高效。可以通过Nuget引用组件
Install-Package BeetleX.XRPC -Version x
定义接口服务
XRPC是通过接口的方式来描述服务,通过接口制定相关服务的逻辑,具体实现如下:
[Controller(typeof(IUserService))]
public class UserService : IUserService
{
public Task<User> Add(string name, string email, string city, string remark)
{
User user = new User();
user.Name = name;
user.EMail = email;
user.City = city;
user.Remark = remark;
return Task.FromResult(user);
}
public Task<List<User>> List(int count)
{
List<User> result = new List<User>();
for (int i = 0; i < count; i++)
{
User user = new User();
user.ID = Guid.NewGuid().ToString(“N”);
user.City = “GuangZhou”;
user.EMail = “[email protected]”;
user.Name = “henryfan”;
user.Remark = “ikende.com”;
result.Add(user);
}
return Task.FromResult(result);
}
public bool Login(string name, string pwd)
{
return (name == “admin” && pwd == “123456”);
}
public User Modify(User user)
{
return user;
}
public void Save()
{
Console.WriteLine(“user saved”);
}
}
启动服务
class Program
{
private static XRPCServer mXRPCServer;
static void Main(string[] args)
{
mXRPCServer = new XRPCServer();
//mXRPCServer.ServerOptions.DefaultListen.Port = 80;
mXRPCServer.Register(typeof(Program).Assembly);
mXRPCServer.Open();
Console.Read();
}
}
通过Register注册相关程序集,组件会把程序集中所有控制器加载到内存中,可以通过日志加载情况:
Client定义
client = new XRPCClient(“localhost”, 9090);
client.Connect();
client.NetError = (c, e) =>
{
Console.WriteLine(e.Error.Message);
};
client.TimeOut = 10000;
定义一个XRPCClient对象来进行远程访问,对象默认最大连接数是2,也可以根据自己实情况进行调整,不建增加这样会导致网络IO也会增加影响整体性能。
var api = client.Create<IUserService>();
var lresult = await api.Login(“admin”, “123456”);
Console.WriteLine(lresult);
var result = await api.Add(“henry”, “[email protected]”, “gz”, “github.com”);
Console.WriteLine($”{result.Name}\\t{result.EMail}\\t{result.City}\\t{result.Remark}”);
await api.Save();
Console.WriteLine(“save completed”);
User user = new User();
user.ID = Guid.NewGuid().ToString(“N”);
user.Name = “henry”;
user.EMail = “[email protected]”;
user.City = “GuangZhou”;
user.Remark = “github.com/ikende”;
result = await api.Modify(user);
Console.WriteLine($”{result.Name}\\t{result.EMail}\\t{result.City}\\t{result.Remark}”);
var items = await api.List(5);
foreach(var item in items)
{
Console.WriteLine($”{item.Name}\\t{item.EMail}\\t{item.City}\\t{item.Remark}”);
}
通过Create方法可以创建接口代理,这个代理是线程安全的,正常情况只需要创建一个静态成员即可;创建接口后只需要调用相关方法即可完成远程方法的调用。
基础性能
组件设计的性能目标是百万级别RPS的远程方法调用,不过在一台4核物机作为服务测试并没有达到这个目标,不过测试结果还算比较理想,在以上示例代码Login方法,采用500个并发模拟的情况RPS达到将近70万。以下是不同方法在不同并发数下的测试结果。
详细测试代码:github.com/IKende/XRPC/tree/master/Samples/Performance
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对华域联盟的支持。
您可能感兴趣的文章:C#敏感词过滤实现方法.NET 开源配置组件 AgileConfig的使用简介vue3.0搭配.net core实现文件上传组件ASP.NET Core MVC学习之视图组件(View Component).NET Core 3.0之创建基于Consul的Configuration扩展组件详解.Net Core中的日志组件(Logging)详解.Net core2.0日志组件Log4net、Nlog简单性能测试.Net集成敏感词组件的步骤
core
xrpc
高吞吐
相关文章
asp.net 用户在线退出更新实现代码更新用户是否在线?注销用户的话有三种情况:1.点击退出,2.会话超时,3.关闭浏览器
2010-03-03
.Net 项目代码风格要求小结代码风格没有正确与否,重要的是整齐划一,这是我拟的一份《.Net 项目代码风格要求》,供大家参考 2015-12-12
使用aspnet_regiis.exe重新注册.NET Framework本文主要介绍使用aspnet_regiis.exe重新注册.NET Framework的方法,简单实用,有需要的朋友拿去用吧。 2016-05-05
如何为CheckBoxList和RadioButtonList添加滚动条这篇文章主要介绍了为CheckBoxList和RadioButtonList添加滚动条的方法,感兴趣的小伙伴们可以参考一下 2016-07-07
ADO.NET获取数据(DataSet)同时获取表的架构实例下面小编就为大家分享一篇ADO.NET获取数据(DataSet)同时获取表的架构实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 2017-12-12
ASP.NET中用healthMonitor属性用法ASP.NET中用healthMonitor属性用法… 2006-09-09
.NET程序调试技巧(一):快速定位异常的一些方法这篇文章主要介绍了.NET程序调试技巧(一):快速定位异常的一些方法,本文讲解了定位本机异常、在客户环境定位.net程序异常两方面的内容,需要的朋友可以参考下 2015-06-06
ASP.NET验证码实现(附源码)这篇文章主要介绍了ASP.NET验证码实现过程,并为大家分享了源码下载,感兴趣的小伙伴们可以参考一下 2015-11-11
ASP.NET中MD5与SHA1加密的几种方法下面就是ASP.NET中几种加密方法。加密算法有两种,也就是上面提到的MD5和SHA1,这里我举的例子是以MD5为例,SHA1大致相同,只是使用的类不一样。 2010-04-04
CheckBox为CheckBoxList实现全选或全取消选择(js代码实现)在管理商品后台是,由于CheckBoxList的选择太多,用户需要一个全选或全取消的功能,这样操作起来会提高效率同时可以减少误点等,本文将教大家如何实现,有需要的朋友可以参考下,望本文对你有所帮助 2013-01-01
最新评论

评论(0)