gRPC C#学习
前些天gRPC 發(fā)布1.0 版本,代表著gRPC 已經(jīng)正式進(jìn)入穩(wěn)定階段。?
今天我們就來(lái)學(xué)習(xí)gRPC C# 。而且目前也已經(jīng)支持.NET Core 可以實(shí)現(xiàn)完美跨平臺(tái)。
傳統(tǒng)的.NET 可以通過Mono 來(lái)實(shí)現(xiàn)跨平臺(tái)調(diào)用。
GitHub:?https://github.com/grpc/grpc
gRPC 簡(jiǎn)單介紹:
gRPC是一個(gè)高性能、通用的開源RPC框架,其由Google主要面向移動(dòng)應(yīng)用開發(fā)并基于HTTP/2協(xié)議標(biāo)準(zhǔn)而設(shè)計(jì),基于ProtoBuf(Protocol Buffers)序列化協(xié)議開發(fā),且支持眾多開發(fā)語(yǔ)言。gRPC提供了一種簡(jiǎn)單的方法來(lái)精確地定義服務(wù)和為iOS、Android和后臺(tái)支持服務(wù)自動(dòng)生成可靠性很強(qiáng)的客戶端功能庫(kù)。客戶端充分利用高級(jí)流和鏈接功能,從而有助于節(jié)省帶寬、降低的TCP鏈接次數(shù)、節(jié)省CPU使用、和電池壽命。
gRPC支持多種語(yǔ)言,并能夠基于語(yǔ)言自動(dòng)生成客戶端和服務(wù)端功能庫(kù)。目前,在GitHub上已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它語(yǔ)言的版本正在積極開發(fā)中,其中 grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等語(yǔ)言,grpc-java已經(jīng)支持Android開發(fā)。
gRPC已經(jīng)應(yīng)用在Google的云服務(wù)和對(duì)外提供的API中,其主要應(yīng)用場(chǎng)景如下:
低延遲、高擴(kuò)展性、分布式的系統(tǒng)
同云服務(wù)器進(jìn)行通信的移動(dòng)應(yīng)用客戶端
設(shè)計(jì)語(yǔ)言獨(dú)立、高效、精確的新協(xié)議
便于各方面擴(kuò)展的分層設(shè)計(jì),如認(rèn)證、負(fù)載均衡、日志記錄、監(jiān)控等
參考文檔:
http://www.infoq.com/cn/news/2015/03/grpc-google-http2-protobuf
本篇文章主要講解傳統(tǒng).NET 應(yīng)用如何支持gRPC。
下面就正式開始。
新建項(xiàng)目
首先我們創(chuàng)建一個(gè)gRPCDemo 的類庫(kù)。
然后添加兩個(gè)控制臺(tái)應(yīng)用程序 gRPCServer gRPCClient。
最終項(xiàng)目結(jié)構(gòu)如下:
定義服務(wù)
建好項(xiàng)目以后我們來(lái)定義服務(wù)
這里我們?cè)趃RPCDemo 項(xiàng)目里添加一個(gè)?helloworld.proto 內(nèi)容如下:
下面主要定義一個(gè)gRPC 的服務(wù)里面有個(gè)?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生成代碼
定義好服務(wù)以后我們就可以來(lái)生成代碼了。
首先需要添加引用:
在每個(gè)項(xiàng)目中添加上Grpc 及?Google.Protobuf?
Install-Package Grpc Install-Package Google.Protobuf然后在gRPCDemo 項(xiàng)目中再添加上工具?Grpc.Tools
NuGet 命令行:
Install-Package Grpc.Tools然后在命令行執(zhí)行以下命令,注意執(zhí)行命令的目錄為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執(zhí)行完以后,在gRPCDemo 目錄下會(huì)多出Helloworld.cs 及?HelloworldGrpc.cs 類,將其包含至gRPCDemo 項(xiàng)目既可。
然后gRPCServer gRPCClient 分別都引用?gRPCDemo。
?
創(chuàng)建服務(wù)端及客戶端
下面我們來(lái)編寫服務(wù)端及客戶端
?
首先是服務(wù)端:
?Program.cs?
? ?? ? ? ?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();}}
服務(wù)端需要實(shí)現(xiàn)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("來(lái)自" + reply.Message);channel.ShutdownAsync().Wait();Console.WriteLine("任意鍵退出...");Console.ReadKey();}}
然后我們將Client 和Server 都生成一下。
分別到對(duì)應(yīng)的目錄執(zhí)行,首先啟動(dòng)gRPCServer ,然后執(zhí)行g(shù)RPCClient。
成功進(jìn)行通信了,實(shí)現(xiàn)了gRPC。
?
本文源碼GitHub:https://github.com/linezero/Blog/tree/master/gRPCDemo?
相關(guān)文章:?
谷歌發(fā)布的首款基于HTTP/2和protobuf的RPC框架:GRPC
C#中使用gRPC
Google高性能RPC框架gRPC 1.0.0發(fā)布
原文地址:http://www.cnblogs.com/linezero/p/grpc.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
- 上一篇: ASP.NET Core开发-Docke
- 下一篇: 如果你也会C#,那不妨了解下F#(6):