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文件 内容如下

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流式传递

 原文地址:http://www.cnblogs.com/songjl/p/NETGRPC.html

 源码位置:https://github.com/MrsongJl/GRPCDEMO

posted @ 2017-05-24 17:31  宋米粒  阅读(4954)  评论(0编辑  收藏  举报