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)定义服务

在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

时间: 2024-10-13 14:20:43

GRPC在NET上的实践(记录篇)的相关文章

lua动态修复线上bug实践(iOS篇)

lua动态修复线上bug实践(iOS篇) 利用wax框架,wax可以把Lua脚本语言和原生Objective-C应用编程接口(API)结合起来.这意味着,你可以从Lua里面,使用任何和全部的Objective-C类及框架. 1.wax.framework的问题 https://github.com/probablycorey/wax 这个框架已经4年没更新了,而且不支持64位. 用它来替换原来ViewController中函数不生效. 所以替换为 https://github.com/maxfo

k8s1.4.3安装实践记录(2)-k8s安装

前面一篇已经安装好了ETCD.docker与flannel(k8s1.4.3安装实践记录(1)),现在可以开始安装k8s了 1.K8S 目前centos yum上的kubernetes还是1.2.0,因此我们只能是使用下载的安装包,进行kubernetes的安装 [[email protected] system]# yum list |grep kubernetes cockpit-kubernetes.x86_64 0.114-2.el7.centos extras kubernetes.x

堆表上的转发记录

今天这篇文章我想谈下堆表上特有的性能问题:转发记录(Forwarding Records).首先我们要澄清下什么是堆表:堆表就是没有聚集索引定义的表.它对插入新记录非常快,但当你读取数据时非常慢.读取数据会在你的存储子系统上引入随机存取(random I/O),有时候当你碰到转发记录,它会进一步降低你的读取性能. 为什么会有转发记录? 当堆表里的记录需要移动到不同的物理位置时,SQL Server使用转发记录.假设你有一个变长列的表,首先你在堆表里插入一些记录,这个时候你没有在变长列里存储任何数

sql查询上一条记录和下一条记录

上一条记录的SQL语句: select top 1 * from news where newsid<id order by newsid DESC 下一条记录的SQL语句: select top 1 * from news where newsid>id order by newsid ASC 开发中遇到需要在当前页面显示当前文章的上一篇文章和下一篇文章,百度了一下,搜索到以上SQL语句:

Golang 高效实践之并发实践context篇

前言 在上篇Golang高效实践之并发实践channel篇中我给大家介绍了Golang并发模型,详细的介绍了channel的用法,和用select管理channel.比如说我们可以用channel来控制几个goroutine的同步和退出时机,但是我们需要close channel通知其他接受者,当通知和通信的内容混在一起时往往比较复杂,需要把握好channel的读写时机,以及不能往已经关闭的channel中再写入数据.如果有没有一种更好的上下文控制机制呢?答案就是文章今天要介绍的context,

django之创建第10-1个项目-图片上传并记录上传时间

1.百度云盘:django之创建第10-1个项目-图片上传并记录上传时间 2.主要修改的配置文件有3个,forms.views和models3个文件以及html 3.forms.py文件修改 #coding:utf-8 #这里定义html页面中用到的表单,常和views和models文件配合使用 """ >>> help(django) Help on package django: PACKAGE CONTENTS conf (package) contr

认识元数据和IL(上) &lt;第三篇&gt;

说在,开篇之前 很早就有说说Metadata(元数据)和IL(中间语言)的想法了,一直在这篇开始才算脚踏实地的对这两个阶级兄弟投去些细关怀,虽然来得没有<第一回:恩怨情仇:is和as>那么迅速,但是Metadata和IL却是绝对重量级的内容,值得我们在任何时间关注,本文就是开始. 1 引言 你可曾想到,我们的C#代码,编译之后究竟为何物?你可曾认知,我们的可执行程序,运行之时的轨迹究竟为哪般?那么,本文通过对Metadata(元数据)和IL(Intermediate Language, 中间语

在三星smart TV上开发widget-入门篇

一个 Smart TV 应用至少包含以下几部分: index.html 文件 应用程序的入口. config.xml 文件 这个xml文件放在应用结构的根目录,包含安装应用程序所需要的信息. JavaScript 文件 主要作用是控制应用程序的行为. CSS 文件 定义应用程序的布局,样式. Image 文件 图像资源. 示例应用 接下来会实现一个简单的应用程序,这个应用只包含了显示文本和打印遥控器的事件的功能. 实现config.xml文件 实现index.html文件 实现JavaScrip

Oracle查询当前记录的上一条记录或下一条记录

//查询当前记录的 //oracle 上一条记录select decode(decode(txbs,'无',null,txbs),lag(t.txbs, 1, 0) over(order by t.cjid),'是','否')from qb_app_rycj t //下一条记录select t.id, lead(t.id, 1, 0) over(order by t.sort,t.eidt_date) as p from cms_article t