前些天 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 及 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 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(""
来源: http://www.cnblogs.com/linezero/p/grpc.html