StreamJsonRpc 是微软开发的一个开源库,用于在 .NET 平台中实现基于 JSON-RPC 2.0 规范 的远程过程调用(RPC)。它通过流(如管道、网络流等)实现高效的跨进程或跨网络通信,特别适用于需要轻量级、灵活通信的场景。以下是对 StreamJsonRpc 的详细介绍,结合你提供的参考文章中的关键点:
1. 核心特性
- 基于流的通信 支持通过 Stream、Pipe 或 IDuplexPipe 进行数据传输,适用于管道、网络套接字、WebSocket 等多种底层传输机制。
- 双向通信 允许客户端和服务端互相调用方法,实现双向交互(如客户端发起请求,服务端主动推送通知)。
- 强类型支持 通过接口定义契约,方法调用和参数传递均支持强类型,减少手动序列化/反序列化的工作。
- 异步模型 所有方法默认支持异步(async/await),适合高并发和低延迟场景。
- 跨平台兼容 兼容 .NET Standard 2.0,可在 .NET Core、.NET Framework 和 Xamarin 等环境中使用。
- 扩展性 提供自定义消息格式化(如 MessagePack 或自定义 JSON 序列化器)、错误处理、日志记录等扩展点。
2. 在 ASP.NET Core 中的集成
参考文章展示了如何将 StreamJsonRpc 集成到 ASP.NET Core 应用中,实现基于 HTTP 或 WebSocket 的 RPC 通信。以下是关键步骤:
2.1 配置服务端
- 添加 NuGet 包
- <p>Install-Package StreamJsonRpc</p>
复制代码 Plain Text
- 定义 RPC 接口
- <p>public interface IGreeterRpcService</p><p>{</p><p> Task<string> GreetAsync(string name);</p><p>}</p>
复制代码 Plain Text
- 实现服务
- <p>public class GreeterRpcService : IGreeterRpcService</p><p>{</p><p> public Task<string> GreetAsync(string name) => Task.FromResult($"Hello, {name}!");</p><p>}</p>
复制代码 Plain Text
- 配置 ASP.NET Core 中间件 使用 UseWebSockets() 启用 WebSocket 支持,并处理 RPC 请求:
- <p>app.UseWebSockets();</p><p>app.Use(async (context, next) =></p><p>{</p><p> if (context.WebSockets.IsWebSocketRequest)</p><p> {</p><p> using var webSocket = await context.WebSockets.AcceptWebSocketAsync();</p><p> var service = new GreeterRpcService();</p><p> await StreamJsonRpc.Attach(webSocket, service);</p><p> }</p><p> else await next();</p><p>});</p>
复制代码 Plain Text
2.2 客户端实现
客户端通过 WebSocket 或其他流连接到服务端,并调用远程方法:- <p>var webSocket = new ClientWebSocket();</p><p>await webSocket.ConnectAsync(new Uri("ws://localhost:5000"), CancellationToken.None);</p><p>
- </p><p>var greeter = StreamJsonRpc.JsonRpc.Attach<IGreeterRpcService>(webSocket);</p><p>string result = await greeter.GreetAsync("World");</p><p>Console.WriteLine(result); // 输出 "Hello, World!"</p>
复制代码
3. 高级用法
- 双向方法调用 客户端和服务端均可定义接口,实现双向通信。例如,服务端可以主动通知客户端:
- <p>// 定义客户端可调用的接口</p><p>public interface IClientCallback</p><p>{</p><p> Task NotifyAsync(string message);</p><p>}</p><p>
- </p><p>// 服务端方法中调用客户端</p><p>public async Task SendNotificationAsync()</p><p>{</p><p> var callback = JsonRpc.GetRpcTarget<IClientCallback>();</p><p> await callback.NotifyAsync("New event!");</p><p>}</p>
复制代码 Plain Text
- 自定义序列化 默认使用 System.Text.Json,但可替换为其他序列化器(如 Newtonsoft.Json):
- <p>var options = new JsonRpcOptions</p><p>{</p><p> MessageFormatter = new SystemTextJsonFormatter()</p><p>};</p><p>StreamJsonRpc.Attach(stream, service, options);</p>
复制代码 Plain Text
- 错误处理 通过 JsonRpcException 捕获远程调用异常,支持自定义错误码和数据:
- <p>try</p><p>{</p><p> await greeter.GreetAsync("error");</p><p>}</p><p>catch (JsonRpcException ex)</p><p>{</p><p> Console.WriteLine($"Error Code: {ex.ErrorCode}, Message: {ex.Message}");</p><p>}</p>
复制代码 Plain Text
- 使用 MemoryPool 或 BufferManager 减少内存分配。
- 启用 MessagePack 二进制协议以降低传输开销:
- <p>Install-Package StreamJsonRpc.MessagePack</p><p>var formatter = new MessagePackFormatter();</p>
复制代码 Plain Text
4. 适用场景
- 微服务间通信:轻量级替代 gRPC 或 REST。
- AI应用:ModelContextProtocol(MCP)和Agent2Agent(A2A)协议都是使用JSON-RPC 2.0。
- 实时应用:如聊天、实时数据推送(结合 WebSocket)。
- 跨语言集成:通过标准 JSON-RPC 与其他语言(如 Python、JavaScript)交互。
5. 注意事项
- 超时控制:为长时间运行的方法配置 CancellationToken。
6. 参考资源
- 官方文档:https://github.com/microsoft/vs-streamjsonrpc
- JSON-RPC 2.0 规范:jsonrpc.org
- 示例项目:https://github.com/tpeczek/Demo.AspNetCore.StreamJsonRpc
通过 StreamJsonRpc,开发者可以快速构建高效、灵活的 RPC 系统,尤其适合需要自定义通信协议或与现有基础设施集成的场景。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |