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

C# produce and consume data via Google.Protobuf

Install-Package Google.Protobuf
Install-Package Grpc.AspNetCore
Install-Package Grpc.Net.Client
Install-Package Grpc.Tools
//Add new file book.proto

syntax="proto3";option csharp_namespace="GrpcBookServer";package book;message  BookProto{int64 id=1;string name=2;string isbn=3;string abstract=4;string author=5;string comment=6;string content=7;string summary=8;string title=9;string topic=10;
}message GetBooksListRequest{int32 cnt=1;
}message GetBooksListResponse{repeated BookProto books=1;
}service BookService
{rpc GetBooksList(GetBooksListRequest) returns (GetBooksListResponse);
}

 

 

Add new file book.proto and set properties of book.proto   Build action as Protobuf compiler both in producer and consumer app.

image

 

 

//Producer
//D:\C\ConsoleApp19\ConsoleApp19\Program.cs
using Google.Protobuf;
using Google.Protobuf.Collections;
using Grpc.Core;
using GrpcBookServer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.Extensions.DependencyInjection;
using System.Runtime.Serialization;
using System.Threading.Tasks.Dataflow;namespace ConsoleApp19
{internal class Program{static void Main(string[] args){GrpcDemo();Console.ReadLine();}static async Task GrpcDemo(){var builder = WebApplication.CreateBuilder();builder.WebHost.ConfigureKestrel(serviceOptions =>{serviceOptions.ListenLocalhost(8888, x => x.Protocols = HttpProtocols.Http2);});builder.Services.AddGrpc(options =>{options.MaxSendMessageSize = null;options.MaxSendMessageSize = null;}); var app = builder.Build();app.MapGrpcService<BookServiceImpl>();Console.WriteLine($"{DateTime.Now},the grpc service started at http://localhost:8888");await app.RunAsync("http://localhost:8888");}}public class BookServiceImpl:BookService.BookServiceBase{private static long id = 0;private static long GetIncrementId(){return Interlocked.Increment(ref id);}public List<Book> GetBooksList(int cnt=1000000){var bksList = new List<Book>();for(int i=0;i<cnt;i++){var a = GetIncrementId();bksList.Add(new Book(){Id=a,Name=$"Name_{a}",ISBN=$"ISBN_{a}_{Guid.NewGuid():N}",Abstract=$"Abstract_{a}",Author=$"Author_{a}",Comment=$"Comment_{a}",Content=$"Content_{a}",Summary=$"Summary_{a}",Title=$"Title_{a}",Topic=$"Topic_{a}"});}return bksList;}public override Task<GetBooksListResponse> GetBooksList(GetBooksListRequest request, ServerCallContext context){var count = request.Cnt is 0 ? 1000000 : request.Cnt;var bksList = GetBooksList(count);var response=new GetBooksListResponse();response.Books.AddRange(bksList.ToProtoList());return Task.FromResult(response);}}public static class BookMapper{public static BookProto ToProtoBook(this Book bk){return new BookProto{Id = bk.Id,Name = bk.Name ?? "",Isbn = bk.ISBN ?? "",Author=bk.Author??"",Abstract = bk.Abstract ?? "",Comment = bk.Comment ?? "",Content = bk.Content ?? "",Summary = bk.Summary ?? "",Title = bk.Title ?? "",Topic = bk.Topic ?? ""};}public static Book ToModel(this BookProto pt){return new Book{Id = pt.Id,Name = pt.Name,ISBN = pt.Isbn,Abstract = pt.Abstract,Author = pt.Author,Comment=pt.Comment,Content=pt.Content,Summary=pt.Summary,Title=pt.Title,Topic=pt.Topic};}public static List<Book> ToModelList(this RepeatedField<BookProto> list){return list.Select(ToModel).ToList();}public static List<BookProto> ToProtoList(this List<Book> list){return list.Select(ToProtoBook).ToList();}}public class Book{public long Id { get; set; }public string Name { get; set; }public string ISBN { get; set; }public string Abstract { get; set; }public string Author { get; set; }public string Comment { get; set; }public string Content { get; set; }public string Summary { get; set; }public string Title { get; set; }public string Topic { get; set; }}}

 

 

//Consumer

//D:\C\ConsoleApp20\ConsoleApp20\Program.cs
using Grpc.Net.Client;
using GrpcBookServer;namespace ConsoleApp20
{internal class Program{private static string requestUrl = "http://localhost:8888";static GrpcChannel channel;static BookService.BookServiceClient client;static System.Timers.Timer tmr;static void Main(string[] args){channel = GrpcChannel.ForAddress(requestUrl, new GrpcChannelOptions{MaxSendMessageSize =null,MaxReceiveMessageSize=null});client = new BookService.BookServiceClient(channel);Task.Run(async () =>{await ConsumeGrpcServiceAsync();});tmr = new System.Timers.Timer();tmr.Interval = 3000;tmr.Elapsed += async (s, e) =>{await  ConsumeGrpcServiceAsync();};tmr.Start();Console.ReadLine();}static async Task ConsumeGrpcServiceAsync(int cnt= 1000000){var resp = await client.GetBooksListAsync(new GetBooksListRequest { Cnt = cnt });var books = resp.Books;Console.WriteLine($"{DateTime.Now},receive from server books count:{books.Count},First Id:{books.FirstOrDefault()?.Id},Last Id:{books.LastOrDefault()?.Id}");}}
}

 

 

 

image

 

http://www.jsqmd.com/news/873527/

相关文章:

  • 暗黑破坏神2终极角色编辑器:Diablo Edit2完整使用教程
  • Unity新手必看:5分钟搞定TextMeshPro中文乱码,告别小方块(附7000+常用字库)
  • 【信息系统项目管理师论文押题】论信息系统项目的不确定性绩效域
  • AI知识库选型终极指南:2026年Top 7工具深度横评(本地向量引擎兼容性+GDPR合规得分全公开)
  • 硬件错误HardFault
  • 靠谱的鸟食饲料零售商 - GrowthUME
  • 为什么92%的AI翻译Agent项目在L10阶段失败?——解密头部语言服务商未公开的5层校验协议
  • 你可能会用到的16个Linux命令
  • 基于首届中国互联网数据挖掘竞赛数据集的行为相似网络分析
  • Java面试必问三件套
  • MATLAB机器人工具箱终极实战指南:从建模到控制完整解决方案
  • Metasploit实战宝典:从入门到精通的渗透测试全流程与案例解析MSF这个黑客工具
  • 2026 国产实测无限制语音克隆工具 TOP8 悄然声色 93 分领跑短视频解说 9 秒高保真克隆 - GrowthUME
  • 2026电工杯A 绿电直连型电氢园区运行优化模型与求解
  • 苏州二手注塑机哪家好?本地优质厂家与选购要点推荐 - GrowthUME
  • 新手避坑指南:用QGC地面站给APM飞控刷固件,离线下载比在线更稳?
  • 2026 GEO 商业化合规启示录:当“答案层”成为新战场,十堰千亿如何把“品牌增长”做成“可信内容资产”? - GrowthUME
  • 大模型核心原理深度解析,注意力、FFN、知识回路与微调本质
  • 告别简单向量搜索:RAG 中的高级查询构建与优化策略
  • agent-skills 完整使用教程(2026最新版)
  • 人工智能从对话工具向自主生产力跃迁
  • 惊!用5年MacBook本地运行Gemma 4索引一年视频,成本仅一个周末!
  • OpenClaw底层揭秘:打造私有化AI Agent团队的核心原理与实战解析!
  • LangChain异步调用实战:批量处理100条文本,速度提升2倍以上的配置指南
  • AIDD入门 | 从蛋白到结合口袋:AI如何理解药物作用的现场?
  • Vue Antd Admin 布局系统深度解析:5 分钟构建专业管理后台界面
  • Win11启动OpenSSH客户端
  • 黑龙江生态板厂家推荐:建青木业 黑吉蒙地区靠谱的板材供应商 - GrowthUME
  • PyTorch Adam优化器报错怎么办?教你一招避坑
  • Rust 全栈项目里,我写了一个不再重复造轮子的泛型表格组件