GRPC在NET上的应用
GRPC是什么?
GRPC是一个开源RPC框架,于2015年3月开源,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于Protobuf 3.0(Protocol Buffers)序列化协议,主流语言都支持 主要是支持C#
使用场景?
实现客户端调用服务端方法并取返回值 GRPC可以实现跨语言的访问
下面跟着官网文档开始干
1)先了解下protobuf?
Protocol Buffers是Google开源的一个语言无关、平台无关的通信协议,其小巧、高效和友好的兼容性设计,使其被广泛使用。
2)VS2015下新建项目
分别建立两个项目跟一个类库 分别代表着服务端 客户端 基础类库
3)引用dll
需要使用NuGet下载安装 *并引用* Google.Protobuf Grpc.Core Grpc.Tools 网站项目需要共同Publicl类库
4)定义服务
在Public类库新建文件夹命名为protos用来存放.proto文件,在文件夹下新建GetUser.proto文件 内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | syntax = "proto3" ; option java_multiple_files = true ; option java_package = "io.grpc.examples.Public" ; option java_outer_classname = "GetUserProto" ; option objc_class_prefix = "HLW" ; package Public; //定义的服务 service GetUserList { rpc GetList(pharm) returns (Userlist) {} } //服务的参数 message pharm { string name = 1; } //返回参数 message Userlist { user userinfo=1; int32 no=2; } message user{ string name=1; string detail=2; } |
5)生成代码
生成代码需要使用官网提供的grpc_csharp_plugin.exe跟protoc.exe ,工具位置在 _你的项目>> packages>>Grpc.Tools.1.14.1>>tools>>windows_x64
(也可在官网demo中找到 https://github.com/grpc/grpc)
把两个exe跟刚建好的GetUser.proto放入同一个文件夹下 地址栏运行cmd
执行命令如下:protoc.exe -I=. --csharp_out=. --grpc_out=. --plugin=protoc-gen-grpc=grpc_csharp_plugin.exe GetUser.proto
6)把cs文件剪切到Public类库下 ,目录结构如下
7)建立服务端
服务端重写定义的服务GetUserList
GrpcDemoWebServer项目->新建GetUserI.cs文件 代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Public; using Grpc.Core; using System.Threading.Tasks; namespace GrpcDemoWeb.Models { public class GetUserI:GetUserList.GetUserListBase { public override Task<Userlist> GetList(pharm request, ServerCallContext context) { var users = new user(); users.Name = "姓名"; users.Detail = "描述";
//以下注意 不能将null值赋值给Userinfo return Task.FromResult(new Userlist { Userinfo= users, No=1 }); } } }
在服务端Global.asax->Application_Start中启动服务 代码如下:
const int Port = 50051; Server server = new Server {
//重要,每次新建服务都需要在下方注册,否则会出现错误 【Status(StatusCode=Unimplemented,Detail="")】 Services = { GetUserList.BindService(new GetUserI()) }, Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) } }; server.Start(); //server.ShutdownAsync().Wait();
8)建立客户端
GRpcDemoWebClient-》新建控制器index->代码如下:
public ActionResult Index() { //链接对应的服务端 Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure); var result = new GetUserList.GetUserListClient(channel); //var client = new GetUser.GetUserClient(channel); //调用对应方法并传递参数 var reply = result.GetList(new pharm {Name="1"}); //var reply1 = client.GetFeature(new Point { Latitude = 111, Longitude = 222 }); //等待计划完成 channel.ShutdownAsync().Wait(); //返回页面 return Content(reply.Userinfo.Name); }
9)IIS上部署两个项目 按顺序打开 1服务端 2打开客户端下/index 展示内容为“”姓名“”表示成功
9)难点记录:
还需要多加理解Protocolbuffers
rpc流式传递
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
· 7 个最近很火的开源项目「GitHub 热点速览」
· DeepSeekV3:写代码很强了
· 记一次 .NET某固高运动卡测试 卡慢分析
· Visual Studio 2022 v17.13新版发布:强化稳定性和安全,助力 .NET 开发提
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题