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

浮生若夢的程式設計發表於2018-11-05

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 。

class,即struct

稍微正常一點的語言,對 OOP 的支援,自然是必不可少的,我覺得,最好直接提供 class 這個關鍵字,儘量有清晰的語義。

但是 Thrift 只有一個 struct,基本上和 C 的struct,一樣,也是功能少得可憐,不過考慮到它僅僅是一箇中間語言,自然是情有可原的。

我們來看一下,一個寫得好的 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中,定義介面是一件很簡單的事情( 摘自官網的一個示例 ):

// 介面, 還可以繼承, 也許我們有時候可以搞個 『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中的異常是如何定義的:

exception InvalidOperation {
  1: i32 whatOp,
  2: string why
}
複製程式碼

列舉

列舉這個東西,真的是太重要了,和前面的exception類似,它也不過是一種class而已。不過Thrift中只支援列舉 int 值,比較遺憾,其實很多時候,對列舉的要求,我們是很豐富的,比如支援 列舉 string。Thrift中列舉如下:

enum Operation { // 功能著實比較孱弱
  ADD = 1,
  SUBTRACT = 2,
  MULTIPLY = 3,
  DIVIDE = 4
}
複製程式碼

如果喜歡我的文章,請關注我的公眾號:『浮生若夢的程式設計』。
也可以關注我的簡書專欄:『浮生若夢的程式設計』。
或者加入我的知識星球,『浮生若夢的程式設計』,獲取更多幹貨。

相關文章