gRPC C#学习
前些天gRPC 发布1.0 版本,代表着gRPC 已经正式进入稳定阶段。
今天我们就来学习gRPC C# 。而且目前也已经支持.NET Core 可以实现完美跨平台。
传统的.NET 可以通过Mono 来实现跨平台调用。
GitHub: https://github.com/grpc/grpc
官方文档:使用 C# 的 gRPC 服务 | Microsoft Docs
参考文档:http://doc.oschina.net/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。
本文源码GitHub:https://github.com/linezero/Blog/tree/master/gRPCDemo
如果你觉得本文对你有帮助,请点击“推荐”,谢谢。
出处:https://www.cnblogs.com/linezero/p/grpc.html
说明一下:
这里参数需要详细说明一下(摘抄自:入门干货之Grpc的.Net 封装-MagicOnion),在这里卡了很长时间:
1. -I 指定一个或者多个目录,用来搜索.proto文件的,如果不指定,那就是当前目录,因为-I已经指定了。
2、 --csharp_out 用来生成C#代码,当然了还能cpp_out、java_out、javanano_out、js_out、objc_out、php_out、python_out、ruby_out 这时候你就应该知道,这玩意就是支持多语言的,才用的,生成一些文件,然后给各个语言平台调用。参数1是输出路径,参数2是proto的文件名或者路径。
3、--grpc_out 到这里可能有人会懵逼,咋回事?C#不是有一个自己的输出目录么?怎么又一个输出?
csharp_out是输出类似于咱们平时写的实体类,接口,定义之类的。生成的文件叫,额,就叫xxx.cs吧.
grpc_out是跟服务相关,创建,调用,绑定,实现相关。生成的玩意叫xxxGrpc.cs。 对比上个选项生成的文件名,大概能了解个十之八九吧。
4、--plugin=protoc-gen-grpc=grpc_csharp_plugin.exe 这个就是c#的插件,python有python的,java有java的。必须要指定它。
出处:https://blog.csdn.net/img_Guo/article/details/86096604
我自己测试使用的如下:请把下面的代码保存到grpc.bat文件中
packages\Grpc.Tools.2.27.0\tools\windows_x86\protoc.exe -IGrpcTest.Lib --csharp_out GrpcTest.Lib GrpcTest.Lib\helloworld.proto --grpc_out GrpcTest.Lib --plugin=protoc-gen-grpc=packages\Grpc.Tools.2.27.0\tools\windows_x86\grpc_csharp_plugin.exe
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/12392104.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!
posted on 2020-03-01 21:10 jack_Meng 阅读(1207) 评论(0) 编辑 收藏 举报