Apache Thrift 개요
Apache Thrift 개요
Apache Thrift는 RPC(원격 프로 시저 호출) 프레임워크이다. Facebook에서 개발해서 2007년 4월에 오픈소스가 되었고, 2008년 5월 Apache Incubator에 들어가 2010년 11월 아파치 TLP(Top-Level Project)가 되었다. Thrift는 강력하고 바이너리 전송이 빠르다.
Apache Thrift - Home
Apache Thrift 설치
Thrift 설치는 아래 문서에서 찾아볼 수 있다.
http://wiki.apache.org/thrift/ThriftInstallation
Ubuntu에서 설치
Ubuntu 설치 단계를 요약하면 아래와 같다.
- 필요한 종속성을 설치합니다.
$ sudo apt-get install libboost-dev libboost-test-dev \ libboost-program-options-dev libevent-dev automake libtool flex bison \ pkg-config g++ libssl-dev
- 설치 루트 디렉터리로 이동한다.
$ ./configure
$ make
- 슈퍼 유저를 아래 명령어 실행한다.
$ make install
Mac에서 설치
Mac 환경에서 Homebrew으로 아래 명령어로 설치할 수 있다.
% brew update
% brew install thrift
Apache Thrift IDL
Thrift에서는 IDL(Interface Description Language 또는 Interface Definition Language)로 인터페이스를 정의하여, 각 언어별로 소스 코드를 생성하여 구현한다.
지원되는 언어는 As3, C Glib, C++, CSharp, D, Delphi, Erlang, Go, Graphviz, Haskell, Java, Java Me, Javascript, Node.js, Objective-c, OCaml, Perl, PHP, Python, Ruby, Smalltalk 등 24여개가 있다.
Apache Thrift - Language and Feature Matrix
여기에서는 Thrift의 IDL에 대해 설명한다.
사용 가능한 유형
Thrift에 기본형, 컨테이너형, 구조체, 예외형, 열거형, 공용체의 6종류를 사용할 수 있다.
기본형
Type | 설명 |
---|---|
bool |
Boolean, one byte. 논리 값, true 또는 false. |
byte |
Signed byte. 1byte 정수. |
i16 |
Signed 16-bit integer. 2byte 정수. |
i32 |
Signed 32-bit integer. 4byte 정수. |
i64 |
Signed 64-bit integer. 8byte 정수. |
double |
64-bit floating point value. 8byte 부동 소수점. |
string |
String. UTF8로 인코딩된 문자열. |
binary |
Blob (byte array) 인코딩되지 않은 바이드 데이터. |
컨테이너 타입
Type | 설명 |
---|---|
map<t1,t2> |
Map from one type to another. 고유한 키와 값의 조합. C++ STL map, Java HashMap, PHP 연관 배열, Python/Ruby dictionary와 동의어 |
list<t1> |
Ordered list of one type. 순서가 없는 고유한 요소 목록. C++의 STL 세트, Java의 HashSet, Pytyon의 set과 동의어 |
set<t1> |
Set of unique elements of one type. 순서가 지정된 요소의 목록. C++의 STL vector, Java의 ArrayList 및 스크립팅 언어의 배열과 동의어 |
컨테이너형의 정의는 c++의 사용법과 같다. 이하에 정의 예제이다.
struct ExampleContainerDefinition
{
1:map<i32, string> mapexample,
2:set<i32> setexample,
3:list<i32> listexample
}
구조체
Thrift의 구조체는 C 언어의 구조체와 매우 유사하다. 일반적인 선언은 다음과 같이 수행된다.
struct ExampleStructure
{
1:i32 id,
2:string message
}
앞에 기재된 값(1,2)는 FieldID 라고 한다. 이 FieldID는 구조 내에서 고유한 값이어야 하며 서버 클라이언트 모두에서 구조 정의가 일치하는지 확인하기 위한 것이다. (다른 구조체 내에 동일한 ID가 있을 수 있다.)
그 밖에도 초기값의 설정이나 구조체의 데이터의 정의가 필요할지, 임의인지를 정의하는 것이 가능하다. 초기값은 필드명 이후에 =
정수을 지정하는 할 수 있다.
구조체의 필드의 필수 여부는 required
을 기입할 수 있고, 임의의 경우에는 optional
을 지정한다.
struct ExampleStructure
{
1: required i32 id,
2: optional string message="default"
}
예외형
구조체와 마찬가지로 예외에서 사용되는 유형도 정의 할 수 있다.
exception exampleException
{
1:i32 errorcode,
2:string message
}
열거형
Thrift에서도 열거형을 사용할 수 있다. 열거형은 0부터 순서대로 값이 부여되지만, 임의의 값을 정의하는 것도 가능하다.
enum exampleEnum1 {
EnumA,
EnumB,
EnumC
}
enum exampleEnum2 {
ONE = 1,
TWO,
FIVE = 5
}
고용체
공용체는 구조체와 동일한 정의를 수행하지만 구조체와 다르다.
공용체는 정의된 복수의 필드 중에서 하나의 필드 밖에 사용할 수 없다.
Thrift 공용체는 C++ 공용체와 같다.
또한, 위의 이유로 공용체 필드에 required
를 사용할 수 없다.
Services
Thrift로 정의하는 Service는, interface 클래스와 같은 것이다. Service 중에는 메소드의 집합을 정의한다.
service exampleService
{
void set(1:i32 key,2:string value),
string get(1:i32 key) throws (1:i32 errorcode),
i32 size()
}
Method
Thrift에서는 Service 내에 메소드를 정의할 수 있다.
Method는 Thrift가 정의 할 수 있는 유형과 void를 사용할 수 있다.
그리고, 인수에는 구조체의 선언과 마찬가지로 Method의 인수 내에서 고유한 FieldID의 정의가 필요하다.
Exception
Thrift에서는 예외를 정의할 수도 있다.
예외의 정의 예는 아래와 같다.
exception exampleException1
{
1:i32 errorcode,
2:string message
}
service exampleService
{
void testException1(1:string arg) throws(1:exampleException1 error),
void testException2(1:string arg) throws(1:exampleException1 error, 2:i32 error2)
}
위의 testException2와 같이 여러 예외를 정의하는 것도 가능하다.
oneway method
Service 내에서 정의하는 메소드 중 응답을 기다릴 필요가 없는 메소드도 정의 할 수 있다.
oneway method를 사용하는 경우, 반환값은 반드시 void
이어야 한다.
service exampleService
{
oneway void show()
}
기타 Thrift 규칙
여기서는 Thrift 정의 파일의 기술 규칙에 대해 설명한다.
주석
코멘트는 다음과 같이 작성할 수 있다.
/*
주석
*/
// 주석
헤더
헤더에는 include
, cpp_include
, namespace
이렇게 3가지 종류를 사용할 수 있다.
include
include는 다른 thrift 파일을 사용할 때 사용한다. include “example.thrift"라는 바람으로 정의한다.
cpp_include
C++ 포함하려면, Thrift에 C++ 코드 생성기의 출력에 사용자 지정 C++ 포함을 추가한다.다.
namespace
namespace는 파일내에서 정의한 구조체나 열거형, Service가 속하는 namespace를 결정한다.
namespace는 아래와 같이 정의하고, cpp의 곳에는 php나 java등이 들어간다.
네임스페이스에 특이한 점은 각 언어에 대해 정의되어야 한다는 것이다.
namespace cpp hoge
namespace java hoge
상수
Thrift의 정의 내에서 상수를 정의하는 것이 가능하다.
상수 선언은 유형 이름 앞에 const
를 부여하기만 하면 된다.
const EXAMPLE_VALUE = 1
Typedef
Thrift의 정의 내에서 타입명을 변경하는 것이 가능하다.
타입명의 변경은 타입 앞에 typedef
를 부여하면 된다.
typedef ExampleType i32
필드 이름 명명 규칙
필드명에 사용할 수 있는 것은 영문, 숫자와 _
,.
으로 지정할 수 있다.
필드의 첫 글자는 반드시 영어 또는 _
이 아니면 안된다.