GRPC是什么?
GRPC是一个开源RPC框架,于2015年3月开源,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于Protobuf 3.0(Protocol Buffers)序列化协议,主流语言都支持 主要是支持C#
使用场景?
实现客户端调用服务端方法并取返回值 GRPC可以实现跨语言的访问
下面跟着官网文档开始干
1)先了解下protobuf?
Protocol Buffers是Google开源的一个语言无关、平台无关的通信协议,其小巧、高效和友好的兼容性设计,使其被广泛使用。
2)VS2015下新建项目
分别建立两个项目跟一个类库 分别代表着服务端 客户端 基础类库
3)定义服务
在Public类库新建文件夹命名为protos用来存放.proto文件,在文件夹下新建GetUser.proto文件 内容如下
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; }
4)生成代码
生成代码需要使用官网提供的grpc_csharp_plugin.exe跟protoc.exe(下载可在官网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
5)把cs文件剪切到Public类库下 ,目录结构如下
6)引用dll
需要使用NuGet下载安装 *并引用* Google.Protobuf,Grpc.Core 网站项目需要共同Publicl类库
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 = "描述"; return Task.FromResult(new Userlist { Userinfo= users, No=1 }); } } }
在服务端Global.asax->Application_Start中启动服务 代码如下:
const int Port = 50051; Server server = new Server { 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流式传递
原文地址:http://www.cnblogs.com/songjl/p/NETGRPC.html
源码位置:https://github.com/MrsongJl/GRPCDEMO