简言:介绍Thrift的IDL基本语法,初次使用或多或少的会有很有"坑"要踩,但是我们要遇山挖山,遇海填海,在学习的道路上坚定的走下去,方可日后吹牛B!

IDL

Thrift 采用IDL(Interface Definition Language)来定义通用的服务接口,然后通过Thrift提供的编译器,可以将服务接口编译成不同语言编写的代码,通过这个方式来实现跨语言的功能。

基本类型

bool: 布尔值 对应Java中的boolean

byte: 有符号字节 对应Java中的byte

i16: 16位有符号整型 对应Java中的short

i32: 32位有符号整型 对应Java中的int

i64: 64位有符号整型 对应Java中的long

double: 64位浮点型 对应Java中的double

string: 字符串 对应Java中的String

binary: Blob 类型 对应Java中的byte[]

struct 结构体

struct有以下一些约束:

1.struct不能继承,但是可以嵌套,不能嵌套自己。(0.12.0版本可以支持嵌套自己本身)

2.其成员都是有明确类型

3.成员是被正整数编号过的,其中的编号使不能重复的,这个是为了在传输过程中编码使用。

4.成员分割符可以是逗号(,)或是分号(;),而且可以混用

5.字段会有optional和required之分和protobuf一样,但是如果不指定则为无类型–可以不填充该值,但是在序列化传输的时候也会序列化进去,optional是不填充则部序列化,required是必须填充也必须序列化。

6.每个字段可以设置默认值

7.同一文件可以定义多个struct,也可以定义在不同的文件,进行include引入。

举个"栗"子:

struct User{
1: required string name, //改字段必须填写
2: optional i32 age = 0; //默认值
3: bool gender //默认字段类型为optional
}

规则:

如果required标识的域没有赋值,Thrift将给予提示;

如果optional标识的域没有赋值,该域将不会被序列化传输;

如果某个optional标识域有缺省值而用户没有重新赋值,则该域的值一直为缺省值;

如果某个optional标识域有缺省值或者用户已经重新赋值,而不设置它的__isset为true,也不会被序列化传输。

Container (容器)

有3种可用容器类型:

list: 元素类型为t的有序表,容许元素重复。对应c++的vector,java的ArrayList或者其他语言的数组

set: 元素类型为t的无序表,不容许元素重复。对应c++中的set,java中的HashSet,python中的set,php中没有set,则转换为list类型了

map<t, t>: 键类型为t,值类型为t的kv对,键不容许重复。对用c++中的map, Java的HashMap, PHP 对应 array, Python/Ruby 的dictionary

举个"栗"子:

struct Test {
1: map<string, User> usermap,
2: set<i32> intset,
3: list<double> doublelist
}

enum (枚举)

约束:

1.编译器默认从0开始赋值

2.可以赋予某个常量某个整数

3.允许常量是十六进制整数

4.末尾没有分号

5.给常量赋缺省值时,使用常量的全称

规则:

Thrift不支持枚举类嵌套,枚举常量必须是32位的正整数

举个"栗"子

enum HttpStatus {
OK = 200,
NOTFOUND=404
}

常量定义

使用方法:在变量前面加上const

举个"栗"子

const i32 const_int = 1;

类型定义

Thrift支持C/C++类型定义

举个"栗"子

typedef i32 myint
typedef i64 usernumber

规则:

末尾没有逗号

Exception (异常)

异常在语法和功能上类似于结构体,差别是异常使用关键字exception,而且异常是继承每种语言的基础异常类。

举个"栗"子

exception MyException {
1: i32 errorCode,
2: string message
}

Service (服务定义类型)

服务的定义方法在语义上等同于面向对象语言中的接口。

service HelloService {
i32 sayInt(1:i32 param)
string sayString(1:string param)
bool sayBoolean(1:bool param)
void sayVoid()
}

编译后的Java代码

public class HelloService {
public interface Iface {
public int sayInt(int param) throws org.apache.thrift.TException;
public java.lang.String sayString(java.lang.String param) throws org.apache.thrift.TException;
public boolean sayBoolean(boolean param) throws org.apache.thrift.TException;
public void sayVoid() throws org.apache.thrift.TException;
}
// ... 省略超级多超级多代码
}

Namespace (名字空间)

Thrift中的命名空间类似于C++中的namespace和java中的package,它们提供了一种组织(隔离)代码的简便方式。名字空间也可以用于解决类型定义中的名字冲突。

由于每种语言均有自己的命名空间定义方式(如python中有module), thrift允许开发者针对特定语言定义namespace:

举个"栗"子

namespace java com.example.test

转换成:

package com.example.test

Comment (注释)

Thrift支持C多行风格和Java/C++单行风格。

举个"栗"子

/**
* This is a multi-line comment.
* Just like in C.
*/
// C++/Java style single-line comments work just as well.

Include

便于管理、重用和提高模块性/组织性,我们常常分割Thrift定义在不同的文件中。包含文件搜索方式与c++一样。Thrift允许文件包含其它thrift文件,用户需要使用thrift文件名作为前缀访问被包含的对象,

举个"栗"子

include "test.thrift"
...
struct StSearchResult {
1: in32 uid;
...
}

thrift文件名要用双引号包含,末尾没有逗号或者分号

参考文章

Apache Thrift - 可伸缩的跨语言服务开发框架:https://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/index.html

Thrift IDL基本语法的更多相关文章

  1. Thrift IDL

    Thrift类型 Thrift类型系统旨在允许程序员尽可能使用本机类型,无论使用何种编程语言.此信息基于并取代Thrift白皮书中的信息.Thrift IDL为每一种目标语言提供了用于生成代码的类型描 ...

  2. Thrift IDL使用方式

    I.背景 众所周知,Thrift是一个RPC的框架,其可用于不同语言之间的服务相互调用.比如最近接触到的一个运用环境: *前端使用Node.Js重构了部分我们的老旧代码(前后端未分离的SpringBo ...

  3. 环境初始化 Build and Install the Apache Thrift IDL Compiler Install the Platform Development Tools

    Apache Thrift - Centos 6.5 Install http://thrift.apache.org/docs/install/centos Building Apache Thri ...

  4. golang高性能RPC:Apache Thrift安装使用完全攻略

    在企业应用中RPC的使用可以说是十分的广泛,使用该技术可以方便的与各种程序交互而不用考虑其编写使用的语言. 如果你对RPC的概念还不太清楚,可以点击这里. 现今市面上已经有许多应用广泛的RPC框架,比 ...

  5. python thrift使用实例

    前言 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.本文将从 Python开发人员角度简单介绍 Apache Thrift 的架构.开发和使 ...

  6. Thrift 基础(C++ rpc )

    一.thrift简介 thrift是Facebook开源的一套rpc框架,目前被许多公司使用 我理解的特点 使用IDL语言生成多语言的实现代码,程序员只需要实现自己的业务逻辑 支持序列化和反序列化操作 ...

  7. 【thrift】thrift详解

    转载:http://zheming.wang/thrift-rpcxiang-jie.html Thrift Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年 ...

  8. Netty学习——Thrift的入门使用

    Netty学习——Thrift的入门使用 希望你能够,了解并使用它.因为它是一个效率很高的框架 官网地址:http://thrift.apache.org/ 1.Thrift数据类型 一门技术如果需要 ...

  9. python thrift demo

    简介Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python, PHP, Ruby, Erlang, Perl, Hask ...

随机推荐

  1. 01_Linux基础篇

    学于黑马.传智播客.尚硅谷 感谢 黑马官网 传智播客官网 尚硅谷官网 微信搜索"艺术行者",关注并回复关键词"linux"获取视频和教程资料! b站在线视频 第 ...

  2. Numpy改变数组的形状

    import numpy as np n = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) # 查看数组的大小 n.size # # 将数 ...

  3. Linux系统的基本操作

    20200727 Linux目录结构 基本介绍 Linux的文件系统是采用层级式的树状结构,在此结构中的最上层是/根目录 tip1:在Linux世界里,一切皆是文件 示例 /bin: bin是Bina ...

  4. PHP metaphone() 函数

    实例 计算 "World" 的 metaphone 键: <?php高佣联盟 www.cgewang.comecho metaphone("World") ...

  5. idea中运行Tomcat后控制台出现乱码(统一设置成UTF-8)

    出现问题:运行Tomcat后控制台出现乱码,输出语句乱码(idea 2019.3版本) 解决方法: 方案1:File----->Settings..----->Editor-----> ...

  6. LeetCode(1)---检查括号出现的合法性

          题目: 检查字符串中"( )","[ ]","{ }" 的合法性,即是否成对出现 eg,如出现"[()]", ...

  7. 【从零开始撸一个App】Dagger2

    Dagger2是一个IOC框架,一般用于Android平台,第一次接触的朋友,一定会被搞得晕头转向.它延续了Java平台Spring框架代码碎片化,注解满天飞的传统.尝试将各处代码片段串联起来,理清思 ...

  8. 移动物体监控系统-sprint3移动监控主系统设计与开发

    一.移动监控的原理 通过获取摄像头图像,比较前后每一帧的图像数据,从而实现移动物体监控.所有移动监控原理都是这样,只是图像帧的对比的算法不一样. 二.移动物体监控系统的实现 选择开源的移动监控软件mo ...

  9. Java语言程序设计2019.9.16

    1.Java的基本运行单位是类. 2.类是由方法和变量组成. 3.变量类型分为byte,int,double,long,short,boolean,char,float.java中整数类型默认的int ...

  10. Java多线程入门及实战

    基本概念: 1: 程序 2 进程 3 线程 4 进程和线程的区别 5 进程和程序的区别 Java实现多线程的方法: 1 继承Thread 2 实现Runable 3 实现callable 4 线程池的 ...