当前位置: 首页 > 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.gsyq.cn/news/1360868.html

相关文章:

  • XQuery 总结
  • 134、运动控制中的通信协议:实时以太网对比
  • 暗黑破坏神2终极角色编辑器:Diablo Edit2完整使用教程
  • 139、运动控制中的安全功能:安全PLC与安全总线
  • FlashAttention的水印攻击:怎么知道你的模型被偷用或篡改了?
  • AI知识库选型终极指南:2026年Top 7工具深度横评(本地向量引擎兼容性+GDPR合规得分全公开)
  • 告别简单向量搜索:RAG 中的高级查询构建与优化策略
  • AI日报 - 2026年05月22日
  • 为ClaudeCode配置Taotoken作为备用API解决访问限制
  • 紧急!财政部新发《AI增强型审计工作指引(试行)》第4.2条直指Agent记忆泄露风险:3类必查缓存节点+2分钟自检脚本
  • FastGithub终极指南:3步解决GitHub访问卡顿,让开发效率提升5倍
  • 报错日志解析:让大模型帮你一秒看懂 Java/Python 堆栈异常并给出解法
  • 使用Taotoken后我的API调用延迟与稳定性观测记录
  • 抖音批量下载终极教程:5分钟学会去水印视频下载与自动化归档
  • 【数据分析】基于Conformable模型的质量-弹簧-阻尼器系统熵生成分析Matlab实现
  • Win11启动OpenSSH客户端
  • 黑龙江生态板厂家推荐:建青木业 黑吉蒙地区靠谱的板材供应商 - GrowthUME
  • 大模型核心原理深度解析,注意力、FFN、知识回路与微调本质
  • Java面试必问三件套
  • 一线观察:昆明装修企业长期运营的真实表现
  • 【限时开放】2024Q3最新AI写作Agent行业适配度矩阵(覆盖12类B端业务+8种内容形态),仅剩最后217个评估名额
  • 移动储能车远程管理平台解决方案
  • Seraphine:你的英雄联盟智能助手,3大核心功能提升游戏决策力
  • Lovable无代码开发避坑清单(97%新手踩过的5大致命误区)
  • 德系多联机在中国市场的技术本土化:从88HP并联到冷凝水回收的十年路径 - 奔跑123
  • 2026年4月热门的景点推荐,夜游景点/旅游景点/景点/景区/游玩景点,景点盘点 - 品牌推荐师
  • Metasploit实战宝典:从入门到精通的渗透测试全流程与案例解析MSF这个黑客工具
  • 网安面试必刷!小白友好Web_内网渗透_护网告警面试题汇总,建议收藏
  • Claude API文档编写实战手册(含OpenAPI 3.1完整示例+错误码映射表)
  • 【GMSK的最大似然序列检测GMSK MLSD】采用维特比算法来解决MLSD问题研究附Matlab代码