之前出过websocket推送,sse推送,grpc的推送应该更具性价比,虽然前端要求复杂了一点点。下面快速的一步一步完成一个netcore服务端+web客户端的推送。
后端项目结构
GrpcRealtimePush/
├── Services/
│ └── ChatService.cs # gRPC服务实现
├── Protos/
│ └── chat.proto # Protocol Buffers定义
├── Program.cs # 服务启动配置
├── GrpcRealtimePush.csproj # 项目文件
└── appsettings.json # 配置文件
1.安装必要的grpc包- <Project Sdk="Microsoft.NET.Sdk.Web">
- <PropertyGroup>
- <TargetFramework>net9.0</TargetFramework>
- <Nullable>enable</Nullable>
- <ImplicitUsings>enable</ImplicitUsings>
- </PropertyGroup>
- <ItemGroup>
- <Protobuf Include="Protos\chat.proto" GrpcServices="Server" />
- </ItemGroup>
- <ItemGroup>
- <PackageReference Include="Grpc.AspNetCore" Version="2.64.0" />
- <PackageReference Include="Grpc.AspNetCore.Web" Version="2.64.0" />
- </ItemGroup>
- </Project>
复制代码
2.创建好proto文件- syntax = "proto3";
- package chat;
- option csharp_namespace = "GrpcRealtimePush";
- // 服务定义
- service ChatService {
- // 服务端流式推送方法
- rpc StartRealtimePush(RealtimePushRequest) returns (stream RealtimePushResponse);
- }
- // 请求消息
- message RealtimePushRequest {
- string client_id = 1; // 客户端ID
- int64 timestamp = 2; // 时间戳
- }
- // 响应消息
- message RealtimePushResponse {
- string data = 1; // 推送数据
- int64 timestamp = 2; // 时间戳
- string data_type = 3; // 数据类型
- }
复制代码 proto文件定义就这样:
- **`service ChatService`**: 定义gRPC服务
- **`rpc StartRealtimePush`**: 服务端流式方法,返回 `stream`表示持续推送
- **`message`**: 定义请求和响应的数据结构
- **字段编号**: 1, 2, 3等是字段的唯一标识,用于序列化
3.实现上面的方法
[code]using Grpc.Core;namespace GrpcRealtimePush.Services;public class ChatService : GrpcRealtimePush.ChatService.ChatServiceBase{ private readonly ILogger _logger; public ChatService(ILogger logger) { _logger = logger; } public override async Task StartRealtimePush(RealtimePushRequest request, IServerStreamWriter responseStream, ServerCallContext context) { _logger.LogInformation("
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |