时间:2021-05-28
前言
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 = "Henryfan@msn.com"; user.Name = "henryfan"; user.Remark = "http://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"); }}启动服务
通过Register注册相关程序集,组件会把程序集中所有控制器加载到内存中,可以通过日志加载情况:
Client定义
定义一个XRPCClient对象来进行远程访问,对象默认最大连接数是2,也可以根据自己实情况进行调整,不建增加这样会导致网络IO也会增加影响整体性能。
var api = client.Create<IUserService>();var lresult = await api.Login("admin", "123456");Console.WriteLine(lresult);var result = await api.Add("henry", "henryfan@msn.com", "gz", "http://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 = "henryfan@msn.com";user.City = "GuangZhou";user.Remark = "http://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万。以下是不同方法在不同并发数下的测试结果。
详细测试代码:https://github.com/IKende/XRPC/tree/master/Samples/Performance
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
COM组件中调用JavaScript函数详解及实例要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS)调用A的方法longCalc()
JavaRMI详解概要:JavaRMI指的是远程方法调用(RemoteMethodInvocation)。它是一种机制,能够让在某个Java虚拟机上的对象调用另
一.简介SpringCloud是基于Restful的远程调用框架,引入Ribbon负载均衡组件后还需要客户端使用RestTemplate调用远程接口,操作起来还
jax-wshandler的详解及简单实例aop技术一般用于某个对象的函数调用的日志,认证等。webservice是远程的函数调用,也需要类似的aop方法,举例
本文实例讲述了asp.net基于WebService实现远程上传图片的方法。分享给大家供大家参考,具体如下:页面调用代码:前提添加Web引用HttpFileCo