.NET Core 微服务之grpc 初体验(干货)

C#

浏览数:254

2019-6-27

AD:资源代下载服务

  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形式合作,后面视情况,一步一步介绍.net 微服务的其方面, 比如 微服务docker部署 本地运行k8s,服务治理,kafka日志收集等都分享给大家, 咱们的.net core 氛围越来越好了。

感谢各位老铁能看到最后,谢谢 

拜拜~~~(无彩蛋)

 

作者:孙悟猪