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.mzph.cn/news/281151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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的自制软…

龙芯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;也是对中文字体界面显示中文不乱码支持比较好的一个版…

使用访问控制策略访问服务网格内的服务

当在实施服务网格时&#xff0c;不可避免的存在网格外服务访问网格内服务的情况&#xff0c;也就是服务网格的平滑落地。这种中间状态可能会持续较长的时间&#xff0c;也是我们在落地的时候需要解决的问题之一。又或者&#xff0c;有的应用处于某些考虑并不适合使用服务网格&a…

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. 在当今艰难的经…

使用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是所有媒体…

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;希望发现…

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…

Ubuntu 桌面系统升级

本文介绍 Ubuntu 桌面系统升级的两种方式&#xff0c;通过 UI 或命令行的方式&#xff0c;演示为 20.04 升级为 22.04。并介绍了 windows 的 Linux 子系统 wsl 的升级注意事项。背景之前在学习 ROS2 时&#xff0c;安装 ros-humble-desktop 出现依赖错误&#xff1a;无法修正错…

onlyoffice修改左上角的logo

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/770 1. 商用版config里配置就能修改logo "editorConfig": {"customization": {"logo": {"image": "https://example.com/logo.png","imageEmbedded&q…

pidgin qq_Pidgin入门指南,通用消息客户端

pidgin qqIf you find chatting with multiple chat clients troublesome, then Pidgin is the tool for you. In today’s article, we’ll show you how to connect to popular chat networks, encrypt your conversations, and render mathematical formula in Pidgin. 如果…

记一次 .NET 某自动化采集软件 崩溃分析

一&#xff1a;背景 1.讲故事前段时间有位朋友找到我&#xff0c;说他的程序在客户的机器上跑着跑着会出现偶发卡死&#xff0c;然后就崩掉了&#xff0c;但在本地怎么也没复现&#xff0c;dump也抓到了&#xff0c;让我帮忙看下到底怎么回事&#xff0c;其实崩溃类的dump也有简…

如何在 .NET MAUI 中加载 json 文件?

引言:按.NET core传统方式添加 AddJsonFile("appsettings.json") 在windows平台和ssr工作正常,但是在 ios 和 android 无法用这种方式,因为资源生成方式不一样. 使用内置资源方式不够灵活而且 ios 平台会提示不能复制 json 文件到目录,于是进行了几天的研究,终于能正…

SSH整合注解版(Spring+Struts2+Hibernate)

整体架构&#xff1a; pom.xml 引入maven节点&#xff1a; <dependencies><!--单测--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.3</version><scope>test</scope><…

定时插座动一下就断_使用插座定时器在某些时候自动将您的Amazon Echo静音

定时插座动一下就断The Amazon Echo is an always-listening voice-controlled virtual assistant, but if there are times you’d rather not listen (or be listened to) by the Echo, here’s how to automatically mute it at certain times of the day. Amazon Echo是一个…

周末读书:《红楼梦》

【周末读书】| 作者/Edison大家好&#xff0c;我是Edison。古人曾说“开谈不说红楼梦&#xff0c;读尽诗书也枉然”&#xff0c;刚好最近我爸开始在阅读《红楼梦》&#xff0c;我想起当年看了两遍《红楼梦》原著和一遍87版《红楼梦》电视剧的场景。本文是我首发于2018年的一篇读…