最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC詳解

 更新時(shí)間:2019年05月19日 09:07:44   作者:smark  
這篇文章主要給大家介紹了關(guān)于.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.net core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

協(xié)議序列化

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

通訊機(jī)制

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

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

組件使用

組件現(xiàn)在只完成最基礎(chǔ)的功能,后面會(huì)引用Actor的一些基礎(chǔ)元素,讓在并發(fā)業(yè)務(wù)處理數(shù)據(jù)上更高效。可以通過(guò)Nuget引用組件

Install-Package BeetleX.XRPC -Version x

定義接口服務(wù)

XRPC是通過(guò)接口的方式來(lái)描述服務(wù),通過(guò)接口制定相關(guān)服務(wù)的邏輯,具體實(shí)現(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");
 }
}

啟動(dòng)服務(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();
 }
}

通過(guò)Register注冊(cè)相關(guān)程序集,組件會(huì)把程序集中所有控制器加載到內(nèi)存中,可以通過(guò)日志加載情況:

Client定義

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

定義一個(gè)XRPCClient對(duì)象來(lái)進(jìn)行遠(yuǎn)程訪問(wèn),對(duì)象默認(rèn)最大連接數(shù)是2,也可以根據(jù)自己實(shí)情況進(jìn)行調(diào)整,不建增加這樣會(huì)導(dǎo)致網(wǎng)絡(luò)IO也會(huì)增加影響整體性能。

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

通過(guò)Create方法可以創(chuàng)建接口代理,這個(gè)代理是線(xiàn)程安全的,正常情況只需要?jiǎng)?chuàng)建一個(gè)靜態(tài)成員即可;創(chuàng)建接口后只需要調(diào)用相關(guān)方法即可完成遠(yuǎn)程方法的調(diào)用。

基礎(chǔ)性能

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

詳細(xì)測(cè)試代碼:https://github.com/IKende/XRPC/tree/master/Samples/Performance

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • .NET Core授權(quán)失敗自定義響應(yīng)信息的操作方法

    .NET Core授權(quán)失敗自定義響應(yīng)信息的操作方法

    這篇文章主要介紹了.NET Core授權(quán)失敗自定義響應(yīng)信息的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • asp.net實(shí)現(xiàn)將Excel中多個(gè)sheet數(shù)據(jù)導(dǎo)入到SQLSERVER中的方法

    asp.net實(shí)現(xiàn)將Excel中多個(gè)sheet數(shù)據(jù)導(dǎo)入到SQLSERVER中的方法

    這篇文章主要介紹了asp.net實(shí)現(xiàn)將Excel中多個(gè)sheet數(shù)據(jù)導(dǎo)入到SQLSERVER中的方法,涉及asp.net針對(duì)Excel的讀取與數(shù)據(jù)庫(kù)操作相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-12-12
  • asp.net 2.0里也可以用JSON的使用方法

    asp.net 2.0里也可以用JSON的使用方法

    本人找到一份,可以在asp.net2.0里實(shí)現(xiàn)JSON方式傳送數(shù)據(jù)的方法。但是原方法,不能在數(shù)據(jù)中帶有{、}、[、]、"等,所以我做特意做了轉(zhuǎn)意。
    2010-03-03
  • 深入解析.NET 許可證編譯器 (Lc.exe) 的原理與源代碼剖析

    深入解析.NET 許可證編譯器 (Lc.exe) 的原理與源代碼剖析

    許可證編譯器 (Lc.exe) 的作用是讀取包含授權(quán)信息的文本文件,并產(chǎn)生一個(gè)可作為資源嵌入到公用語(yǔ)言運(yùn)行庫(kù)可執(zhí)行文件中的 .licenses 文件
    2013-07-07
  • Rx.NET庫(kù)中IDisposable對(duì)象的用法

    Rx.NET庫(kù)中IDisposable對(duì)象的用法

    這篇文章介紹了Rx.NET庫(kù)中IDisposable對(duì)象的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • GridView選擇記錄同時(shí)confirm用戶(hù)確認(rèn)刪除

    GridView選擇記錄同時(shí)confirm用戶(hù)確認(rèn)刪除

    confirm用戶(hù)確認(rèn)刪除是一個(gè)很實(shí)用的功能,比如可以防止用戶(hù)誤操作刪除等等,感興趣的朋友可以了解下,希望本文對(duì)你有所幫助,就當(dāng)鞏固知識(shí)了
    2013-01-01
  • AspNetPager與Socut.Data使用方法

    AspNetPager與Socut.Data使用方法

    最近對(duì)AspNetPager與Socut.Data這兩個(gè)控件產(chǎn)生了濃厚的興趣,這兩個(gè)控件配合可以減輕很多程序員編寫(xiě)代碼的壓力。ASpNetPager為分頁(yè)控件,而Socut.Data為數(shù)據(jù)操作控件,ACCESS,MSSQL都可以。
    2008-10-10
  • Net5?WorkService?繼承?Quarzt?及?Net5處理文件上傳功能

    Net5?WorkService?繼承?Quarzt?及?Net5處理文件上傳功能

    這篇文章主要介紹了Net5?WorkService?繼承?Quarzt?以及?Net5處理文件上傳,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Asp.Net URL重寫(xiě)的具體實(shí)現(xiàn)

    Asp.Net URL重寫(xiě)的具體實(shí)現(xiàn)

    這篇文章主要介紹了Asp.Net URL重寫(xiě)的具體實(shí)現(xiàn),有需要的朋友可以參考一下
    2014-01-01
  • .NET日志框架Nlog使用介紹

    .NET日志框架Nlog使用介紹

    這篇文章介紹了.NET日志框架Nlog的使用方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01

最新評(píng)論

商丘市| 福泉市| 常德市| 永年县| 沧源| 吉水县| 天长市| 定安县| 奉节县| 阜平县| 霍林郭勒市| 乌拉特中旗| 商洛市| 阳东县| 临泽县| 鄯善县| 邵阳市| 玉树县| 遵义县| 阳泉市| 辽阳市| 郎溪县| 丰顺县| 崇文区| 甘南县| 鄂尔多斯市| 桂林市| 东丽区| 青铜峡市| 通榆县| 密云县| 印江| 磴口县| 永康市| 江北区| 射阳县| 武安市| 凭祥市| 永丰县| 四子王旗| 盐亭县|