本文将和大家推荐一个我所在团队开源的本机多进程通讯 IPC 库,此 IPC 支持使用 JSON 格式进行直接路由通讯,具有使用方便,稳定性高,性能好的优点

这是我所在的团队在 GitHub 上使用最友好的 MIT 协议完全开源的项目:https://github.com/dotnet-campus/dotnetCampus.Ipc

这个开源项目开源的是一个 IPC 库,而本文将要介绍的是这个 IPC 库其中的一个功能:使用 Json 格式进行直接路由通讯

接下来我将一步步告诉大家如何使用这个功能实现本机多进程通讯

按照 dotnet 的惯例,先安装 NuGet 库。可以通过右击项目进入 NuGet 管理器,搜 dotnetCampus.Ipc 进行安装,也可以编辑 csproj 项目文件进行快速安装,如添加以下代码到你的 csproj 项目文件里面

<PackageReference Include="dotnetCampus.Ipc" Version="2.0.0-alpha405" />

原本的这个 IPC 库设计上是 P2P 的方式,也就是没有明确的客户端和服务端。只是在使用直接路由方式进行通讯的时候,在概念上有服务端和客户端。在本文接下来的描述里面会明确说明客户端和服务端的逻辑,但底层上依然是 P2P 模式,不存在让某个进程作为本质的服务端或客户端,每个进程都可以既是客户端又是服务端

先编写创建服务端的代码逻辑。服务端需要给一个服务名,客户端可以通过此服务名连接上服务端,从设计上只允许客户端主动连接服务端。服务名从底层上将会作为管道名,请使用符合管道命名规则的方式进行命名,一般都是英文字符大小写加上数字下划线

            // 初始化服务端
var serverName = "JsonIpcDirectRoutedProviderTest_Request_1";
var serverProvider = new JsonIpcDirectRoutedProvider(serverName);

这个 JsonIpcDirectRoutedProvider 类型只是一个 JSON 直接路由的 IPC 提供器,构造函数可选传入 IPC 配置,比如配置注入日志设置日志输出等级

在服务端上可以定义响应和通知的处理逻辑,以下代码定义的是对名为 “Foo1” 的直接路由的请求的处理逻辑

            serverProvider.AddRequestHandler("Foo1", (FakeArgument arg) =>
{
return new FakeResult("Ok");
});

请求处理也就是客户端发起一个请求给到服务端进行处理,服务端处理完成之后返回响应内容给到客户端。以上的 FakeArgument 类型参数就是由客户端发送给到服务端的参数内容,客户端发送到服务端的参数内容将会见过 Json 的序列化和反序列化的过程。接下来服务端的 FakeResult 返回值将作为响应,通过 IPC 传输给到客户端,也会经过序列化和反序列化的过程

服务端定义通知的处理逻辑例子如下,通知只有从客户端发过来的参数,不需要返回任何对象给到客户端,即客户端只是发过来一条通知给到服务端

            var routedPath = "FooPath";
serverProvider.AddNotifyHandler(routedPath, (FakeArgument arg) =>
{
});

同理,通知的 FakeArgument 参数也会经过序列化和反序列化的过程

服务端完成了路由事件的定义之后,即可通过 StartServer 方法进行启动

            serverProvider.StartServer();

从 IPC 的设计上,要求在 StartServer 启动服务之前完成所有对路由事件的定义。在 StartServer 之后,禁止再 AddRequestHandler 或 AddNotifyHandler 添加处理逻辑。此设计是为了保证消息不丢失,防止存在消息在路由事件定义完成之前收到而丢失

以上连在一起的服务端的定义和启动代码如下

            // 初始化服务端
var serverName = "JsonIpcDirectRoutedProviderTest_Request_1";
var serverProvider = new JsonIpcDirectRoutedProvider(serverName); serverProvider.AddRequestHandler("Foo1", (FakeArgument arg) =>
{
return new FakeResult("Ok");
}); serverProvider.AddRequestHandler("Foo2", (FakeArgument2 arg) =>
{
return new FakeResult2("Ok");
}); serverProvider.AddRequestHandler("Foo3", (FakeArgument3 arg) =>
{
return new FakeResult3("Ok");
}); var routedPath = "FooPath";
serverProvider.AddNotifyHandler(routedPath, (FakeArgument arg) =>
{
}); serverProvider.AddNotifyHandler("FooPath1", (FakeArgument1 arg) =>
{
}); serverProvider.AddNotifyHandler("FooPath2", (FakeArgument2 arg) =>
{
}); serverProvider.StartServer();

从业务实现上,可以将注入处理的逻辑分到多个不同的模块里面,通过传入 JsonIpcDirectRoutedProvider 给到多个模块,让多个模块在依赖注册阶段进行添加处理。完成之后再调用 StartServer 启动服务

以上完成了服务端部分代码的编写,接下来看看客户端部分的代码编写

本质上的 JsonIpcDirectRouted 依然是 P2P 的方式,而不是 客户端-服务端 的方式。客户端的创建也需要从 JsonIpcDirectRoutedProvider 获取到

            // 创建客户端
// 允许无参数,如果只是做客户端使用的话
JsonIpcDirectRoutedProvider clientProvider = new();
// 对于 clientProvider 来说,可选调用 StartServer 方法
var clientProxy = await clientProvider.GetAndConnectClientAsync(serverName);

由于客户端不需要被服务端连接,客户端可以省略构造函数的参数

获取客户端时,需要调用 GetAndConnectClientAsync 方法传入服务端的服务名。如果此时的服务端还没启动,将会在 await 里面异步等待服务端启动且连接上服务端

获取到客户端对象之后,即可对服务器发起请求获取响应,也可以单向给服务端发送通知。以下是对服务端发起请求获取响应的例子

            var argument = new FakeArgument("TestName", 1);
FakeResult result = await clientProxy.GetResponseAsync<FakeResult>("Foo1", argument);

以上代码的 GetResponseAsync 第一个参数表示的是所请求的路由地址,第二个参数是一个对象,将会被 Json 序列化然后发送给服务端。返回值的 FakeResult 是服务端处理的返回值

以下是发送通知给服务端的例子

            var argument = new FakeArgument("TestName", 1);
await clientProxy.NotifyAsync("FooPath", argument);

发送通知时 await 返回只代表服务端收到了通知,不代表服务端处理通知完成

连在一起的客户端创建和通讯的代码如下

            // 创建客户端
// 允许无参数,如果只是做客户端使用的话
JsonIpcDirectRoutedProvider clientProvider = new();
// 对于 clientProvider 来说,可选调用 StartServer 方法
var clientProxy = await clientProvider.GetAndConnectClientAsync(serverName); var result = await clientProxy.GetResponseAsync<FakeResult>("Foo1", argument); await clientProxy.NotifyAsync("Foo1", argument);

以上就是此 IPC 库的使用 Json 直接路由事件方式进行通讯的简单例子

此 IPC 库不仅提供了本文介绍的 Json 直接路由通讯方式,还可以使用 IPC 对象通讯方式,就如同 .NET Remoting 的用法差不多,详细请看 dotnet 6 推荐一个可代替 .NET Remoting 的 IPC 库

dotnet 推荐一个使用 Json 直接路由通讯的 IPC 库的更多相关文章

  1. 推荐一个在线json数据格式化网站

    json数据非常友好方便的处理: 推荐一个在线json数据格式化网站 http://json.parser.online.fr/

  2. 推荐一个非常牛逼的并发httpful的库(php)

    MultiHttp :结合了libcurl多线程.httpful方式的PHP库 This is high performance curl wrapper written in pure PHP. I ...

  3. 极力推荐一个简单好用的C++JSON库

      极力推荐一个简单好用的C++JSON库CJsonObject,让使用json如使用C++原生的结构体那般方便,随心所欲.CJsonObject是个优秀的C++JSON库,也许会是你见过的最为简单易 ...

  4. dotnet 替换 ASP.NET Core 的底层通讯为命名管道的 IPC 库

    这是一个用于本机多进程进行 IPC 通讯的库,此库的顶层 API 是采用 ASP.NET Core 的 MVC 框架,其底层通讯不是传统的走网络的方式,而是通过 dotnetCampus.Ipc 开源 ...

  5. 最近学习工作流 推荐一个activiti 的教程文档

    全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...

  6. 一个进程间同步和通讯的 C# 框架

    转自原文 一个进程间同步和通讯的 C# 框架 threadmsg_demo.zip ~ 41KB    下载 threadmsg_src.zip ~ 65KB    下载 0.背景简介 微软在 .NE ...

  7. 『练手』手写一个独立Json算法 JsonHelper

    背景: > 一直使用 Newtonsoft.Json.dll 也算挺稳定的. > 但这个框架也挺闹心的: > 1.影响编译失败:https://www.cnblogs.com/zih ...

  8. 推荐一个.NET(C#)的HTTP辅助类组件--restsharp

    互联网上关于.NET(C#)的HTTP相关的辅助类还是比较多的,这里再为大家推荐一个.NET的HTTP辅助类,它叫RestSharp.RestSharp是一个轻量的,不依赖任何第三方的组件或者类库的H ...

  9. 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler定时器

    在C#WINFORM或者是ASP.NET的WEB应用程序中,根据各种定时任务的需求,比如:每天的数据统计,每小时刷新系统缓存等等,这个时候我们得应用到定时器这个东东. .NET Framework有自 ...

  10. 推荐一个实用的css工具

    后台程序员整天在和数据打交道,天天的活就是抱着mysql抠数据,如果让他去写网站的样式,就让人感觉力不从心,所以推荐一个twitter的团队开发的东西,几乎囊括了网站所需的样式,http://www. ...

随机推荐

  1. HeaderedContentControl实现左右对称

    在我们使用TextBlock却想给前面添加固定字段的时候,发现TextBlock没有Header属性, 这个时候我们可以用到HeaderedContentControl 然而,默认情况下Headere ...

  2. WPF设置传参、点击按钮改变长度

    前台代码 <!-- 通过传递ElementName --> <Button x:Name="btn1" Width="200" Height= ...

  3. Kubernetes客户端认证(三)—— Kubernetes使用CertificateSigningRequest方式签发客户端证书

    1.概述 在<Kubernetes客户端认证(一)-- 基于CA证书的双向认证方式>和<Kubernetes客户端认证(二)-- 基于ServiceAccount的JWTToken认 ...

  4. C# 通用OCR识别 文字识别 中文识别

    软件说明 基于以下两个开源项目,做了再次封装 https://github.com/paddlepaddle/PaddleOCR PaddleOCRSharp: 本项目是一个基于PaddleOCR的C ...

  5. cadence板图设计基本操作

    基于cadence的四位全加器设计及仿真. 1.实验原理 板图,也就是芯片的原理图.通过学习板图的绘制,可以有效地提高对芯片的工作原理的认识.在版图设计中,需要掌握许多的规则,能够按照特定的规范优化, ...

  6. KinbaseES 优化之IO优化

    IO 资源作为目前服务器中最昂贵的资源之一,是目前绝大部分业务系统主要的瓶颈资源,原因就在于服务器相关的硬件资源中IO资源的性能提升是难度最大的.存储的发展步伐远低于内存和CPU的发展. 在数据库管理 ...

  7. CentOS 7 上搭建nginx来部署静态网页

    目录 0. Nginx简介 1. 安装以及使用 1.1 安装和启动 1.2 配置服务器的访问地址 1.3 重启nginx,打开浏览器访问 0. Nginx简介 Nginx (engine x) 是一个 ...

  8. mybatis踩坑之integer类型是0的时候会被认为0!=''是假

    当你的参数类型是integer类型,并且传的是0的时候,在SQL里面做if判断的时候 <if test="auditStatus != null and auditStatus != ...

  9. #树形dp#洛谷 3687 [ZJOI2017]仙人掌

    题目 给定一个简单无向连通图,问有多少种加边方案使得这个图变成简单仙人掌. 分析 首先找到一棵生成树,考虑其它非树边所对应的树的路径上的边最多只能用一次, 这可以用树上差分做,如果一个点到其父节点的边 ...

  10. #整体二分 or 主席树#洛谷 7424 [THUPC2017] 天天爱射击

    题目 给定\(n\)条线段\(x_i,y_i,k_i\)和\(m\)个点(点有顺序), 对于每个点,问有多少条线段是第\(k_i\)次被该点经过. 分析(主席树) 将点按坐标排序建主席树那么就是一道静 ...