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=
});
} }
}
在服务端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
GRPC在NET上的应用的更多相关文章
- GRPC在NET上的实践(记录篇)
GRPC是什么? GRPC是一个开源RPC框架,于2015年3月开源,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于Protobuf 3.0(Protocol Buffer ...
- gRPC 的route_guide例子
本文的例子代码在: https://github.com/grpc/grpc-go/tree/master/examples/route_guide 功能就类似目前LBS一样,在每个位置上报一些文 ...
- Golang gRPC微服务01: 介绍
gRPC 是什么 gRPC是goole开源的一个RPC框架和库,支持多语言之间的通信.底层通信采用的是 HTTP2 协议.gRPC在设计上使用了 ProtoBuf 这种接口描述语言.这种IDL语言可以 ...
- PowerMock 支持gRPC的Mock Server实现
PowerMock是一个Mock Server的实现,它同时支持HTTP与gRPC协议接口的Mock,并提供了灵活的插件功能. 这个工具面向于前后端.测试等对有接口Mock需求的开发人员,也可以作为一 ...
- [gRPC via C#] gRPC本质的探究与实践
鉴于内容过多,先上太长不看版: grpc 就是请求流&响应流特殊一点的 Http 请求,性能和 WebAPI 比起来只快在 Protobuf 上: 附上完整试验代码:GrpcWithOutSD ...
- Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用
Hyperledger Fabric 1.0 从零开始(十)--智能合约 Hyperledger Fabric 1.0 从零开始(十一)--CouchDB 上述两章,最近网上各路大神文章云集,方案多多 ...
- 使用C#把Tensorflow训练的.pb文件用在生产环境
训练了很久的Tf模型,终于要到生产环境中去考研一番了.今天花费了一些时间去研究tf的模型如何在生产环境中去使用.大概整理了这些方法. 继续使用分步骤保存了的ckpt文件 这个貌似脱离不了tensorf ...
- .NET周报【10月第1期 2022-10-11】
本周精选 继C#实现await/async无栈协程几年后,davidwrighton实现了.NET绿色线程(有栈协程)的原型 https://github.com/dotnet/runtimelab/ ...
- ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)
早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把.同时记录体验的过程.如果你也想按照本文的步骤体验的话,那你得先安 ...
随机推荐
- Windbg脚本和扩展工具开篇
好长一段时间没写文章了,最近一直忙于为项目的可调式性做一些脚本和扩展工具,鉴于对windbg强大威力的震撼,以及相对较少的资料,笔者决定写一系列关于如何开发Windbg脚本和扩展命令的文章,您的支持是 ...
- Hihocoder [Offer收割]编程练习赛70 解题报告 By cellur925
并没有第四题.(还不会矩阵乘法加速线性数列) 题目1 : 数位翻转 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 n,你可以进行若干次操作,每次操作可以翻转 ...
- 《Windows核心编程系列》十四谈谈默认堆和自定义堆
堆 前面我们说过堆非常适合分配大量的小型数据.使用堆可以让程序员专心解决手头的问题,而不必理会分配粒度和页面边界之类的事情.因此堆是管理链表和数的最佳方式.但是堆进行内存分配和释放时的速度比其他方式都 ...
- 解决上传到github报错Successfully created project 'autotest' on GitHub, but initial commit failed:
通过IDEA上传代码到GitHub上可是有时候会碰到这样的问题. 当我们选择VCS->Import into Version Control->Share Project on GitHu ...
- SQL 实战教程(八)
http://www.studyofnet.com/news/247.html 1.修改字段为自增 alter table [dbo].[Logs] drop column ID alter tabl ...
- NDK(18)eclipse 使用C++ STL
1.引用库 在Application.mk 中使用 APP_STL := stlport_static 等. APP_ABI := x86 armeabi APP_PLATFORM := androi ...
- Android SQLite(2)如何判断表是否已经存在
在sql语句中用 if not exists void create_table(){ SQLiteDatabase dbWireter = dbhelper.getWritableDatabase( ...
- 对dynamic和lambda的学习
var, object, dynamic的区别以及使用 dynamic(2) – ExpandoObject的使用 .NET中的Lambda表达式与匿名方法
- URAL1326. Bottle Taps(状压)
1326 用队列优化的 不知道为什么一直WA 传统直白的 状压 写了超时 O((1<<n)*m*n) 之后想了可以把n省去 预处理一下方案 #include <iostream&g ...
- ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第四天(非原创)
文章大纲 一.课程介绍二.今日内容介绍三.参考资料下载四.参考文章 一.课程介绍 一共14天课程(1)第一天:电商行业的背景.淘淘商城的介绍.搭建项目工程.Svn的使用.(2)第二天:框架的整合.后台 ...