Thrift 03 | Thrift IDL介绍

239 阅读3分钟

前两篇中简单介绍并使用了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;

}
  1. namespace:

    1. 编译为Java文件后,代表的是Java的package
  2. include

    1. 引入其他thrift文件定义的struct等类型
  3. struct

    1. 定义一个结构体,编译后对应的是Java的类
    2. 成员变量需要写明顺序
    3. 同一个thrfit文件中,可以定义多个struct,不需要与thrift文件名一致
    4. required 标注的参数,无论是否赋值,在序列化与反序列化时都会被处理
    5. 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的编写与用法。如有问题欢迎留言,共同进步。