前两篇中简单介绍并使用了IDL,那么IDL支持哪些数据类型,语法又是什么?本篇文章将与大家一起学习。
Java中数据类型可以分为基本数据类型和对象类型。IDL中也类似,包含基本数据类型、容器、结构体等。更准确的说Thrift 类型系统由预定义的基本类型、用户定义的结构、容器类型、异常和服务定义组成。下面会分别进行介绍。
1. 基本数据类型
基本数据类型有如下几种:
-
bool: 布尔型,1个字节,取值为true或false。
-
byte: 有符号单字节(8位)整型。
-
i16: 有符号16位整型。
-
i32: 有符号32位整型。
-
i64: 有符号64位整型。
-
double: 64位浮点数。
-
binary: 字节数组。
-
string: 字符串
对应Java的数据类型按照顺序分别是
boolean、byte、short、int、long、double、ByteBuffer、String
2. 容器
Thrift 容器是强类型容器,映射到常用编程语言中最常用的容器。它们使用 Java 泛型样式进行注释。有三种容器类型可供选择: list:t1 类型元素的有序列表。可能包含重复项。 set:类型为 t1 的无序唯一元素集。 map<t1,t2>:t1 - t2 类型键值对。
容器中使用的类型可以是任何有效的 Thrift 类型(包括结构和异常),但不包括service。
3. 结构体
结构体可对应Java的类,但是不能继承,可以进行结构体嵌套。下面结合demo进行说明。
UserResponse.thrift
namespace java ltd.klein.thrift.server.api.resp
include '../param/UserType.thrift'
struct UserResponse {
/*
* 请求成功/失败
*/
1: bool success;
/*
* 请求结果信息
*/
2: string msg;
3: list<User> users;
}
struct User {
1: required i32 id;
2: required string nickName;
3: required i64 registerTime;
4: UserType.UserType userType = UserType.UserType.CONSUMER;
5: binary avatar;
6: optional i16 age;
7: optional string desc;
}
-
namespace:
- 编译为Java文件后,代表的是Java的package
-
include
- 引入其他thrift文件定义的struct等类型
-
struct
- 定义一个结构体,编译后对应的是Java的类
- 成员变量需要写明顺序
- 同一个thrfit文件中,可以定义多个struct,不需要与thrift文件名一致
- required 标注的参数,无论是否赋值,在序列化与反序列化时都会被处理
- optional 标注的参数,如果没有赋值,在序列化与反序列化时会被忽略
thrfit的IDL也可以定义枚举,可以指定枚举对应的值,如下:
UserType.thrift
namespace java ltd.klein.thrift.server.api.param
enum UserType {
CONSUMER,
MERCHANT = 1
}
4. Service
service对应的就是Java的接口,参数可以是基本类型也可以是结构体,同样需要标注顺序。
返回值引用的UserResponse.thrift的UserResponse struct,书写的格式如下:thrfit文件名.struct名
namespace java ltd.klein.thrift.server.api.iface
include '../resp/UserResponse.thrift'
service UserThriftServiceV2 {
UserResponse.UserResponse findUser ( 1:i32 id ) ;
}
实现类的需要实现UserThriftServiceV2.iface
package ltd.klein.thrift.server.service;
import ltd.klein.thrift.server.api.iface.UserThriftServiceV2;
import ltd.klein.thrift.server.api.resp.User;
import ltd.klein.thrift.server.api.resp.UserResponse;
import ltd.klein.thrift.server.builder.UserResponseBuilder;
import org.apache.thrift.TException;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @author Klein
*/
@Service
public class UserThriftServiceV2Impl implements UserThriftServiceV2.Iface {
@Override
public UserResponse findUser ( int id ) throws TException {
if ( id == 0 ) {
User user = new User () ;
user.setId ( id ) ;
user.setNickName ( "zhangsan" ) ;
List < User > users = List.of ( user ) ;
return UserResponseBuilder.buildSuccess ( users ) ;
}
return UserResponseBuilder.buildSuccess ( new ArrayList <>( 0 )) ;
}
}
到这里对于IDL文件的介绍就结束了,主要介绍了IDL的基本数据类型、容器、结构体与service的编写与用法。如有问题欢迎留言,共同进步。