查看原文
其他

【干货】.NET Core微服务之Grpc初体验

DotNet 2019-08-03

(给DotNet加星标,提升.Net技能


转自:孙悟猪

cnblogs.com/DanielYao/p/10505392.html


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 directorycd /d %~dp0
set TOOLS_PATH=D:\grpcTest\Tools\Grpc.Tools.1.2.0\tools\windows_x64set 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
endlocalPAUSE


其实这就是一个批处理命令,但是网上很多资料复制都是报错,运行时候各种报错,神特么烦,也不跟你细说选项作用,注意事项。


下面咱们就详细说说


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 氛围越来越好了。


推荐阅读

(点击标题可跳转阅读)

.NET Core谈ELK,Splunk,Exceptionless统一日志收集

.NET Core开发BT Tracker 服务器

.NET开源快速开发框架Colder发布


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

喜欢就点一下「好看」呗~

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存