gRPC 和 C#
前些天gRPC 发布1.0 版本,代表着gRPC 已经正式进入稳定阶段。
今天我们就来学习gRPC C# 。而且目前也已经支持.NET Core 可以实现完美跨平台。
传统的.NET 可以通过Mono 来实现跨平台调用。
GitHub: https://github.com/grpc/grpc
gRPC 简单介绍:
gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次数、节省CPU使用、和电池寿命。
gRPC支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前,在GitHub上已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它语言的版本正在积极开发中,其中 grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言,grpc-java已经支持Android开发。
gRPC已经应用在Google的云服务和对外提供的API中,其主要应用场景如下:
低延迟、高扩展性、分布式的系统
同云服务器进行通信的移动应用客户端
设计语言独立、高效、精确的新协议
便于各方面扩展的分层设计,如认证、负载均衡、日志记录、监控等参考文档:
http://www.infoq.com/cn/news/2015/03/grpc-google-http2-protobuf
本篇文章主要讲解传统.NET 应用如何支持gRPC。
下面就正式开始。
新建项目

首先我们创建一个gRPCDemo 的类库。
然后添加两个控制台应用程序 gRPCServer gRPCClient。
最终项目结构如下:

定义服务
建好项目以后我们来定义服务
这里我们在gRPCDemo 项目里添加一个 helloworld.proto 内容如下:
下面主要定义一个gRPC 的服务里面有个 SayHello rpc 方法

syntax = "proto3";
package gRPCDemo;
service gRPC {
rpc SayHello (HelloRequest) returns (HelloReply) {}
} message HelloRequest {
string name = 1;
} message HelloReply {
string message = 1;
}

使用Grpc.Tools生成代码
定义好服务以后我们就可以来生成代码了。
首先需要添加引用:
在每个项目中添加上Grpc 及 Google.Protobuf
Install-Package Grpc
Install-Package Google.Protobuf
然后在gRPCDemo 项目中再添加上工具 Grpc.Tools
NuGet 命令行:
Install-Package Grpc.Tools
然后在命令行执行以下命令,注意执行命令的目录为packages 的上层目录

packages\Grpc.Tools.1.0.0\tools\windows_x86\protoc.exe -IgRPCDemo --csharp_out gRPCDemo gRPCDemo\helloworld.proto --grpc_out gRPCDemo --plugin=protoc-gen-grpc=packages\Grpc.Tools.1.0.0\tools\windows_x86\grpc_csharp_plugin.exe
执行完以后,在gRPCDemo 目录下会多出Helloworld.cs 及 HelloworldGrpc.cs 类,将其包含至gRPCDemo 项目既可。
然后gRPCServer gRPCClient 分别都引用 gRPCDemo。
创建服务端及客户端
下面我们来编写服务端及客户端
首先是服务端:
Program.cs

class gRPCImpl : gRPC.gRPCBase
{
// 实现SayHello方法
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
}
} class Program
{
const int Port = 9007; public static void Main(string[] args)
{
Server server = new Server
{
Services = { gRPC.BindService(new gRPCImpl()) },
Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) }
};
server.Start(); Console.WriteLine("gRPC server listening on port " + Port);
Console.WriteLine("任意键退出...");
Console.ReadKey(); server.ShutdownAsync().Wait();
}
}

服务端需要实现SayHello 方法。
然后是客户端 Program.cs

class Program
{
static void Main(string[] args)
{
Channel channel = new Channel("127.0.0.1:9007", ChannelCredentials.Insecure); var client = new gRPC.gRPCClient(channel);
var reply= client.SayHello(new HelloRequest { Name = "LineZero" });
Console.WriteLine("来自" + reply.Message); channel.ShutdownAsync().Wait();
Console.WriteLine("任意键退出...");
Console.ReadKey();
}
}

然后我们将Client 和Server 都生成一下。
分别到对应的目录执行,首先启动gRPCServer ,然后执行gRPCClient。

成功进行通信了,实现了gRPC。
gRPC 和 C#的更多相关文章
- gRPC源码分析1-SSL/TLS
引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...
- gRPC源码分析2-Server的建立
gRPC中,Server.Client共享的Class不是很多,所以我们可以单独的分别讲解Server和Client的源码. 通过第一篇,我们知道对于gRPC来说,建立Server是非常简单的,还记得 ...
- gRPC源码分析0-导读
gRPC是Google开源的新一代RPC框架,官网是http://www.grpc.io.正式发布于2016年8月,技术栈非常的新,基于HTTP/2,netty4.1,proto3.虽然目前在工程化方 ...
- 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC
Google 刚刚开源了grpc, 一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobuf 本身虽然提供了RPC 的定义语法,但是一直以来,Google 只开 ...
- gRPC .NET Core跨平台学习
前些天发布gRPC C# 学习,在.NET Framework 中使用gRPC ,今天来学习 .NET Core gRPC. gRPC 的.NET Core 包在NuGet 上发布了,结合.NET C ...
- gRPC C#学习
前些天gRPC 发布1.0 版本,代表着gRPC 已经正式进入稳定阶段. 今天我们就来学习gRPC C# .而且目前也已经支持.NET Core 可以实现完美跨平台. 传统的.NET 可以通过Mono ...
- .net core 用grpc实现微服务
GRPC 是Google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架.提供跨语言.跨平台支持.以下以.NET Core 使用控制台.docker中演示如何使用G ...
- rpc框架之gRPC 学习 - hello world
grpc是google在github于2015年开源的一款RPC框架,虽然protobuf很早google就开源了,但是google一直没推出正式的开源框架,导致github上基于protobuf的r ...
- Android开发笔记之《远程控制(MQTT|mosquitto) && (ProtocalBuffer | GRPC)》
Android推送方案分析(MQTT/XMPP/GCM): http://www.open-open.com/lib/view/open1410848945601.htmlMQTT官网: http:/ ...
- gRPC+etcd的优势分析
相比webService等可跨平台,跨语言的服务相比,gRPC更增加了以下优势 1.可以采用二进制传输,速度更快 (使用TCP传输层,而不是Http2应用层) 2.集群服务,统一注册,可靠性高( 好的 ...
随机推荐
- python pip 使用
一.修改 pip 源 Windows 在用户目录下新建 pip\pip.ini 文件,如:C:\Users\Administrator\pip\pip.ini [global] index-url = ...
- Appnium安装
Refer to https://blog.csdn.net/xgh1951/article/details/85124327
- linux下如何单独编译设备树?
答: make <vendor>/<device_name>.dtb 如: make freescale/fsl-1043a-rdb.dtb
- 图解Python 【第三篇】:Python-函数
本节内容一览图 一.函数介绍 1.什么是函数 2.定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 任何传入参 ...
- MySQL 的连接时长控制--interactive_timeout和wait_timeout
在用MySQL客户端对数据库进行操作时,如果一段时间没有操作,再次操作时,常常会报如下错误: ERROR 2013 (HY000): Lost connection to MySQL server d ...
- <HTML>在一个表格内嵌套另一个表格时,如何居中?
在一个表格内嵌套另一个表格时,如何居中? 假设大表格为: <table id="tableRow"> <tr> <th>City</th& ...
- LC 971. Flip Binary Tree To Match Preorder Traversal
Given a binary tree with N nodes, each node has a different value from {1, ..., N}. A node in this b ...
- Pattern Evaluation
对相关性patten质量的常用分析指标有以下这些 其中,X^2 跟 lift不是null-invariant的,也就是说当~A~B项较多时,这两个指标不是很可靠. 据Jiawei Han所言,Kulc ...
- jmeter之吞吐量控制器
比如说有一种场景是,10个并发里,有2个事操作业务A,有8个是操作业务B,要模拟这种业务场景,则可以通过吞吐量控制器来模拟 目录 1.用法 2.举例 1.用法 第一种:设置比例控制 选择percent ...
- Oracle 本地创建多个实例并创建多个监听(只能在服务端弄,不可在客户端)
注意:监听必须在客户端创建,在客户端创建,会报错. 1.创建监听 通过 Net Configuration Assistant 创建监听,设置端口: 注意:此监听创建完后,服务列表里面并没有此服务的 ...