RPC之Thrift

1、RPC基本原理

一、開發步驟

RPC(Remote Procedure Call),遠程過程調用,大部分的RPC框架都遵循以下三個開發步驟:java

1. 定義一個接口說明文件:描述了對象(結構體)、對象成員、接口方法等一系列信息;
2. 經過RPC框架所提供的編譯器,將接口說明文件編譯成具體的語言文件;
3. 在客戶端和服務器端分別引入RPC編譯器所生成的文件,便可像調用本地方法同樣調用服務端代碼;編程

二、通訊過程

一、客戶過程以正常方式調用客戶樁(client stub,一段代碼);
二、客戶樁生成一個消息,而後調用本地操做系統;
三、客戶端操做系統將消息發送給遠程操做系統;
四、遠程操做系統將消息交給服務器樁(server stub,一段代碼);
五、服務器樁將參數提取出來,而後調用服務器過程;
六、服務器執行要求的操做,操做完成後將結果返回給服務器樁;
七、服務器樁將結果打包成一個消息,而後調用本地操做系統;
八、服務器操做系統將含有結果的消息發送回客戶端操做系統;
九、客戶端操做系統將消息交給客戶樁;
十、客戶樁將結果從從消息中提取出來,返回給調用它的客戶過程;json

三、和RESTful API對比

流量消耗。RESTful API 在應用層使用 HTTP 協議,哪怕使用輕型、高效、傳輸效率高的 JSON 也會消耗較大的流量,而 RPC 傳輸既可使用 TCP 也可使用 UDP,並且協議通常使用二制度編碼,大大下降了數據的大小,減小流量消耗。服務器

對接異構第三方服務時,一般使用 HTPP/RESTful 等公有協議,對於內部的服務調用,應用選擇性能更高的二進制私有協議架構

2、thrift架構

Thrift是一款由Fackbook開發的可伸縮、跨語言的服務開發框架,該框架已經開源而且加入的Apache項目。Thrift主要功能是:經過自定義的Interface Definition Language(IDL),能夠建立基於RPC的客戶端和服務端的服務代碼。數據和服務代碼的生成是經過Thrift內置的代碼生成器來實現的。Thrift 的跨語言性體如今,它能夠生成C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml , Delphi等語言的代碼,且它們之間能夠進行透明的通訊。框架

圖中Your Code是用戶實現的業務邏輯,接下來的FooService.Client和Foo.write()/read()是thrift根據IDL生成的客戶端和服務端的代碼,對應於RPC中Client stub和Server stub。TProtocol 用來對數據進行序列化與反序列化,具體方法包括二進制,JSON 或者 Apache Thrift 定義的格式。TTransport 提供數據傳輸功能,使用 Apache Thrift 能夠方便地定義一個服務並選擇不一樣的傳輸協議。socket

一、TTransport層

表明thrift的數據傳輸方式,thrift定義了以下幾種經常使用數據傳輸方式編程語言

TSocket: 阻塞式socket;
TFramedTransport: 以frame爲單位進行傳輸,非阻塞式服務中使用;
TFileTransport: 以文件形式進行傳輸;工具

二、TProtocol層

表明thrift客戶端和服務端之間傳輸數據的協議,通俗來說就是客戶端和服務端之間傳輸數據的格式(例如json等),thrift定義了以下幾種常見的格式性能

TBinaryProtocol: 二進制格式;
TCompactProtocol: 壓縮格式;
TJSONProtocol: JSON格式;
TSimpleJSONProtocol: 提供只寫的JSON協議;

三、thrift IDL文件

thrift IDL不支持無符號的數據類型,由於不少編程語言中不存在無符號類型,thrift支持一下幾種基本的數據類型

  • byte: 有符號字節
  • i16: 16位有符號整數
  • i32: 32位有符號整數
  • i64: 63位有符號整數
  • double: 64位浮點數
  • string: 字符串

此外thrift還支持如下容器類型:

  • list: 一系列由T類型的數據組成的有序列表,元素能夠重複;
  • set: 一系列由T類型的數據組成的無序集合,元素不可重複;
  • map: 一個字典結構,Key爲K類型,Value爲V類型,至關於java中的HashMap;

thrift容器中元素的類型能夠是除了service以外的任何類型,包括exception

thirft支持struct類型,目的就是講一些數據聚合在一塊兒,方便傳輸管理,struct定義形式以下:

struct People {
1:string name;
2:i32 age;
3:string gender;
}

thrift支持枚舉類型,定義形式以下:

enum Gender {
MALE,
FEMALE
}

thrift支持自定義異常類型exception,異常定義形式以下:

exception RequestException {
1:i32 code;
2:string reason;
}

thrift定義服務至關於Java中建立接口同樣,建立的service通過代碼生thrift代碼生成工具編譯後就會生成客戶端和服務端的框架代碼,service的定義形式以下:

service HelloWorldService {
// service中能夠定義若干個服務,至關於Java Interface中定義的方法
string doAction(1:string name, 2:i32 age);
}

thrift支持給類型定義別名,以下所示:

typedef i32 int
typedef i64 long

thrift也支持常量的定義,使用const關鍵字:

const i32 MAX_RETRIES_TIME = 10;
const string MY_WEBSITE = "http://facebook.com";

thrift支持命名空間,命名空間至關於Java中的package,主要用於組織代碼,thrift使用關鍵字namespace定義命名空間,格式是namespace 語言名 路徑,以下示例所示:

namespace java com.test.thrift.demo

相關文章
相關標籤/搜索