protobuf-net.Grpc 笔记

news/2024/11/15 13:35:57/文章来源:https://www.cnblogs.com/KarlAlbright/p/18299056

众所周知,Grpc很好用,但每次都需要手动编写 *.proto 文件,protobuf-net.Grpc个人感觉最大的优势是不用写*.proto 文件,相关教程如下:

https://learn.microsoft.com/zh-cn/aspnet/core/grpc/code-first?view=aspnetcore-8.0

https://protobuf-net.github.io/protobuf-net.Grpc/gettingstarted

https://github.com/protobuf-net/protobuf-net.Grpc
 
1. 定义代码协定
创建类库,名称为ProtobufNetShared,安装 protobuf-net.Grpc 和 System.ServiceModel.Primitives

[ServiceContract]
public interface IGreeterService
{[OperationContract]Task<HelloReply> SayHelloAsync(HelloRequest request);
}[DataContract]
public class HelloRequest
{[DataMember(Order = 1)]public string Name { get; set; }
}[DataContract]
public class HelloReply 
{[DataMember(Order = 1)]public string Message { get; set; }
}[Service]
public interface IOrderService
{CreateResult CreateOrder(CreateRequest request);QueryResult QueryOrder(QueryRequest request);
}[ProtoContract]
public class CreateRequest
{[ProtoMember(1)]public string OrderNo { get; set; }[ProtoMember(2)]public string OrderName { get; set; }[ProtoMember(3)]public string Price { get; set; }
}[ProtoContract]
public class CreateResult
{[ProtoMember(1)]public bool Result { get; set; }[ProtoMember(2)]public string Message { get; set; }
}[ProtoContract]
public class QueryRequest
{[ProtoMember(1)]public int Id { get; set; }
}[ProtoContract]
public class QueryResult
{[ProtoMember(1)]public int Id { get; set; }[ProtoMember(2)]public string OrderNo { get; set; }[ProtoMember(3)]public string OrderName { get; set; }[ProtoMember(4)]public double Price { get; set; }
}

前面的代码,SayHello 部分定义了HelloRequest、HelloReply消息 和 使用一元 SayHelloAsync gRPC 方法定义 IGreeterService 协定接口

代码如下:https://gitee.com/Karl_Albright/csharp-demo/tree/master/GrpcDemo/ProtobufNetShared

 

2. 定义Grpc服务

创建 ASP.NET Core Web API 项目,名称为ProtobufNetService,安装 protobuf-net.Grpc.AspNetCore 和 引用 ProtobufNetShared

 创建 GreeterService 并实现 IGreeterService,创建 OrderService 并实现 IOrderService

public class GreeterService : IGreeterService
{public Task<HelloReply> SayHelloAsync(HelloRequest request){return Task.FromResult(new HelloReply {Message = "你好 " + request.Name});}
}
public class OrderService : IOrderService
{public CreateResult CreateOrder(CreateRequest request){return new CreateResult{Result = true,Message = "订单创建成功",};}public QueryResult QueryOrder(QueryRequest request){return new QueryResult {Id = request.Id,OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"),OrderName = "冰箱",Price = 1288};}
}

更新 Program 文件 

public class Program
{public static void Main(string[] args){var builder = WebApplication.CreateBuilder(args);builder.Services.AddCodeFirstGrpc();var app = builder.Build();app.MapGrpcService<GreeterService>();app.MapGrpcService<OrderService>();app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");app.Run();}
}
AddCodeFirstGrpc 注册启用了代码优先的服务。
MapGrpcService<GreeterService> 添加代码优先的服务终结点
appsettings.json配置中增加http2配置

代码如下:https://gitee.com/Karl_Albright/csharp-demo/tree/master/GrpcDemo/ProtobufNetService
 
3. 创建 Grpc客户端

创建控制台项目,名称叫 ProtobufNetDemo,安装 Grpc.Net.Client 和 protobuf-net.Grpc

 更新 Program.cs 代码

internal class Program
{static async Task Main(string[] args){using var channel = GrpcChannel.ForAddress("http://localhost:5041");var client = channel.CreateGrpcService<IGreeterService>();var reply = await client.SayHelloAsync(new HelloRequest { Name = "Karl" });Console.WriteLine($"Greeting: {reply.Message}");Console.WriteLine("Press any key to exit...");Console.ReadKey();}
}

代码如下:https://gitee.com/Karl_Albright/csharp-demo/tree/master/GrpcDemo/ProtobufNetDemo

先运行 ProtobufNetService,再运行 ProtobufNetDemo 运行结果如下 

 

4. 创建 Web api 客户端

 创建 ASP.NET Core Web API 项目,名称为ProtobufNetClient,安装 protobuf-net.Grpc.AspNetCore、protobuf-net.Grpc.ClientFactory 和 引用 ProtobufNetShared

 增加 Program.cs 代码

builder.Services.AddCodeFirstGrpcClient<IGreeterService>(o =>
{o.Address = new Uri("http://localhost:5041/");o.ChannelOptionsActions.Add(options =>{options.HttpHandler = new SocketsHttpHandler(){// keeps connection alivePooledConnectionIdleTimeout = Timeout.InfiniteTimeSpan,KeepAlivePingDelay = TimeSpan.FromSeconds(60),KeepAlivePingTimeout = TimeSpan.FromSeconds(30),// allows channel to add additional HTTP/2 connectionsEnableMultipleHttp2Connections = true};});
});
builder.Services.AddCodeFirstGrpcClient<IOrderService>(o =>
{o.Address = new Uri("http://localhost:5041/");o.ChannelOptionsActions.Add(options =>{options.HttpHandler = new SocketsHttpHandler(){// keeps connection alivePooledConnectionIdleTimeout = Timeout.InfiniteTimeSpan,KeepAlivePingDelay = TimeSpan.FromSeconds(60),KeepAlivePingTimeout = TimeSpan.FromSeconds(30),// allows channel to add additional HTTP/2 connectionsEnableMultipleHttp2Connections = true};});
});

创建 HelloController 和 OrderController

[ApiController]
[Route("[controller]/[action]")]
public class HelloController : ControllerBase
{IGreeterService service;public HelloController(IGreeterService service) {this.service = service;}[HttpGet(Name = "Echo")]public string Echo(string name){return service.SayHelloAsync(new HelloRequest { Name = name }).Result.Message;}
}
[ApiController] [Route(
"[controller]/[action]")] public class OrderController : ControllerBase {IOrderService service;public OrderController(IOrderService service) {this.service = service;}[HttpGet(Name = "CreateOrder")]public CreateResult CreateOrder() {return service.CreateOrder(new CreateRequest{OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"),OrderName = "订单名称",Price = "12.32"});}[HttpGet(Name = "QueryOrder")]public QueryResult QueryOrder(int id){return service.QueryOrder(new QueryRequest{Id = id,});} }

代码地址: https://gitee.com/Karl_Albright/csharp-demo/tree/master/GrpcDemo/ProtobufNetClient

先运行 ProtobufNetService,再运行 ProtobufNetClient 运行结果如下,在Swagger中调用相应的Api

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/742599.html

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

相关文章

keycloak~使用自定义的注册页

添加FormAction的实现 package org.keycloak.phone.authentication.forms;import org.keycloak.Config; import org.keycloak.authentication.FormAction; import org.keycloak.authentication.FormActionFactory; import org.keycloak.authentication.FormContext; import org…

1.1_3_2 三种交换的性能分析

一、电路交换性能分析电路交换主要分为三个部分——连接建立、数据传输、连接释放,电路交换的时间消耗包括:连接建立时间:在通信开始之前必须要在发送方和接收方之间建立一条专用的通信路径,这个过程中电路交换机建立、释放和接收方处理连接请求、返回应答信号都需要时间。…

NAT网络与内网穿透原理

Markdown Example.centered-text { text-align: center; font-size: 40px; font-family: "Times New Roman", Georgia, serif }NAT 网络地址转换#NAT 网络地址转换原理: 网络地址转换 (NAT) 是一种在数据包通过路由设备传输时,通过修改数据包 IP 报头中的网络地址信…

ThreadPoolExector

Java Thread Pool 使用线程池的好处:减少资源的浪费:创建、销毁、切换线程需要消耗系统资源,通过使用线程池可以降低消耗。 增加可管理度:通过线程池的同一管理,能够实现线程的更好的管理。 提高相应速度:当任务到来时,无需在创建线程,直接就能对任务进行反馈Java线程池…

Windows系统安装RustDesk Server的详细步骤和客户端设置

Windows 安装RustDesk ServerWindows系统安装RustDesk Server的详细步骤 在Windows系统上安装RustDesk Server涉及几个关键步骤,包括安装必要的依赖、下载RustDesk Server程序、配置并启动服务。以下是详细的步骤: 1. 安装Node.js和PM2 RustDesk Server的某些版本可能需要Nod…

Rocky Linux/Redhat8运行Calibre2022报错:Software tree is for environment VCO=aoj

运行出现了错误:virserver.tcl error: ERROR: Current execution environment is VCO=aok. Software tree is for environment VCO=aoj。 即calibre软件版本为aoj,但当前的环境是aok。 从官网查询calibre的roadmap:http://calibre.mentorcloudservices.com/docs/Calibre_OS_…

[深入理解Java虚拟机]高效并发

第12章 Java内存模型与线程 并发处理的广泛应用是Amdahl定律代替摩尔定律[1]成为计算机性能发展源动力的根本原因,也是人类压榨计算机运算能力的最有力武器。 [1] Amdahl定律通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力,摩尔定律则用于描述处理器…

使用CDN,给你的网站加速!

使用 CDN,可以大大提高网站的访问速度,提升用户体验使用 CDN,可以大大提高网站的访问速度,提升用户体验 ‍ 在 CDN 出现之前 在介绍 CDN 之前,我想先介绍下没有 CDN 的场景。你搭建了一个网站,配置了域名,这样用户可以通过域名来访问你的网站 当用户多起来后,由于网络带…

PENR论文阅读笔记

Popularity-Enhanced News Recommendation with Multi-View Interest Representation 论文阅读笔记 Abstract 现存的问题: ​ 现有方法通常利用新闻标题、摘要、实体等信息来预测点击率(CTR),或在多任务学习框架中添加一些辅助任务。但是,它们都没有将预测的新闻流行度和用…

易优cms网站prenext 功能:获取当前文档上一篇、下一篇内容-Eyoucms

【基础用法】名称:prenext功能:获取当前文档上一篇、下一篇内容。语法:{eyou:prenext get=pre} <a href="{$field.arcurl}" title="{$field.title}"> 上一篇:{$field.title} </a>{eyou:else /} 上一篇:暂无{/eyou:prenext} {eyou:p…

网络的四层五层七层网络

Markdown Example.centered-text { text-align: center; font-size: 40px; font-family: "Times New Roman", Georgia, serif }聊聊网络协议参考:https://zhuanlan.zhihu.com/p/665914921 参考:https://blog.csdn.net/weixin_43988680/article/details/123754721 网…

易优cms网站videoplay功能:该标签仅限于视频模型的文档,用于在线播放视频选集列表里的第一个视频-Eyoucms

videoplay 视频在线播放 [基础用法]名称:videoplay功能:该标签仅限于视频模型的文档,用于在线播放视频选集列表里的第一个视频。 (温馨提示:如果一篇视频文档有多个选集视频,可以同时使用【videolist 视频选集列表】标签,进行视频切换播放。)语法:{eyou:videop…