GRPC的学习

GRPC的入门、语法解析

学习grpc之前,得先了解一下什么是rpc远程调用?这里做一个简单的介绍,详细精确的介绍可以参考别的文章。

RPC框架:
RPC,即Remote Procedure Call(远程过程调用),主要在TCP协议之上进行工作;
HTTP,即HyperText Transfer Protocol(超文本传输协议),主要在HTTP协议之上进行工作。
常见的RPC框架:
非跨平台的:
Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于 2011 年末对外开源,仅支持 Java 语言。
Motan:微博内部使用的 RPC 框架,于 2016 年对外开源,仅支持 Java 语言。
Tars:腾讯内部使用的 RPC 框架,于 2017 年对外开源,仅支持 C++ 语言。
Spring Cloud:国外 Pivotal 公司 2014 年对外开源的 RPC 框架,仅支持 Java 语言
跨语言平台的:
gRPC:Google 于 2015 年对外开源的跨语言 RPC 框架,支持多种语言。(C, C++, Python, PHP, Nodejs, C#, Objective-C、Golang、Java)
Thrift:最初是由 Facebook 开发的内部系统跨语言的 RPC 框架,2007 年贡献给了 Apache 基金,成为 Apache 开源项目之一,支持多种语言。

		因为公司用到的是grpc,所以下面只记录grpc的用法,其他的可以自行去CSDN查看学习;

一、GRPC框架的定义

grpc是谷歌的一种高性能、开源的通用型RPC框架;支持多达十几种常用语言,它的原理是通过 IDL(Interface Definition Language)文件定义服务接口的参数和返回值类型,然后通过代码生成程序生成服务端和客户端的具体实现代码,这样在 	gRPC 里,客户端应用可以像调用本地对象一样调用另一台服务器上对应的方法。

主要特性

1、通信协议采用了 HTTP/2,因为 HTTP/2 提供了连接复用、双向流、服务器推送、请求优先级、首部压缩等机制
2、IDL 使用了ProtoBuf,ProtoBuf 是由 Google 开发的一种数据序列化协议,它的压缩和传输效率极高,语法也简单
3、多语言支持,能够基于多种语言自动生成对应语言的客户端和服务端的代码。

在使用GRPC之前,需要先学习一下,如何去定义GRPC服务;grpc使用 protocol buffer (简称Protobuf )文件格式来定义服务的,使用者可以通过学习Protobuf的语法,去定义服务和需要的函数,然后去生成底层的rpc框架;

二、Protobuf文件解剖

  1. syntax:
    用来说明使用Protobuf的版本,一般需要指定,否则默认是proto2;
  2. 数据类型

自定义类型:
message:一种自定义数据类型,可以用来定义消息;message类型(对象,如上文的SearchRequest就是message类型)的默认值与 语言 相关
常用数据类型:
int32:对应java的int类型;数字类型的默认值是0
int64:对应java的long类型;数字类型的默认值是0
string:对应java的String类型;string类型的默认值是空字符串
bool:对应java的boolean类型;bool类型的默认值是false
double和float:分别对应java的double和float类型;
其他的数据类型可以想见官网.
枚举类型:
emun:枚举对应java的枚举,但是必须要有一个元素,且第一个元素的值必须为0;enum类型的默认值是第一个定义的枚举值
注意:一个数值可以对应多个枚举值,必须标明option allow_alias = true;
例如:
enum EnumAllowingAlias {
option allow_alias = true;
UNKNOWN = 0;
STARTED = 1;
RUNNING = 1;
}

3.修饰符:

repeated:修饰的变量类型返回的结果必须是0个或者多个;repeated修饰的字段默认值是空列表
reserved:修饰的变量类型返回的结果必须是0个或者1个;
required:修饰的变量类型返回的结果必须是1个;

4.代码值:

在定义变量的“=”右边,都必须写一个相应的代码值,这个值的范围是:1~2^32(4294967296)
其中 1~15的编码时间和空间效率都是最高的,编码值越大,其编码的时间和空间效率就越低(相对于1-15),当然一般情况下相邻的2个值编码效率的是相同的,除非2个值恰好实在4字节,12字节,20字节等的临界区。比如15和16.
1900~2000编码值为Google protobuf 系统内部保留值,建议不要在自己的项目中使用。
protobuf 还建议把经常要传递的值把其字段编码设置为1-15之间的值。
消息中的字段的编码值无需连续,只要是合法的,并且不能在同一个消息中有字段包含相同的编码值。
建议:项目投入运营以后涉及到版本升级时的新增消息字段全部使用optional或者repeated,尽量不实用required。如果使用了required,需要全网统一升级,如果使用optional或者repeated可以平滑升级。

5.option(可选项):

文件级别,这样的选项将影响当前文件中定义的所有消息和枚举。
消息级别,这样的选项仅影响某个消息及其包含的所有字段。
字段级别,这样的选项仅仅响应与其相关的字段。
package:
1、为了避免类型命名冲突,指定唯一的命名空间
2、方便其他protocol文件引入
eg: package helloworld;
java_package (file option): 是文件级别的选项,表明生成java类所在的包。如果在.proto文件中没有明确的声明java_package,就采用默认的包名。
当然了,默认方式产生的 java包名并不是最好的方式,按照应用名称倒序方式进行排序的。如果不需要产生java代码,则该选项将不起任何作用。
与此同时,生成的Java文件也将会自动存放到指定输出目录下的com/example/foo子目录中。
eg:
option java_package = “com.example.foo”;
java_outer_classname (file option): 是文件级别的选项,表明想要生成Java类的名称。如果在.proto文件中没有明确的java_outer_classname定义,
生成的class名称将会根据.proto文件的名称采用驼峰式的命名方式进行生成。如(foo_bar.proto生成的java类名为FooBar.java),如果不生成java代码,
则该选项不起任何作用。
eg:
option java_outer_classname = “Ponycopter”;
import:类似java的import导入其他的类
eg:
import “common/common.proto”;
import “helloworld”;

6.service(定义服务)
服务类型:一共有四种。

简单rpc:就是一般的rpc调用,一个请求对象对应一个返回对象
proto语法:rpc simpleHello(Person) returns (Result) {}
服务端流式rpc:一个请求对象,服务端可以传回多个结果对象
proto语法:rpc serverStreamHello(Person) returns (stream Result) {}
客户端流式rpc:客户端传入多个请求对象,服务端返回一个响应结果
proto语法:rpc clientStreamHello(stream Person) returns (Result) {}
双向流式rpc:结合客户端流式rpc和服务端流式rpc,可以传入多个对象,返回多个响应对象
proto语法:rpc biStreamHello(stream Person) returns (stream Result) {}

三、案例说明

例子:
		syntax = "proto3"; // 指定基于 protobuf 3 协议
		package general_match; // 指定对应的包名 
		message Student {
		    int32 id = 1;       // 定义 int32 类型的成员变量,变量名为 id
		    double time = 2;     // 定义 double 类型的成员变量,变量名为 time
		    string name = 3;     // 定义 string 类型的成员变量,变量名为 name
		    repeated double score = 4; // 定义一个 double 的数组,变量名为 score
		}

		message BytesData {  // 定义了一个二进制的数据格式
		    int32 size = 1;
		    bytes data = 2;
		}
		service Test {  // 定义了一个名为 Test 的服务
		    rpc test(BytesData) returns (Student) {}   //定义了test方法,BytesData是入参,Student是出参。需要注意的是入参和出参无法使用简单的数据类型不然会报 Expected message type.
		}

参考文章:
https://blog.csdn.net/jiaweiok123/article/details/87809831
https://blog.csdn.net/twtydgo/article/details/79266192
http://www.cnblogs.com/resentment/p/6714610.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值