Grpc介绍
GitHub: https://github.com/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中,其主要应用场景如下:
低延迟、高扩展性、分布式的系统
同云服务器进行通信的移动应用客户端
设计语言独立、高效、精确的新协议
便于各方面扩展的分层设计,如认证、负载均衡、日志记录、监控等
上边是官方腔调介绍,总结下来就几点,跨平台,可靠,通信快,扩展性强,
貌似现在还出了个前端的grcp-web,.proto 来定义客户端 Web 应用程序和后端 gRPC 服务器之间的服务“契约”,并自动生成客户端 JavaScript 与服务端同行
毕竟google出品,不多说,。
是骡子是马拉出来溜溜
.NET core
编写跨语言服务文件(.proto)
具体语法可以谷歌或者百度一下,主要方法的定义有点不一样,但是基本就是我下面这样定义,数据类型都是一样的。大差不差
syntax ="proto3"; option java_multiple_files = true; option java_package = "md.logservice"; option java_outer_classname = "Logger"; option objc_class_prefix = "LLL";package gRPCTest; service gRPC { /* *方法 */ rpc SayHello (TestRequest) returns(TestReply) {} } /**请求对象*/message TestRequest { string name = 1; } /**返回对象*/message TestReply { string message = 1; }
编写成功后,接下来咱们就要把proto文件生成为C#代码了
先创建一个控制台项目
通过NuGet应用如下文件
这时开始用到了tools, 这个tools就是个解析grpc proto文件的工具,在nuget下载类库时会自动下载带目录下
建议新建一个文件夹专门用了处理proto文件。这里只说windows下怎么解析proto文件。解析proto会自动生成Markdown接口文档,很方便有木有
这里说一下generate.bat批处理文件怎么写
setlocal @rem enter this directory cd /d %~dp0 set TOOLS_PATH=D:\grpcTest\Tools\Grpc.Tools.1.2.0\tools\windows_x64 set DOC_TOOL_PATH=D:\grpcTest\Tools\doc%TOOLS_PATH%\protoc.exe -I./protos --csharp_out build ./protos/test.proto --grpc_out build --plugin=protoc-gen-grpc=%TOOLS_PATH%\grpc_csharp_plugin.exe%TOOLS_PATH%\protoc.exe -I./protos --plugin=protoc-gen-doc=%DOC_TOOL_PATH%\protoc-gen-doc.exe --doc_out=markdown,test.md:./doc protos/test.proto endlocal PAUSE
其实这就是一个批处理命令,但是网上很多资料复制都是报错,运行时候各种报错,神特么烦,也不跟你细说选项作用,注意事项。
下面咱们就详细说说
A、set TOOLS_PATH=D:\grpcTest\Tools\Grpc.Tools.1.2.0\tools\windows_x64 就是设置tools解析工具所在目录,下面一个set时设置接口文档生成目录,如果不需要生成grpc文档,可不写
B、 -I 指定一个或者多个目录,用来搜索.proto文件的。注意:如果不指定,那就是当前目录,没毛病。
C、--csharp_out 生成C#代码,当然了还能cpp_out、java_out、javanano_out、js_out、objc_out、php_out、python_out、ruby_out 这时候你就应该知道,这玩意就是支持多语言的,才用的,生成一些文件,然后给各个语言平台调用。参数1是输出路径,参数2是proto的文件名或者路径。
D、--grpc_out 到这里可能有人会懵逼,咋回事?C#不是有一个自己的输出目录么?怎么又一个输出?
csharp_out是输出类似于咱们平时写的实体类,接口,定义之类的。生成的文件叫,额,就叫xxx.cs吧.
grpc_out是跟服务相关,创建,调用,绑定,实现相关。生成的玩意叫xxxGrpc.cs。 对比上个选项生成的文件名,大概能了解个十之八九吧。
E、--plugin=protoc-gen-grpc=grpc_csharp_plugin.exe 这个就是csharp的插件,python有python的,java有java的。你不指定它,你毛都生成不了。
接下来咱们直接上代码了
代码挺简单的,简单到我不好意思贴代码,直接上图吧
说下需要注意的两个点,就是客户端和服务端都需要引用生成的grpc文件
服务端代
客户端代码
先启动服务端,然后启动客户端
运行成功后如下图
服务端
客户端
可以看到,已经调用成功了。
结束
对了,我司基本上都是用.net core 微服务了,和其他部门都是通过微发rpc形式合作,后面视情况,可以把,微服务docker部署 本地运行k8s,服务治理,kafka日志收集等都分享给大家, 咱们的.net core 氛围越来越好了。
感谢各位老铁能看到最后,谢谢
拜拜~~~(无彩蛋)
作者:孙悟猪