.net core高吞吐远程方法怎么调用组件XRPC
创始人
2024-11-27 14:03:14
0次

前言

XRPC的目标非常明确,就是给.net core平台实现一个百万级别的远程方法调用RPC通讯组件。它的设计理念和GRPC一样,基于连接复用的机制实现高吞的性能;XRPC采用了HTTP2复用的思想,在协议设计上也类似文本和二进制相结合;在应用层面并没使用消息而是基于接口代理的方式让使用更简便。

协议序列化

XRPC采用了基于文本+二进制相结合的通讯协议,头以文本的方式表现主要是描述请求的位置和附加信息,这样设计的好处就是在实现网关的时候只需要解释头部就能做很好的负载策略。二进制处理并没有像GPRC一样使 Protobuf,而是使用了在.net core平台下相对更高效的组件MessagePack。

通讯机制

在早期很多RPC是基于独享连和连接池的方式进行构建,这样的好处就是实现起来方便简单,但这种设计就无法把不同请求的请求混合到一个IO上。导致网络IO随并发消息的增长而增长,从而局限了性能的发挥。XRPC的设计是尽量在最少连接情况发挥更高效的网络处理能力,这样就可以把N个请求的数据复用在一个IO上,而从让网络利用率大大提升。

.net core高吞吐远程方法怎么调用组件XRPC

但这种设计的缺点就是使用起来非常复杂,不过在.NET提供async/await支持下整体设计和应用就变得相对简单和清晰很多了。现在模块已经完成基础功能版本,以下介绍一下如何使用。

组件使用

组件现在只完成最基础的功能,后面会引用Actor的一些基础元素,让在并发业务处理数据上更高效。可以通过Nuget引用组件

Install-Package BeetleX.XRPC -Version x

定义接口服务

XRPC是通过接口的方式来描述服务,通过接口制定相关服务的逻辑,具体实现如下:

[Controller(typeof(IUserService))]
public class UserService : IUserService
{
 public Task 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(int count)
 {
  List result = new List();
  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");
 }
}

启动服务

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注册相关程序集,组件会把程序集中所有控制器加载到内存中,可以通过日志加载情况:

.net core高吞吐远程方法怎么调用组件XRPC

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();
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万。以下是不同方法在不同并发数下的测试结果。

.net core高吞吐远程方法怎么调用组件XRPC

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...