在学习go商场小项目时大量的用到了thrift和proto这两种IDL接口定义语言来生成代码,对该语言的语法规则以及生成的文件夹等感到十分的困惑,在一番仔细的研究之后,将学习到的知识记录在此,希望能对大家有所帮助
IDL (Interface Definition Language,接口定义语言)
是一种用于描述软件组件之间通信接口的语言。它独立于编程语言,通过定义接口及其数据类型,使不同系统、不同语言的程序能够相互通信。IDL 通常用于分布式系统和中间件框架,例如 CORBA、gRPC 和 Thrift 等。
一、Proto 基本概念
1. Proto 文件(.proto)
- Proto 文件用于定义数据结构和服务接口。
- 包含消息类型、枚举、服务和方法等定义。
2. 核心元素:
- 消息(message): 定义数据结构。
- 枚举(enum): 定义一组常量值。
- 服务(service): 定义 RPC 接口及方法。
二、基本语法结构
一个简单的 .proto 文件示例:
syntax = "proto3"; // 指定语法版本,proto3 是最新版本
package myapp; // 定义包名,避免命名冲突
// 定义一个消息类型
message User { // 每个字段必须设定一个编号
int32 id = 1; // 定义字段,类型为 int32
string name = 2; // 字符串类型
bool is_active = 3; // 布尔类型
}
// 定义一个枚举类型
enum Status {
UNKNOWN = 0;
ACTIVE = 1;
INACTIVE = 2;
}
// 定义请求和响应消息
message UserRequest {
int32 user_id = 1;
}
message UserResponse {
User user = 1;
}
// 定义服务接口
service UserService {
rpc GetUserById (UserRequest) returns (UserResponse); // 定义 RPC 方法
}
三、Proto 文件的核心元素
1. Syntax 声明
- 使用
syntax = "proto2";或syntax = "proto3";指定版本。 - proto3 是最新版本,提供了更简洁的语法和更好的支持。
2. Package(包)
- 通过
package定义命名空间,避免不同文件中的类型冲突。
3. Message(消息)
- 消息是 Proto 中的核心部分,用于定义数据结构。
- 每个字段需要指定类型和字段编号(唯一的整数)。
message Example {
int32 id = 1;
string name = 2;
}
4. 字段类型
Protobuf 支持多种基本类型,如: (proto类型与go语言变量类型的对应关系,可以在cloudwego官方文档查看)
- 整型:
int32,int64,uint32,uint64,sint32,sint64 - 浮点型:
float,double - 布尔型:
bool - 字符串:
string - 字节数组:
bytes
5. 枚举(Enum)
定义一组命名常量:
enum Color {
RED = 0;
GREEN = 1;
BLUE = 2;
}
6. Service(服务)
定义 RPC 接口和方法:
service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
四、Proto 的使用
-
定义
.proto文件: 编写数据结构和接口。 -
生成代码: 使用
protoc编译器生成对应语言的代码(支持 Go、Java、Python、C++ 等)。 下面是使用cwgo代码生成工具来生成一个rpc服务cwgo server -I ../../idl --type HTTP --service frontend --module github.com/cloudwego/biz-demo/gomall/app/frontend --idl ../../idl/frontend/auth_page.proto -
使用生成的代码: 在应用程序中序列化和反序列化数据。
五、Proto 的特点与优势
- 高效的序列化格式:
Protobuf 使用二进制格式,数据传输效率高,占用空间小。 - 跨语言支持:
支持多种编程语言,方便不同平台之间的通信。 - 向后兼容:
新版本的消息可以添加字段,不会影响旧版本的数据解析。 - 自动生成代码:
通过.proto文件,自动生成数据结构和 RPC 代码,减少手工编写工作量。
总结
经过本次学习对IDL的使用以及微服务框架和RPC的概念理解更加深刻,此后我会进一步将proto结合hertz以及kitex来生成代码,以极大的提升我的开发效率和学习hertz和kitex的使用。