一、Grpc概述
gRPC 基于如下思想:定义一个服务, 指定其可以被远程调用的方法及其参数和返回类型。gRPC 默认使用protocol buffers作为接口定义语言,来描述服务接口和有效载荷消息结构。如果有需要的话,可以使用其他替代方案。
定义的服务分为4中类型:
- 单项 RPC,即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用。这种最常用。
- 服务端流式 RPC,即客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止。
- 客户端流式 RPC,即客户端用提供的一个数据流写入并发送一系列消息给服务端。一旦客户端完成消息写入,就等待服务端读取这些消息并返回应答。
- 双向流式 RPC,即两边都可以分别通过一个读写数据流来发送一系列消息。这两个数据流操作是相互独立的,所以客户端和服务端能按其希望的任意顺序读写,例如:服务端可以在写应答前等待所有的客户端消息,或者它可以先读一个消息再写一个消息,或者是读写相结合的其他方式。每个数据流里消息的顺序会被保持。
二、.Net Core中使用Grpc
使用Grpc 就三步:定义Grpc服务、实现Grpc服务、调用Grpc服务。
2.1 定义Grpc服务
1、在VS中选择.Net Core创建类库
2、引入Google.Protobuf、Grpc.Core包
3、创建proto文件,定义一个SsmServer服务,服务中提供两个方法,一个最简单的单项RPC方法,一个双向流式RPC。后面这个文件会生成一个同名的C#类文件。
syntax = "proto3"; //语法指定proto3 package ShenDa.SSM.Grpc; //后面生成C#文件的命名空间 import "Protos/Common.proto"; import "Protos/Health.proto"; import "Protos/User.proto";//指定定义服务中使用的参数的位置 service SsmService{ //健康检查 单项 RPC rpc Health(EmptyRequest) returns (HealthResponse){} //双向流 rpc User_Add(stream UserAddRequest) returns(stream UserAddResponse){} }
定义的Health.proto文件
syntax = "proto3"; package ShenDa.SSM.Grpc; message HealthResponse{ //返回参数 bool Success=1; //每个字段必须要指定序号 string Message=2; }
以上服务就定义完成了。现在需要将这个proto文件生成C#文件,可以使用命令,也可以使用工具。在这里我使用工具生成。
5、引用Grpc.Tools ,然后在工程文件中指定要生成的proto文件。
<ItemGroup> <Protobuf Include="Protos\User.proto" /> <Protobuf Include="Protos\Health.proto" /> <Protobuf Include="Protos\Common.proto" /> <Protobuf Include="Protos\SsmService.proto" /> </ItemGroup>
生成项目,就会在 obj文件夹中生成对应的C#文件。其他文件都是生成对应的实体类,但是定义的服务的proto文件,比较特殊,它会生成一个同名的类文件,类中包含
- 一个抽象类,名称为服务名+Base。其中包含我们定义的虚两个方法
- 一个部分类,名称为服务名+Client,继承ClientBase<服务名Client>
以上所有的Grpc服务都已经定义完了。因为客户端不可能每个都通过添加应用项目的方式使用,所以我们还需要打包客户端Nuget包。
6、生成Nuget包,提供给客户端使用
通过VS设置打包生成Nuget包,生成Grpc客户端Nuget包。
2.2 实现Grpc服务
通过VS的GRPC模板创建项目,定义实现类并继承上面生成的抽象类,然后重写我们定义的方法。
public partial class SsmServiceImpl : SsmService.SsmServiceBase { public override async Task<HealthResponse> Health(EmptyRequest request, ServerCallContext context) { var response = new HealthResponse() { Message = string.Empty, Success = true }; return await Task.FromResult(response); } }
配置Grpc服务
public void ConfigureServices(IServiceCollection services) { services.AddGrpc(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseEndpoints(endpoints => { endpoints.MapGrpcService<SsmServiceImpl>();//注入服务的实现。 endpoints.MapGet("/", async context => { await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/"); }); }); }
项目结构截图:
2.3 客户端调用Grpc
1、添加引用Google.Protobuf、Grpc.Core、Grpc.Net.Client 还有刚才生成的Nuget包ShenDa.SSM.Grpc
2、调用
class Program { static async Task Main(string[] args) { var channel = GrpcChannel.ForAddress("https://localhost:5001"); var client = new SsmServiceClient(channel); await HealthCheck(client); } public static async Task HealthCheck(SsmServiceClient client) { var response = await client.HealthAsync(new EmptyRequest()); System.Console.WriteLine(response.Success "健康" : "连接失败"); } }
总结
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 魔兽世界wlk恶魔术士一键输出宏是什么 wlk恶魔术士一键输出宏介绍
- 医学爱好者狂喜:UP主把医学史做成了格斗游戏!
- PS5 Pro评分解禁!准备升级入手吗?
- 我们盘点了近期火热的国产单机游戏!《琉隐神渡》等 你期待哪款?
- 2019年第12届广州影音展双碟纪念版ADMS2CD[MP3/WAV]
- 黄安《救姻缘》台首版[WAV+CUE]
- 模拟之声慢刻CD《柏林之声4》[正版CD低速原抓WAV+CUE]
- 李宗盛 《李宗盛经典金曲》[WAV+CUE][1G]
- 周华健《粤语精选》[WAV+CUE][1G]
- 蔡婧2024《天空》HQCDII头版限量编号[WAV+CUE][1G]
- 陈奂仁.2011-谁是陈奂仁【BBS】【FLAC分轨】
- 群星.2024-幻乐森林影视原声带【韶愔音乐】【FLAC分轨】
- 黎明.1999-向往金色的黎明新歌+精选2CD【环球】【WAV+CUE】
- 发烧女声Méav《美芙的祈祷》发烧女声 [WAV+CUE][820M]
- 雷婷 《我的爱回不来》紫银合金AQCD [WAV+CUE][1G]