GRPC在NET上的应用

摘要:
optionjava_multiple_files=true;optionjava_ package=“io.grpc.examples.Public”;optionjava_outer_ classname=“GetUserProto”;int32no=2;使用System.Linq;使用System.Threading.Tasks;}}在服务器端,全局。asax->

GRPC是什么?

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

使用场景?

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

下面跟着官网文档开始干

1)先了解下protobuf?

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

2)VS2015下新建项目

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

GRPC在NET上的应用第1张

3)引用dll

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

GRPC在NET上的应用第2张

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上的应用第3张

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

免责声明:文章转载自《GRPC在NET上的应用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇允许跨域资源共享(CORS)携带 Cookie (转载)log4j(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在CYGWIN下编译和运行软件Bundler ,以及PMVS,CMVS的编译与使用

本人按照 http://blog.csdn.net/zzzblog/article/details/17166869 http://oliver.zheng.blog.163.com/blog/static/1424115952011915113138431/这两篇文章运行,发现在我的电脑上有些地方运行不对。所以我按照我能运行的步骤重新写一下。 本人电脑是...

Excel 数据对比,窗口并列排序操作(xlw文件格式的由来)

步骤1:打开Excel文件,输入一些数据 步骤2:点击视图,创建新窗口(这里就会创建一个和步骤1一抹一样的的表格,我们可以在任务栏上看到) 第三步:点击视图里面的全部重排按钮,在重拍窗口里面选择需要拍了的方式(自己选择,这里我选择垂直并排) 到这来,两个一模一样的垂直的窗口就显示出来了,如下所示 补充说明:如果我们想下次打开这个文件还是这种垂直并排...

默認打開pr_debug和dev_dbg

作者:彭東林 郵箱:pengdonglin137@163.com 日期:2016-08-26 18:04:14 在進行Linux驅動開發時經常見到使用pr_debug和dev_dbg打印驅動的log,如果在內核配置時選擇了CONFIG_DYNAMIC_DEBUG宏,那麼就可以利用類似下面的命令打開對應文件的log: echo -n "file xxx.c...

CentOS 7上的系统管理之:Systemd和systemctl

参考资料: Chapter 10. Managing Services with systemd Red Hat Enterprise Linux 7 | Red Hat Customer Portal systemd - Wikipedia man手册:systemd(1)和systemctl(1) IBM developer works上,刘明老师关...

不离开Emacs完成简单程序的编辑编译运行(windows或Linux)

(1)打开Emacs (2)建立一个新的程序文件. 执行 C-x C-f, 然后在屏幕的底部出现minibuffer,光标提示你输入文件名称, 文件名称要带上后缀名,如hello.cpp。回车,然后开始编辑源代码。 (3)编译代码。执行Alt-x compile,出现minibuffer,提示你输入编译命令。 默认情况下,有个make -k出现在min...

Hadoop--mapreduce编程实例1

前提准备: 1.hadoop安装运行正常。Hadoop安装配置请参考:Ubuntu下 Hadoop 1.2.1 配置安装 2.集成开发环境正常。集成开发环境配置请参考 :Ubuntu 搭建Hadoop源码阅读环境 MapReduce编程实例: MapReduce编程实例(一),详细介绍在集成环境中运行第一个MapReduce程序 WordCount及代码分...