热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

.netcore高吞吐远程方法如何调用组件XRPC详解

这篇文章主要给大家介绍了关于.netcore高吞吐远程方法如何调用组件XRPC的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用.netcore具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

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 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 

启动服务

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();
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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。


推荐阅读
  • 本文详细介绍了如何利用go-zero框架从需求分析到最终部署至Kubernetes的全过程,特别聚焦于微服务架构中的网关设计与实现。项目采用了go-zero及其生态组件,涵盖了从API设计到RPC调用,再到生产环境下的监控与维护等多方面内容。 ... [详细]
  • Python安全实践:Web安全与SQL注入防御
    本文旨在介绍Web安全的基础知识,特别是如何使用Python和相关工具来识别和防止SQL注入攻击。通过实际案例分析,帮助读者理解SQL注入的危害,并掌握有效的防御策略。 ... [详细]
  • Web3隐私协议Manta Network与区块链互操作性平台Axelar达成战略合作,共同推进跨链资产的隐私保护。 ... [详细]
  • 重新审视Kubernetes的必要性
    近期,我注意到不少人误以为我是Kubernetes的推广者。实际上,我只是分享了一些适合用Kubernetes解决的案例。本文旨在探讨Kubernetes的适用场景,并提供一些替代方案。 ... [详细]
  • 深入理解SAP Fiori及其核心概念
    本文详细介绍了SAP Fiori的基本概念、发展历程、核心特性、应用类型、运行环境以及开发工具等,旨在帮助读者全面了解SAP Fiori的技术框架和应用场景。 ... [详细]
  • 本文总结了在使用React Native开发过程中遇到的一些常见问题及其解决方法,包括配置错误、依赖问题和特定组件的使用技巧。 ... [详细]
  • 深入解析 Git 代码提交流程及常见问题处理
    本文详细阐述了使用 Git 进行代码提交的具体步骤,并提供了遇到常见问题时的解决方案,旨在帮助开发者更加高效地管理代码。 ... [详细]
  • 本文介绍了如何通过源码编译和PECL命令来升级Swoole扩展,详细记录了可能遇到的问题及解决方案。 ... [详细]
  • 图神经网络模型综述
    本文综述了图神经网络(Graph Neural Networks, GNN)的发展,从传统的数据存储模型转向图和动态模型,探讨了模型中的显性和隐性结构,并详细介绍了GNN的关键组件及其应用。 ... [详细]
  • 本文提供了详细的步骤,指导用户如何下载并安装 Git 的中文语言包,以提升用户体验。 ... [详细]
  • 美国网络安全:MITRE Shield 积极防御知识库解析
    本文深入解析了MITRE Shield积极防御知识库,探讨其在网络安全领域的应用及意义。 ... [详细]
  • 本文介绍了如何利用snownlp库对微博内容进行情感分析,包括安装、基本使用以及如何自定义训练模型以提高分析准确性。 ... [详细]
  • 解决Win7中BAT文件无法设置管理员权限的问题
    本文介绍了一种通过创建快捷方式并使用其高级属性中的“以管理员身份运行”选项来解决Windows 7系统下BAT文件无法直接设置为管理员权限的方法。 ... [详细]
  • Golang与微服务架构:构建高效微服务
    本文探讨了Golang在微服务架构中的应用,包括Golang的基本概念、微服务开发的优势、常用开发工具以及具体实践案例。 ... [详细]
  • VMware 15.5.7 中文版激活方法
    本文提供了一种有效的方法来激活 VMware 15.5.7 的中文版本,同时介绍了如何利用最新的激活码进行操作,确保用户能够顺利使用。 ... [详细]
author-avatar
happy柒月卍520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有