溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

.net core高吞吐遠(yuǎn)程方法怎么調(diào)用組件XRPC

發(fā)布時間:2021-02-05 11:11:02 來源:億速云 閱讀:178 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān).net core高吞吐遠(yuǎn)程方法怎么調(diào)用組件XRPC的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

前言

XRPC的目標(biāo)非常明確,就是給.net core平臺實現(xiàn)一個百萬級別的遠(yuǎn)程方法調(diào)用RPC通訊組件。它的設(shè)計理念和GRPC一樣,基于連接復(fù)用的機制實現(xiàn)高吞的性能;XRPC采用了HTTP2復(fù)用的思想,在協(xié)議設(shè)計上也類似文本和二進制相結(jié)合;在應(yīng)用層面并沒使用消息而是基于接口代理的方式讓使用更簡便。

協(xié)議序列化

XRPC采用了基于文本+二進制相結(jié)合的通訊協(xié)議,頭以文本的方式表現(xiàn)主要是描述請求的位置和附加信息,這樣設(shè)計的好處就是在實現(xiàn)網(wǎng)關(guān)的時候只需要解釋頭部就能做很好的負(fù)載策略。二進制處理并沒有像GPRC一樣使 Protobuf,而是使用了在.net core平臺下相對更高效的組件MessagePack。

通訊機制

在早期很多RPC是基于獨享連和連接池的方式進行構(gòu)建,這樣的好處就是實現(xiàn)起來方便簡單,但這種設(shè)計就無法把不同請求的請求混合到一個IO上。導(dǎo)致網(wǎng)絡(luò)IO隨并發(fā)消息的增長而增長,從而局限了性能的發(fā)揮。XRPC的設(shè)計是盡量在最少連接情況發(fā)揮更高效的網(wǎng)絡(luò)處理能力,這樣就可以把N個請求的數(shù)據(jù)復(fù)用在一個IO上,而從讓網(wǎng)絡(luò)利用率大大提升。

.net core高吞吐遠(yuǎn)程方法怎么調(diào)用組件XRPC

但這種設(shè)計的缺點就是使用起來非常復(fù)雜,不過在.NET提供async/await支持下整體設(shè)計和應(yīng)用就變得相對簡單和清晰很多了。現(xiàn)在模塊已經(jīng)完成基礎(chǔ)功能版本,以下介紹一下如何使用。

組件使用

組件現(xiàn)在只完成最基礎(chǔ)的功能,后面會引用Actor的一些基礎(chǔ)元素,讓在并發(fā)業(yè)務(wù)處理數(shù)據(jù)上更高效??梢酝ㄟ^Nuget引用組件

Install-Package BeetleX.XRPC -Version x

定義接口服務(wù)

XRPC是通過接口的方式來描述服務(wù),通過接口制定相關(guān)服務(wù)的邏輯,具體實現(xiàn)如下:

[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");
 }
}

啟動服務(wù)

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注冊相關(guān)程序集,組件會把程序集中所有控制器加載到內(nèi)存中,可以通過日志加載情況:

.net core高吞吐遠(yuǎn)程方法怎么調(diào)用組件XRPC

Client定義

client = new XRPCClient("localhost", 9090);
client.Connect();
client.NetError = (c, e) =>
{
  Console.WriteLine(e.Error.Message);
};
client.TimeOut = 10000;

定義一個XRPCClient對象來進行遠(yuǎn)程訪問,對象默認(rèn)最大連接數(shù)是2,也可以根據(jù)自己實情況進行調(diào)整,不建增加這樣會導(dǎo)致網(wǎng)絡(luò)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方法可以創(chuàng)建接口代理,這個代理是線程安全的,正常情況只需要創(chuàng)建一個靜態(tài)成員即可;創(chuàng)建接口后只需要調(diào)用相關(guān)方法即可完成遠(yuǎn)程方法的調(diào)用。

基礎(chǔ)性能

組件設(shè)計的性能目標(biāo)是百萬級別RPS的遠(yuǎn)程方法調(diào)用,不過在一臺4核物機作為服務(wù)測試并沒有達到這個目標(biāo),不過測試結(jié)果還算比較理想,在以上示例代碼Login方法,采用500個并發(fā)模擬的情況RPS達到將近70萬。以下是不同方法在不同并發(fā)數(shù)下的測試結(jié)果。

.net core高吞吐遠(yuǎn)程方法怎么調(diào)用組件XRPC

感謝各位的閱讀!關(guān)于“.net core高吞吐遠(yuǎn)程方法怎么調(diào)用組件XRPC”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI