MediatRPC - 基于MediatR和Quic通訊實現的RPC框架,比GRPC更簡潔更低耦合,開源發布第一版...

大家好,我是失業在家,正在找工作的博主Jerry。作為一個.Net架構師,就要研究編程藝術,例如SOLID原則和各種設計模式。根據這些原則和實踐,實現了一個更簡潔更低耦合的RPC(Remote Procedure Calls)框架,名叫MediatRPC。

一、MediatR 編程思想

SOLID的總原則是開閉原則(Open Closed Principle):一個軟件實體,如類、模塊和函數應該對擴展開放,對修改關閉。其它原則和設計模式都是為了實現和體現這個總原則。例如我們熟悉的工廠模式就很好的實現了開閉原則(Open Closed Principle)。

但是我認為,MediatR對這個總原則的實現更完美。在MediatR中,任何新增功能都可以通過新增Resquest消息和Handler處理器的方式實現,甚至可以在不改變原有Notification消息的基礎上,新增Handler處理來實現功能擴展。新版本還增加了對StreamRequest的支持,使其可以通過相同的方式對請求數據流進行處理,實現和GRPC類似的流式數據處理。

MediatR對這個總原則的實現之所以更好,是因為它沒有讓程序員采用傳統的面向接口的編程方式來對功能進行抽象,也就是通過接口方法來代表功能。而是另辟蹊徑,采用消息來代表功能,把功能抽象為對消息的處理過程。很巧妙的避免了接口類粒度難以定義和接口方法簽名耦合的問題。MediatR讓程序員從面向接口編程轉變為面向消息編程。化繁為簡,我認為這是一個很大的編程思想的進步。

二、MediatR 和 Grpc對比

MediatR還提供各種自定義AOP功能和異常處理功能,是個很優秀的過程/功能調用(Procedure Calls)框架。從過程/功能調用的角度來講,它比GRPC更簡潔,更低耦合。因為GRPC本質上還是傳統的對服務器端功能的接口抽象,也就是Proto文件的作用。這導致了客戶端不但要知道服務端方法的接口參數,也要知道方法所在接口和方法名稱才能調用該功能。此外,如果客戶端只想調用服務端的一個方法,也必須要引用整個Proto文件,或者對Proto文件進行刪減(增加風險)。

而這些高耦合的問題在MediatR中都不存在,因為在MediatR中,消息就代表功能,服務端只要接收到消息就執行對應處理過程來實現功能。客戶端想調用那個功能只要發送相應的消息即可。除了MediatR不能遠程(Remote)以外。

三、如何實現MediatRPC

那么,我們就給MediatR加上遠程通訊的功能。這就涉及到遠程通訊的問題,目前最先進最時髦的遠程通訊協議莫過于QUIC了。它是HTTP3的通訊實現基礎,基于UDP協議,比TCP協議減少了握手次數,提高了傳輸效率,提高了傳輸安全性等,總之就是兩個字:先進。

而.Net 中的System.Net.Quic,是微軟實現的跨平臺QUIC的.Net封裝程序集。微軟其實是用C++實現的QUIC,據說其性能受到了業界好評。本文就使用System.Net.Quic為MediatR增加遠程發送和接收消息的功能。從而實現真正的RPC,起名叫MediatRPC。

四、MediatRPC實現效果

?我們先來看一下實現結果,首先啟動服務端:

63c2f9649c04f6b7a6461ebb0a77a66f.png

客戶端遠程調用代碼如下:

c0deacaf0901294043b3551646144d76.png

Console.WriteLine("MediatRPC Client Running...");
Console.WriteLine();MediatRpcClient mediatRpcClient = await MediatRpcClient.Build();var responseMessage1 = await mediatRpcClient.Send(new TestRequestMessage() { Message = "Hello MediatRPC 1" });
Console.WriteLine(JsonSerializer.Serialize(responseMessage1));Console.WriteLine();var responseMessage2 = await mediatRpcClient.Publish(new TestNotificationMessage() { Message = "Hello MediatRPC 2" });
Console.WriteLine(responseMessage2);Console.ReadKey();

1c0cfc498bf4898fa51d92e6a9b50ce0.png

MediatRpcClient是我實現的客戶端對象,它分別向服務端發送了兩個消息,一個是用Send發送了IRequest消息,并打印返回消息。另一個是用Publish發送了INotification消息,打印是否執行成功。消息發送和接收方式和MediatR一摸一樣, 因為方法簽名直接抄襲了MediatR。宗旨就是,怎么使用MediatR就怎么使用MediatRPC。

服務端處理Request消息的Handler代碼如下:

c54cbd1bb2e3867198a0a4dea90ca39a.png

public class TestRequestMessageHandler : IRequestHandler<TestRequestMessage, TestResponseMessage>{public TestRequestMessageHandler(){}public async Task<TestResponseMessage> Handle(TestRequestMessage request, CancellationToken cancellationToken){TestResponseMessage testResponseMessage = new TestResponseMessage();testResponseMessage.Message = $"ACK:{request.Message},{DateTime.Now.ToString("HH:mm:ss")}";return testResponseMessage;}}

4dca1c5428736df8121cae6e34ce7586.png

啟動客戶端:

dce74cf83fe69109c0a92c4968b50a41.png

Request 和 Response Package是我封裝的消息包,參考了Http包的實現,也分為Headers和Body。Request 包將原來Http包的請求路徑改為MediaRMethod,讓服務端知道如何處理這個消息。調用日志每一步都打印的很清楚,不再贅述。

因篇幅關系,具體的服務端和客戶端通訊實現方式將在下一篇展開,明天就會發布,也會發布源代碼。

五、找工作

? 博主有15年以上的軟件技術實施經驗(Technical Leader),專注于微服務(Dapr)和云原生(K8s)軟件架構設計、.Net Core、Java開發和Devops構建發布。
? 博主10年以上的軟件交付管理經驗(Project Manager & Product Ower),致力于敏捷(Scrum)項目管理、軟件產品業務需求分析和原型設計。
? 博主熟練配置和使用 Microsoft Azure云。
? 博主為人誠懇,積極樂觀,工作認真負責。?

我家在廣州,也可以去深圳工作。做架構師、產品經理、項目經理都可以。有工作機會推薦的朋友可以加我微信 15920128707,微信名字叫Jerry。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281151.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281151.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281151.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

新鮮抓取古文賞析五千篇

新鮮抓取的古文&#xff0c;有感興趣的可以來看看。-IT源點-古文賞析 外科精義 黃景昌-古詩文選集 鼎鐫陳眉公先生批評西廂記 世醫得效方 汪炎昶-古詩文選集 至正條格 樂郊私語 敖氏傷寒金鏡錄 十四經發揮 宋史 草澤狂歌 世醫得效方 : 二十卷. 衛生寶鑒 遼史 陳深-古詩文選集 …

wii拆機_設置防磚保護以保護和增強Wii

wii拆機We’ve shown you how to hack your Wii for homebrew software, emulators, and DVD playback, now it’s time to safeguard your Wii against bricking and fix some annoyances—like that stupid “Press A” health screen. 我們已經向您展示了如何破解Wii的自制軟…

Pyhton學習——Day25

#面向對象的幾個方法#1.靜態方法staticmethod&#xff0c;不能訪問類屬性&#xff0c;也不能訪問實例屬性&#xff0c;只是類的工具包#2.類方法&#xff1a;classmethod&#xff0c;在函數屬性前加上類方法&#xff0c;顯示為(cls)代表類&#xff0c;類能訪問到數據屬性和函數屬…

龍芯IPC追平Zen2 穩步推進產業生態

日前&#xff0c;2022年信息技術自主創新高峰論壇在南京成功召開&#xff0c;來自政府、產業、各行業領域的領導、專家學者、企業代表齊聚長江之濱&#xff0c;共話信息產業自主創新發展。鐵流談談會上幾個亮點。龍芯LA664追平AMD zen2相對于一些技術引進CPU在引進海外技術后CP…

攝像頭水平視野垂直視野?_如何在“動物穿越:新視野”中的夢中游覽某人的島嶼...

攝像頭水平視野垂直視野?The promised second summer update for Animal Crossing: New Horizons has been released, and it restores the ability to visit another player’s island in your dreams. Before you can do so, though, you’ll need a Nintendo Online member…

中文版onlyoffice鏡像制作

原文同步于&#xff1a;https://www.daxueyiwu.com/post/761 拉取5.4.2.46版本onlyoffice/documentserver鏡像 docker pull onlyoffice/documentserver:5.4.2.46 該版本是支持20個連接數破解限制的最后一個版本&#xff0c;也是對中文字體界面顯示中文不亂碼支持比較好的一個版…

C++中的namespace ----轉載

轉自&#xff1a;http://blog.csdn.net/yao_zhuang/article/details/1853625 namespace中文意思是命名空間或者叫名字空間&#xff0c;傳統的C&#xff0b;&#xff0b;只有一個全局的namespace&#xff0c;但是由于現在的程序的規模越來越大&#xff0c;程序的分工越來越細&am…

使用訪問控制策略訪問服務網格內的服務

當在實施服務網格時&#xff0c;不可避免的存在網格外服務訪問網格內服務的情況&#xff0c;也就是服務網格的平滑落地。這種中間狀態可能會持續較長的時間&#xff0c;也是我們在落地的時候需要解決的問題之一。又或者&#xff0c;有的應用處于某些考慮并不適合使用服務網格&a…

Scrapy從理論到爬圖

Scrapy系列教程&#xff1a; https://www.daxueyiwu.com/post/71 scrapy爬蟲啟示錄-小伙子老夫看你血氣方剛這本《爬蟲秘錄》就傳給你了 0 點贊 ? 0 回復 ? 5月前 Scrapy初章-Scrapy理論簡介 0 點贊 ? 0 回復 ? 5月前 Scrapy次章-啥也不干就是爬圖 0 點贊 ? 0 回復 ? 5月…

gfi截圖_GFI Backup Home Edition是Windows的免費數據備份實用程序

gfi截圖In today’s tough economic times the last thing you want is to lose important data because you couldn’t afford a quality backup utility. Today we look at GFI Backup Home Edition, a completely free professional grade backup solution. 在當今艱難的經…

需求工程閱讀筆記03

需求工程與運營商技術管理人員的結合點思考&#xff1b; 運營商的技術管理人員有時會發現自己處于比較尷尬的一個境地&#xff0c;因為一方面自己并不直接開發、實現各種系統&#xff0c;而都是采用外包的方式&#xff0c;業務的需求都是經由自己再轉給外包方&#xff0c;感覺自…

使用BeetleX.MQTT構建服務

已經有很長一段時間沒有寫代碼&#xff0c;為了不讓自己的代碼技能有所下降所以針對BeetleX擴展了一個MQTT協議來保持自己的代碼設計和編寫能力。接下來簡單介紹一下如何使用BeetleX.MQTT來構建對應的TCP或WebSocket服務。 以下實現是針對MQTT 3.1.1版本&#xff0c;協議的實…

vlc 視頻流跳數_如何解決在播放高清晰度視頻文件的VLC中跳過和滯后的問題

vlc 視頻流跳數VLC is the king of all media… it plays almost anything on any platform, any time, any place. It’s great. Lately, however, I’ve been having issues with VLC skipping whenever I’m playing high-def media streaming over a network. VLC是所有媒體…

求助:關于sql如何統計時間的問題

三、現在我們假設應用計時分為app應用和web應用&#xff0c;需要考慮如下幾個方面&#xff1a; &#xff08;1&#xff09;多時間段&#xff08;2&#xff09;表中有冗雜數據 &#xff08;3&#xff09;用戶是在web端和app端都登陸&#xff0c;這種類型的重復時間段只能取其一 …

onlyoffice中文字體下載

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/778 下劃線開頭的是頁面顯示中文的字體&#xff0c;不帶下劃線的是頁面顯示英文的字體 calibri.ttf -CalibriTimes New Roman.ttf _FANGSONG.otf -仿宋FANGSONG.otf_FS_GB2312.otf -仿宋_GB2312_HWZS.otf -華文…

onlyoffice 20并發限制處理

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/31 開源版本連續打開20個頁面就會彈出該提示。 一.方案一 修改六個app.js文件 find ./ -name app.js 目錄下所有app.js文件&#xff0c;對代碼行進行修改&#xff0c;只是經過簡單的測試&#xff0c;希望發現…

[Linux環境]-centos7下安裝jdk1.8.0_141流程.

1.查看當前虛擬機java環境版本: java -version [rootcentos-linux-7 bin]# java -version java version "1.7.0_111" OpenJDK Runtime Environment (rhel-2.6.7.2.el7_2-x86_64 u111-b01) OpenJDK 64-Bit Server VM (build 24.111-b01, mixed mode) 2.查看當前安裝版…

石橋圖里的一個故事

唐朝詭事錄有一個石橋圖章節&#xff0c;里面記載了一個故事。十年前&#xff0c;南州鄉賢謝員外的兩個兒子&#xff0c;要求謝家的老仆人帶自己去湖里游玩。哪知游玩到湖中間&#xff0c;突然下起了瓢潑大雨&#xff0c;員外家的一個兒子被驚嚇掉落水里。老仆人的兒子趕忙去救…

onlyoffice更新中文字體總結

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/760 1. 通過字體修改軟件FontCreator修改字體名稱 &#xff08;1&#xff09;下載fontcreat.exe &#xff08;2&#xff09;將Windows/fonts 下的字體文件拷貝至 我的文檔/fonts (3) 使用fontcreat打開字體…

ubuntu 鍵盤快捷鍵_如何使用鍵盤快捷鍵在Ubuntu中提高生產力

ubuntu 鍵盤快捷鍵diceareawesome1/Shutterstock.comdiceareawesome1 / Shutterstock.comWe’re always looking for new ways to speed up everyday tasks in Ubuntu. We’ll show you some keyboard shortcuts you might not have known about, and show you how to make you…