GRPC在NET上的实践(记录篇)

时间:2021-06-29 21:28:39

GRPC是什么?

GRPC是一个开源RPC框架,于2015年3月开源,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于Protobuf 3.0(Protocol Buffers)序列化协议,主流语言都支持 主要是支持C#

使用场景?

实现客户端调用服务端方法并取返回值 GRPC可以实现跨语言的访问

下面跟着官网文档开始干

1)先了解下protobuf?

Protocol Buffers是Google开源的一个语言无关、平台无关的通信协议,其小巧、高效和友好的兼容性设计,使其被广泛使用。

2)VS2015下新建项目

分别建立两个项目跟一个类库 分别代表着服务端 客户端  基础类库

GRPC在NET上的实践(记录篇)

3)引用dll

需要使用NuGet下载安装 *并引用* Google.Protobuf   Grpc.Core   Grpc.Tools   网站项目需要共同Publicl类库

GRPC在NET上的实践(记录篇)

4)定义服务

在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;
}

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类库下 ,目录结构如下

GRPC在NET上的实践(记录篇)

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=
});
} }
}

在服务端Global.asax->Application_Start中启动服务 代码如下:

            const int Port = ;
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=""});
//var reply1 = client.GetFeature(new Point { Latitude = , Longitude = });
//等待计划完成
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