Grpc简介
gRPC是谷歌开源的一款高性能、支持多种开发语言的服务框架,对于一个rpc我们关注如下几方面:
序列化协议:gRPC使用protobuf,首先使用protobuf定义服务,然后使用这个文件来生成客户端和服务端的代码。因为pb是跨语言的,因此即使服务端和客户端语言并不一致也是可以互相序列化和反序列化的
网络传输层:gRPC使用http2.0协议,http2.0相比于HTTP 1.x ,大幅度的提升了 web 性能。
如何学习
首先,你得学习Protocol Buffers,简单的
说,它可以用来定义消息和服务。然后,你只需要实现服务即可,剩余的gRPC代码将会自动为你生成。.proto这个文件可以适用于十几种开发语言(包括服务端和客户端),并且它允许你使用同个框架来支持每秒百万级以上的RPC调用。
开发模式
gPRC使用的是合约优先的API开发模式,它默认使用Protocol buffers (protobuf) 作为接口设计言 (IDL),这个proto文件包括两部分:
- gRPC服务的定义
- 服务端和客户端之间传递的消息
为什么使用Protocol buffers呢?
- 它和开发语言无关
- 可以生成所有主流开发语言的代码
- 数据是二进制格式的,串行化效率搞,Payload比较小
- 适合传输大量的数据
- 通过设定某些规则,使得API进化也很简单
开发环境
VSCode的扩展插件:
vscode-proto3和Clang-Format这两个扩展
Windows还需要安装Clang,Windows 64位系统的地址如下:Clang for Windows (64-bit)
Mac:brew install clang-format .
拓展
什么是gcc
GCC是GNU编译器集合的缩写,是一款由GNU开发的自由软件编译器。它支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada、和Java等。GCC具有优秀的代码生成和优化能力,能够生成高效的目标代码,是许多操作系统和嵌入式设备的主要编译器。
除了代码生成和优化能力,GCC还提供了丰富的工具链,包括调试器、性能分析工具、自动化构建工具等。GCC在Linux和其他Unix-like操作系统中被广泛使用,并且也被移植到其他平台上,如Windows、macOS、和Android等。
GCC是开源软件,任何人都可以自由地使用、修改和分发它。由于其开放的架构,许多公司和组织都为GCC做出了贡献,使得它不断发展和完善。
什么是clang
Clang是一个用于编译C,C++和Objective-C程序的开源编译器前端。它是LLVM编译器基础设施项目的一部分,提供了高度优化的代码生成和先进的诊断功能。Clang以其快速的编译速度和低内存占用而闻名,并被广泛用于开发和维护大型软件项目。除了作为独立的编译器使用之外,Clang还可以作为其他工具链的一部分,如IDE、静态分析工具、重构工具等。
Clang和GCC都是用于编译C,C++和Objective-C程序的开源编译器。它们的最大区别在于其架构和实现方式。
GCC是一种传统的编译器,它是基于多个独立的阶段构建的,每个阶段都有自己的独立代码和数据结构。这种架构使得GCC在处理复杂代码时会比较慢,并且需要更多的内存。然而,GCC的代码生成和优化能力是非常强大的。
相比之下,Clang采用了一种模块化的设计,所有的编译过程都是在一个统一的框架中完成的,使得它在编译速度和内存占用方面都有着优异的表现。此外,Clang的诊断能力也比GCC更强大,能够提供更加详细的错误信息和警告。
总的来说,Clang和GCC都有其自身的优势和劣势,在不同的场景下选择使用不同的编译器可以获得更好的效果。
标量类型
数值型,数值型有很多种形式: double,float,int32int64,uint32,uint64,sint32,sint64.
fixed32,fixed64.sfixed32.sfixed64 根据需要选择对应的数值类型。
布尔型,bool型可以有True和False两个值。
字符串,string表示任意长度的文本,但是它必须包含的是UTF-8编码或7位ASCI的文本,长度不可超过。
字节型,bytes可表示任意的byte数组序列,但是长度也不可以超过 ,最后是由你来决定
如何解释这些bytes。例如你可以使用这个类型来表示一个图片。
示例
syntax = "proto3";
message FirstMessage{
int32 id = 1;
string name = 2;
bool is_male = 3;
}
上面的FirstMessage消息定义指定了三个字段(名称/值对),一个用于每条数据要在此类型的消息包括。每个字段都有一个名 称和类型。 id字段的类型是int32, name 字段的类型是String,is_male的字段类型bool。但是,我们也可以为字段指定复合类型,包括枚举和其他消息类型。
tips:
对于protobuf来说,tag尤为重要。tag的范围在1 ~ ,但不能使用19000 ~ 19999之间的数,这部分数要保留。保留19000~19999之间的tag数是为了向后兼容。 这些数是为一些特殊的字段保留的,这些字段在旧版本的protobuf协议中已经使用了。如果在新版本中重新使用这些tag,会导致与旧版本的数据不兼容。因此,为了保持向后兼容性,需要保留这些tag数,以便旧版本的数据能够与新版本的代码正常交互。
保留字段
你对定义的消息类型进行了更新,例如删除某个字段或者注释掉某个字段,那么其他开发者在后续更新这个消息类型的时候可能会重新使用被你删除/注释的字段的数值(tag),这就会引起严重的问题。
所以可以通过标记 reserved来解决,将删除/注释的字段的数值标记,如果其他人再使用这个数值为字段的tag,那么编译器就会有错误提示。
指定字段规则
您指定消息字段是以下内容之一:
required:格式正确的消息必须恰好具有此字段之一。
optional:格式正确的邮件可以包含零个或一个该字段(但不能超过一个)。
repeated:在格式正确的邮件中,此字段可以重复任意次(包括零次)。重复值的顺序将保留。
由于历史原因,repeated标量数字类型的字段编码效率不如预期。新代码应使用特殊选项[packed=true]来获得更有效的编码。
例子
syntax = "proto3";
message FirstMessage{
int32 id = 1;
string name = 2;
bool is_male = 3;
float height = 4;
repeated string phone_number = 5;
reserved 9,10 , 20 to 100 ,200 to max //标记9,10 20-100,200-max
Gender g = 11;
// 枚举
enum Gender{
Fmale = 1;
Male = 2;
// 枚举内也可以resrved,和外界没关系
reserved 9,10
}
}
设置Protocol Buffers编译器
protoc比那一起主要是用来生成代码的,下载地址是:github.com/protocolbuf…
下载后把bin目录写到环境变量中
打包
是为了避免一个项目中可能出现消息(message)相同的情况,所以需要用打包如 package "my.project"(一般语言),也可以 option csharp_namesapce = "MY.Web"(c#)
#测试
// 将生成的c#的proto放到 csharp文件夹
PS E:\Go\pb> protoc .\first.proto --csharp_out=csharp
不建议修改生成的cs文件,直接修改proto文件,然后再生成一份