当前位置: 首页 > news >正文

C# 实现 gRPC高级通信框架简单实现

1. 前言

gRPC(Google Remote Procedure Call)是一个高性能、开源和通用的RPC框架,由Google主导开发。它支持多种编程语言,并广泛用于构建分布式应用程序和服务。gRPC基于HTTP/2协议,支持双向流、请求-响应和多请求-多响应模式,这使得它在微服务架构中尤其有用。


2. gRPC的使用场景包括:

  • 微服务架构: 在微服务架构中,服务通过网络进行通信。以高效、简洁的方式通信,支持多种编程语言,便于构建跨语言的服务。
  • API开发: 开发RESTful API时,gRPC可以作为替代方案,提供更高效的数据传输和更强的类型安全性。
  • 内部服务通信: 在大型系统中,内部服务间的通信可以通过gRPC进行优化,减少网络延迟和提升数据传输效率。
  • 实时应用: 对于需要实时数据交换的应用,如实时聊天应用、在线游戏等,gRPC的双向流特性非常有用。
  • 物联网(IoT)设备: 在物联网项目中,设备间的通信可以通过gRPC简化,尤其是在需要高效数据传输的场景中。
  • 跨平台应用: 由于gRPC支持多种编程语言,它非常适合开发需要跨平台支持的应用和服务。

3. gRPC的关键特性:

  • 高效的序列化: 使用Protocol Buffers(protobuf),这是一种轻便且高效的语言无关的数据序列化格式。

  • 跨语言支持: 支持多种编程语言,如C++, Java, Python, Go, Ruby, C#等。

  • 高性能: 基于HTTP/2协议,支持流的特性,可以高效地处理大量并发请求。

  • 安全性: 支持TLS/SSL加密,保护数据传输安全。

  • 易于使用: 通过自动生成客户端和服务器端代码,简化了API的开发和调用。


4. 如何开始使用gRPC:

定义服务: 使用.proto文件定义服务接口和数据结构。

生成代码: 使用protoc编译器根据.proto文件生成客户端和服务端代码。

实现服务: 实现服务端的逻辑。

编写客户端: 编写客户端调用服务端的代码。

测试和部署: 测试应用并部署到生产环境。


1. 环境准备

安装 NuGet 包

在 ASP.NET Core 项目中,需安装以下包:

dotnet add package Grpc.AspNetCore
dotnet add package Google.Protobuf
dotnet add package Grpc.Net.Client
Protocol Buffers 文件

gRPC 依赖 .proto 文件定义服务接口。创建一个 .proto 文件(例如 greeter.proto),并定义服务和消息类型。


2. 定义 .proto 文件

syntax = "proto3";// 定义消息类型
message HelloRequest {string name = 1;
}message HelloResponse {string message = 1;
}// 定义服务接口
service Greeter {// 单向调用(Unary)rpc SayHello (HelloRequest) returns (HelloResponse);// 服务端流式调用(Server Streaming)rpc SayHellos (HelloRequest) returns (stream HelloResponse);// 客户端流式调用(Client Streaming)rpc TotalGreetings (stream HelloRequest) returns (HelloResponse);// 双向流式调用(Bidirectional Streaming)rpc Chat (stream HelloRequest) returns (stream HelloResponse);
}

3. 生成 C# 代码

使用 protoc 编译器

安装 protoc 和 C# 插件,然后生成代码:

protoc --csharp_out=. --grpc_out=. greeter.proto --plugin=protoc-gen-grpc=路径/to/grpc_csharp_plugin
在 Visual Studio 中集成

通过 NuGet 安装 Grpc.Tools 包,然后在项目文件中配置 .proto 文件的编译:

<ItemGroup><Protobuf Include="Protos\greeter.proto" GrpcServices="Server" />
</ItemGroup>

4. 实现 gRPC 服务端(ASP.NET Core)

配置 ASP.NET Core

Startup.cs 中配置 gRPC 服务:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddGrpc();}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapGrpcService<GreeterService>(); // 注册服务endpoints.MapGet("/", () => "gRPC Service is running.");});}
}
实现服务逻辑

继承生成的抽象类并实现方法:

public class GreeterService : Greeter.GreeterBase
{// 单向调用(Unary)public override Task<HelloResponse> SayHello(HelloRequest request, ServerCallContext context){return Task.FromResult(new HelloResponse { Message = "Hello, " + request.Name });}// 服务端流式调用(Server Streaming)public override async Task SayHellos(HelloRequest request, IServerStreamWriter<HelloResponse> responseStream, ServerCallContext context){for (int i = 0; i < 3; i++){await responseStream.WriteAsync(new HelloResponse { Message = $"Hello {i + 1}: " + request.Name });await Task.Delay(1000);}}// 客户端流式调用(Client Streaming)public override async Task<HelloResponse> TotalGreetings(IAsyncStreamReader<HelloRequest> requestStream, ServerCallContext context){int count = 0;while (await requestStream.MoveNext()){count++;}return new HelloResponse { Message = $"Received {count} greetings!" };}// 双向流式调用(Bidirectional Streaming)public override async Task Chat(IAsyncStreamReader<HelloRequest> requestStream, IServerStreamWriter<HelloResponse> responseStream, ServerCallContext context){while (await requestStream.MoveNext()){var request = requestStream.Current;await responseStream.WriteAsync(new HelloResponse { Message = "Echo: " + request.Name });}}
}

5. 实现 gRPC 客户端

创建客户端
using Grpc.Core;
using Grpc.Net.Client;
using System.Threading.Tasks;public class GreeterClient
{private readonly Greeter.GreeterClient _client;public GreeterClient(){// 创建 gRPC 通道(使用 HTTP/2)var channel = GrpcChannel.ForAddress("https://localhost:5001");_client = new Greeter.GreeterClient(channel);}// 单向调用(Unary)public async Task UnaryCall(){var reply = await _client.SayHelloAsync(new HelloRequest { Name = "World" });Console.WriteLine($"Greeter client received: {reply.Message}");}// 服务端流式调用(Server Streaming)public async Task ServerStreamingCall(){using var call = _client.SayHellos(new HelloRequest { Name = "Streaming" });await foreach (var response in call.ResponseStream.ReadAllAsync()){Console.WriteLine($"Server streaming: {response.Message}");}}// 客户端流式调用(Client Streaming)public async Task ClientStreamingCall(){var requestStream = _client.TotalGreetings();for (int i = 0; i < 3; i++){await requestStream.RequestStream.WriteAsync(new HelloRequest { Name = $"Request {i + 1}" });await Task.Delay(1000);}await requestStream.RequestStream.CompleteAsync();var response = await requestStream.ResponseAsync;Console.WriteLine($"Client streaming result: {response.Message}");}// 双向流式调用(Bidirectional Streaming)public async Task BidirectionalStreamingCall(){var call = _client.Chat();var writerTask = Task.Run(async () =>{for (int i = 0; i < 3; i++){await call.RequestStream.WriteAsync(new HelloRequest { Name = $"Message {i + 1}" });await Task.Delay(1000);}await call.RequestStream.CompleteAsync();});await foreach (var response in call.ResponseStream.ReadAllAsync()){Console.WriteLine($"Bidirectional streaming response: {response.Message}");}}
}

6. 测试服务

启动服务端

运行 ASP.NET Core 应用,服务端监听在 https://localhost:5001

运行客户端
public static async Task Main(string[] args)
{var client = new GreeterClient();await client.UnaryCall(); // 单向调用await client.ServerStreamingCall(); // 服务端流式await client.ClientStreamingCall(); // 客户端流式await client.BidirectionalStreamingCall(); // 双向流式
}

关键点总结

  1. 依赖安装:确保 Grpc.AspNetCoreGrpc.Tools 包已安装。
  2. .proto 文件:定义服务接口和消息类型,使用 protoc 生成 C# 代码。
  3. 服务端配置:在 ASP.NET Core 中注册 gRPC 服务。
  4. 流式通信
    • 服务端流式:通过 IServerStreamWriter 发送多条响应。
    • 客户端流式:通过 IAsyncStreamReader 读取多条请求。
    • 双向流式:同时处理请求和响应流。
  5. 客户端调用:使用 GrpcChannel 创建连接,调用生成的客户端接口。

简单实现完整的 gRPC 服务和客户端,支持多种通信模式。这里就开了个头,具体业务具体分析

http://www.xdnf.cn/news/1059463.html

相关文章:

  • 稀疏大模型架构与训练算法研究
  • MongoDB学习记录(快速入门)
  • 7.索引库操作
  • 使用duckduckgo_search python api 进行免费且不限次数的搜索
  • 设计模式精讲 Day 6:适配器模式(Adapter Pattern)
  • 设计模式之责任链模式
  • 《仿盒马》app开发技术分享--未完成订单列表展示逻辑优化(61)
  • SKUA-GOCAD入门教程-第八节 线的创建与编辑5
  • C/Fortran多核并行计算
  • wireshark过滤器的使用
  • tomcat 配置规范
  • stack 和 queue练习
  • 【面试题001】生产环境中如何排查MySQL CPU占用率高达100%?
  • linux kernel优化之rootfs
  • CANFD加速是什么?和CANFD有什么区别?
  • linux 下 jenkins 构建 uniapp node-sass 报错
  • 使用@SpringJUnitConfig注解开发遇到的空指针问题
  • spring-webmvc @InitBinder 典型用法
  • 《挑战你的控制力!开源项目小游戏学习“保持平衡”开发解析:用HTML+JS+CSS实现物理平衡挑战》​
  • 【51单片机】8. 矩阵LED显示自定义图案、动画
  • 用idea操作git缓存区回退、本地库回退、远程库回退
  • singlefligt使用方法和源码解读
  • 无需公网IP:Termux+手机+内网穿透实现Minecraft远程多人联机
  • Uniapp 中根据不同离开页面方式处理 `onHide` 的方法
  • python3:线程管理进程
  • 前端打断点
  • python校园服务交流系统
  • 第十八天:初级数据库学习笔记2
  • easyexcel基于模板生成报表
  • RabbitMQ七种工作模式