.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC詳解
前言
XRPC的目標(biāo)非常明確,就是給.net core平臺(tái)實(shí)現(xiàn)一個(gè)百萬級(jí)別的遠(yuǎn)程方法調(diào)用RPC通訊組件。它的設(shè)計(jì)理念和GRPC一樣,基于連接復(fù)用的機(jī)制實(shí)現(xiàn)高吞的性能;XRPC采用了HTTP2復(fù)用的思想,在協(xié)議設(shè)計(jì)上也類似文本和二進(jìn)制相結(jié)合;在應(yīng)用層面并沒使用消息而是基于接口代理的方式讓使用更簡便。
協(xié)議序列化
XRPC采用了基于文本+二進(jìn)制相結(jié)合的通訊協(xié)議,頭以文本的方式表現(xiàn)主要是描述請求的位置和附加信息,這樣設(shè)計(jì)的好處就是在實(shí)現(xiàn)網(wǎng)關(guān)的時(shí)候只需要解釋頭部就能做很好的負(fù)載策略。二進(jìn)制處理并沒有像GPRC一樣使 Protobuf,而是使用了在.net core平臺(tái)下相對更高效的組件MessagePack。
通訊機(jī)制
在早期很多RPC是基于獨(dú)享連和連接池的方式進(jìn)行構(gòu)建,這樣的好處就是實(shí)現(xiàn)起來方便簡單,但這種設(shè)計(jì)就無法把不同請求的請求混合到一個(gè)IO上。導(dǎo)致網(wǎng)絡(luò)IO隨并發(fā)消息的增長而增長,從而局限了性能的發(fā)揮。XRPC的設(shè)計(jì)是盡量在最少連接情況發(fā)揮更高效的網(wǎng)絡(luò)處理能力,這樣就可以把N個(gè)請求的數(shù)據(jù)復(fù)用在一個(gè)IO上,而從讓網(wǎng)絡(luò)利用率大大提升。
但這種設(shè)計(jì)的缺點(diǎn)就是使用起來非常復(fù)雜,不過在.NET提供async/await支持下整體設(shè)計(jì)和應(yīng)用就變得相對簡單和清晰很多了?,F(xiàn)在模塊已經(jīng)完成基礎(chǔ)功能版本,以下介紹一下如何使用。
組件使用
組件現(xiàn)在只完成最基礎(chǔ)的功能,后面會(huì)引用Actor的一些基礎(chǔ)元素,讓在并發(fā)業(yè)務(wù)處理數(shù)據(jù)上更高效??梢酝ㄟ^Nuget引用組件
Install-Package BeetleX.XRPC -Version x
定義接口服務(wù)
XRPC是通過接口的方式來描述服務(wù),通過接口制定相關(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(); } }
通過Register注冊相關(guān)程序集,組件會(huì)把程序集中所有控制器加載到內(nèi)存中,可以通過日志加載情況:
Client定義
client = new XRPCClient("localhost", 9090); client.Connect(); client.NetError = (c, e) => { Console.WriteLine(e.Error.Message); }; client.TimeOut = 10000;
定義一個(gè)XRPCClient對象來進(jìn)行遠(yuǎn)程訪問,對象默認(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}"); }
通過Create方法可以創(chuàng)建接口代理,這個(gè)代理是線程安全的,正常情況只需要?jiǎng)?chuàng)建一個(gè)靜態(tài)成員即可;創(chuàng)建接口后只需要調(diào)用相關(guān)方法即可完成遠(yuǎn)程方法的調(diào)用。
基礎(chǔ)性能
組件設(shè)計(jì)的性能目標(biāo)是百萬級(jí)別RPS的遠(yuǎn)程方法調(diào)用,不過在一臺(tái)4核物機(jī)作為服務(wù)測試并沒有達(dá)到這個(gè)目標(biāo),不過測試結(jié)果還算比較理想,在以上示例代碼Login方法,采用500個(gè)并發(fā)模擬的情況RPS達(dá)到將近70萬。以下是不同方法在不同并發(fā)數(shù)下的測試結(jié)果。
詳細(xì)測試代碼:https://github.com/IKende/XRPC/tree/master/Samples/Performance
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對我們的支持。
上一篇:.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時(shí)
欄 目:ASP.NET
下一篇:淺析.Net Core中Json配置的自動(dòng)更新
本文標(biāo)題:.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC詳解
本文地址:http://mengdiqiu.com.cn/a1/ASP_NET/10932.html
您可能感興趣的文章
- 01-11如何給asp.net core寫個(gè)簡單的健康檢查
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時(shí)
- 01-11.NET開發(fā)人員關(guān)于ML.NET的入門學(xué)習(xí)
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11ASP.NET Core靜態(tài)文件的使用方法
- 01-11.NET Core 3.0之創(chuàng)建基于Consul的Configuration擴(kuò)展組件
- 01-11.net core EF Core調(diào)用存儲(chǔ)過程的方式
- 01-11asp.net Core3.0區(qū)域與路由配置的方法


閱讀排行
本欄相關(guān)
- 01-11vscode extension插件開發(fā)詳解
- 01-11VsCode插件開發(fā)之插件初步通信的方法
- 01-11如何給asp.net core寫個(gè)簡單的健康檢查
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.NET開發(fā)人員關(guān)于ML.NET的入門學(xué)習(xí)
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11ASP.NET Core靜態(tài)文件的使用方法
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什