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.pswp.cn/diannao/87411.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87411.shtml

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

相关文章

将项目推到Github

前提条件 需要安装GIT需要注册GitHub账号 步骤 首先我们需要登录我们的GITHUB账号&#xff0c;然后点击新建存储库 然后起一个名字&#xff0c;设置一些私有公开即可 创建完成之后&#xff0c;这里有可以远程推送的命令 后面就直接输出命令即可 之后推送即可 git push orig…

K8S 专栏 —— namespace和Label篇

文章目录 namespace创建namespacenamespace使用默认namespaceLabel添加Label查询Labelnamespace 命名空间是一种用于在 kubernetes 集群中划分资源的虚拟化手段,每个资源都属于一个命名空间,使得多个团队或应用可以在同一个集群中独立运行,避免资源冲突。 创建namespace y…

44.第二阶段x64游戏实战-封包-分析掉落物列表id存放位置

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;43.第二阶段x64游戏实战-封包-代码实现获取包裹物品 之前的内容找到了掉落物的…

汇编语言期末快速过手笔记

一、计算机系统组成 计算机系统组成&#xff1a;由硬件系统和软件系统组成 硬件系统&#xff1a;CPU、存储器、输入/输出设备等物理部件软件系统&#xff1a;操作系统、各种语言、系统软件和应用软件 汇编语言分类 属于低级语言&#xff08;直接面向硬件&#xff09;与高级语言…

C++相比于C语言增加了哪些概念?

C相比于C语言增加了哪些概念&#xff1f; 作者将狼才鲸创建日期2025-06-17 CSDN阅读地址&#xff1a;C相比于C语言增加了哪些概念&#xff1f;Gitee源码目录&#xff1a;qemu/demo_代码示例/02_C_Class 目标受众&#xff1a;熟悉C语言&#xff0c;对C完全不了解&#xff0c;但…

HarmonyOS5 分布式测试:断网情况支付场景异常恢复验证

以下是针对HarmonyOS 5分布式事务在断网支付场景下的异常恢复验证全流程方案&#xff0c;综合关键技术与测试策略&#xff1a; 一、核心事务机制验证 ‌两阶段提交&#xff08;2PC&#xff09;协议‌ 模拟支付流程中网络中断&#xff0c;验证事务协调者能否正确处理预提交与回滚…

【狂飙AGI】第5课:前沿技术-文生图(系列1)

目录 &#xff08;一&#xff09;绘画本质&#xff08;二&#xff09;国内外AI转绘展&#xff08;三&#xff09;创作思路&#xff08;四&#xff09;美学理论&#xff08;1&#xff09;不可能美学&#xff08;2&#xff09;趋无限美学&#xff08;3&#xff09;反物理美学&…

发那科A06B-6290-H124 伺服驱动器

‌FANUC A06B-6290-H124 伺服驱动器核心性能解析‌ ‌一、核心控制能力‌ ‌多模式精密控制‌ 位置控制‌&#xff1a;支持高精度旋转角度/直线位移调节&#xff08;分辨率达脉冲级&#xff09;&#xff0c;适用于数控机床定位&#xff08;误差0.01mm级&#xff09;和机器人轨…

Spring Boot 项目启动优化

Spring Boot 项目启动优化是一个非常重要的话题&#xff0c;尤其是在微服务和云原生环境下&#xff0c;快速启动意味着更快的部署、更高效的弹性伸缩和更好的开发体验。 下面我将从分析诊断、优化策略和终极方案三个层面&#xff0c;为你提供一个全面、可操作的优化指南。 一、…

「爬取豆瓣Top250电影的中文名称」数据采集、网络爬虫

- 第 108 篇 - Date: 2025 - 06 - 16 Author: 郑龙浩&#xff08;仟墨&#xff09; 文章目录 **任务&#xff1a;爬取豆瓣Tap250电影的中文名称****代码****实现效果** 任务&#xff1a;爬取豆瓣Tap250电影的中文名称 代码 # 豆瓣前Tap 250 import requests from bs4 import…

MySQL 多表查询、事务

1.多表查询的分类 1.1 内连接 在 MySQL 中&#xff0c;内连接&#xff08;INNER JOIN&#xff09;返回的是两个表中满足连接条件的记录的交集。这个“交集”不是指整个表&#xff0c;而是指符合连接条件的行组合&#xff0c;也就是A表和B表中满足我们使用on指定条件的记录。图…

CSP-J 2020 入门级 第一轮(初赛) 答案及解析

CSP-J 2020 入门级 第一轮&#xff08;初赛&#xff09; 答案及解析 在内存储器中每个存储单元都被赋予一个唯一的序号&#xff0c;称为&#xff08;&#xff09;。 A. 地址 B. 序号 C. 下标 D. 编号 答: A 计算机中每个存储单元都是1字节&#xff0c;都有唯一的地址。 编译器…

Flutter包管理与插件开发完全指南

Flutter作为Google推出的跨平台移动应用开发框架&#xff0c;其强大的生态系统离不开完善的包管理机制和丰富的插件支持。本文将全面介绍Flutter中的包管理体系和插件开发实践&#xff0c;帮助开发者高效管理项目依赖并扩展应用功能。 一、Flutter包管理基础 1.1 包管理概述 …

【视频直播出海】阿里云ApsaraVideo Live:从零搭建全球直播平台的“星际航行”指南!

【视频直播出海】阿里云ApsaraVideo Live&#xff1a;从零搭建全球直播平台的“星际航行”指南&#xff01; 在全球化浪潮的推动下&#xff0c;视频直播行业正以前所未有的速度跨越国界&#xff0c;成为连接世界的“数字新桥梁”。对于渴望拓展海外市场的企业而言&#xff0c;…

OAuth2中的Token

两个不同的Token OAuth2 中主要有两个不同的Token, 其中的区别为是否与用户相关联, 即与用户相关的用户Token, 和与客户端相关的客户端Token, 可以通过用户Token, 查询到用户的相关信息, 客户端Token与用户无关, 一般只用于客户端认证 用户Token 获取用户Token一般有两个方式…

使用 FastMCP 实现 Word 文档与 JSON 数据互转的 Python 服务

一、项目背景 本文分享一个基于 FastMCP 框架实现的文档处理服务&#xff0c;可实现 Word 文档&#xff08;.docx&#xff09;与 JSON 数据格式的双向转换。通过此服务&#xff0c;开发者可以轻松实现文档内容提取、结构化数据填充、样式模板复用等功能&#xff0c;适用于自动…

Vue3轮播图组件,当前轮播区域有当前图和左右两边图,两边图各显示一半,支持点击跳转和手动滑动切换

功能&#xff1a; 自动循环播放&#xff08;到达末尾后回到第一张&#xff09;、可设置切换间隔时间&#xff08;interval属性&#xff09; 左右导航按钮&#xff08;可自定义显示/隐藏&#xff09; 点击底部指示器跳转到指定幻灯片、且位置可调&#xff08;轮播图内部/外部&…

350+交付案例,高质量低成本构建智慧园区数字孪生交付新范式

在智慧园区建设领域&#xff0c;数字孪生技术正成为推动园区智能化转型的核心引擎。山东融谷信息凭借其全要素、全周期、全方位的数字孪生交付能力&#xff0c;已成功交付350余个项目&#xff0c;覆盖产业园区、智慧楼宇、智慧社区等多元场景&#xff0c;低成本高质量交付&…

OpenCV 图像像素类型转换与归一化

一、知识点 1、OpenCV支持多种数据类型&#xff0c;每种类型都对应着不同的取值范围。 (1)、CV_8U取值范围[0, 255]。 (2)、CV_16U取值范围[0, 65535]。 (3)、CV_32F取值范围[0, 1]。 2、OpenCV提供convertTo()函数来转换数据类型&#xff0c;提供normalize()函数来改…

机器学习算法_支持向量机

一、支持向量机 支持向量机只能做二分类任务 SVM全称支持向量机&#xff0c;即寻找到一个超平面使样本分成两类&#xff0c;且间隔最大 硬间隔&#xff1a;如果样本线性可分&#xff0c;在所有样本分类都正确的情况下&#xff0c;寻找最大间隔&#xff1b;如果出现异常值或样…