Thrift RPC 系列教程(1)——Thrift语言

Thrift不是严格意义上的编程语言,可是却赛过不少编程语言,充满了美感。

基础数据类型

Thrift 这门编程语言提供了以下几种基础的数据类型:编程

  • bool: A boolean value (true or false)
  • byte: An 8-bit signed integer
  • i16: A 16-bit signed integer
  • i32: A 32-bit signed integer
  • i64: A 64-bit signed integer
  • double: A 64-bit floating point number
  • string: A text string encoded using UTF-8 encoding

通常来讲,咱们也就经常使用那几种,就像在其余平常编程语言中同样。好比我,基本就是这『三板斧』:数组

  • bool
  • i32 ( 如今逐步经常使用 i64 了,由于性能啥的,我基本不是第一时间关注的)
  • double
  • string

复杂数据类型(容器)

再让咱们来看看,Thrift提供了哪些容器类型:数据结构

  • list: An ordered list of elements. Translates to an STL vector, Java ArrayList, native arrays in scripting languages, etc.
  • set: An unordered set of unique elements. Translates to an STL set, Java HashSet, set in Python, etc. Note: PHP does not support sets, so it is treated similar to a List
  • map: A map of strictly unique keys to values. Translates to an STL map, Java HashMap, PHP associative array, Python/Ruby dictionary, etc. While defaults are provided, the type mappings are not explicitly fixed. Custom code generator directives have been added to allow substitution of custom types in various destination languages

简直了C++ STL 一毛同样,命名都差很少。惟独 list 这种数据结构,实际上是『动态数组』,单从名字上看,很容易让人联系到链表,这在其余的编程语言中,也有这个现象,好比Python 中的也叫作 list 。app

class,即struct

稍微正常一点的语言,对 OOP 的支持,天然是必不可少的,我以为,最好直接提供 class 这个关键字,尽可能有清晰的语义。编程语言

可是 Thrift 只有一个 struct,基本上和 C 的struct,同样,也是功能少得可怜,不过考虑到它仅仅是一个中间语言,天然是情有可原的。ide

咱们来看一下,一个写得好的 struct,应该如何定义,作到既清晰又完备的:函数

struct Person {
    1: required string name; // 必须字段,很明确
    2: required i64 age;
    3: optional string addr; // 可选字段
    4: optional string defaultValue = "DEFAULT"; // 默认字段
    5: string otherValue; // 不是很明确!
}

interface,即service

在『面向接口编程』的原则下,『接口』是一个很重要的因素。有的人称之为函数,有的人称为方法,本文咱们统称为『方法』。性能

在Thrift中,定义接口是一件很简单的事情( 摘自官网的一个示例 ):ui

// 接口, 还能够继承, 也许咱们有时候能够搞个 『BaseService』 之类的,不过我不多用到。
service Calculator extends shared.SharedService {  
    
 // 正常方法,和C++这类传统语言,基本如出一辙。
   void ping(),

   i32 add(1:i32 num1, 2:i32 num2),

   i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),
    
 // 特殊方法,基本不多用到了,在我有限的经历中,只使用过一次,读者不必关注它
   oneway void zip()

}

异常,即exception

关于异常,在Thrift中就像定义 struct 同样,由于exception从概念上讲,也是一种class,所谓『万事万物皆对象』嘛。不过如今咱们用『exception』这个关键字,也正好符合我前文所讲的,清晰的语义。让咱们看看Thrift中的异常是如何定义的:code

exception InvalidOperation {
  1: i32 whatOp,
  2: string why
}

枚举

枚举这个东西,真的是过重要了,和前面的exception相似,它也不过是一种class而已。不过Thrift中只支持枚举 int 值,比较遗憾,其实不少时候,对枚举的要求,咱们是很丰富的,好比支持 枚举 string。Thrift中枚举以下:

enum Operation { // 功能着实比较孱弱
  ADD = 1,
  SUBTRACT = 2,
  MULTIPLY = 3,
  DIVIDE = 4
}
若是喜欢个人文章,请关注个人公众号:『浮生若梦的编程』。 也能够关注个人简书专栏:『浮生若梦的编程』。 或者加入个人知识星球,『浮生若梦的编程』,获取更多干货。
相关文章
相关标签/搜索