티스토리 뷰

Thrift란 이기종간에 RPC 통신할 수 있는 Server & Client를 생성해주는 소프트웨어 프레임웍으로 현재 페이스북의

어플리케이션 서버에서도 사용하고 있습니다.

그럼 thrift에 대해 알아보도록 하겠습니다.


설치 환경

OS : Ubuntu 12.04

Thrift :Thrift version 0.8.0


thrift download url : http://incubator.apache.org/thrift


step1. thrift설치

ubuntu

sudo apt-get install libboost-dev automake libtool flex bison pkg-config g++


redhat

yum install boost-devel automake libtool flex bison pkgconfig gcc-c++ python-devel


source compile

tar xvzf thrift-0.8.0.tar.gz

cd thrift-0.8.0

./configure JAVAC=/usr/java/jdk1.6.0_16 --prefix=/usr/local/thrift

make

make install


step2. PATH 추가

bashrc 파일에 PATH 추가

vi ~/.bashrc

export PATH=/usr/local/thrift/bin:$PATH

파일 적용 후 실행

$ source ~/.bashrc

$ thrift



Thrift  Based Data Type

 *  bool        논리형. 1 바이트.
 *  byte        부호 있는 바이트.
 *  i16         부호 있는 16비트 정수형.
 *  i32         부호 있는 32비트 정수형.
 *  i64         부호 있는 64비트 정수형.
 *  double      64비트 부동 소수점형.
 *  string      문자열.
 *  map<t1,t2>  서로 같거나 다른 두 타입의 맵.
 *  list<t1>    한가지 자료형의 리스트.
 *  set<t1>     유일한 엘리먼트들의 세트.
 *


user data type

struct Rocksea{

1:i32 number=10,

2:i64 bigNumber,

3:double decimals,

4:string name="thrift",

5:optional string optionVal;

}


struct RockseaComplex{

1: Rocksea myRocksea,

2: list<string> containers;

}


container

List, Map, Set등과 같은 다양한 컨테이너를 지원하고 자바의 generic 형태를 제공함.

struct Student {

1: string name,

2: string gender

}

struct Container{

1: list<string> names,

2: set<Student> students,

3: map<string, Student> studentMaps,

4: map<string, set<Student>> classes

}


exception

예외는 struct와 동일하지만 struct 대신 exception을 사용한다.

exception RockseaException {

1: i32 exceptionNo,

2: string message

}

#자바코드로 다음과 같이 변환됨

public class RockseaException extends Exception{

private int exceptionNo;

private String message;

}


step1. IDL 파일 작성

Thrift는 IDL파일을 만들어서 각각의 언어에 맞게 Generate 하여 코드를 생성합니다.

namespace cpp hello
namespace java co.kr.mycompany.hello.thrift
namespace php hello
namespace perl hello
namespace py hello

service HelloService {
        string greeting(1:string name, 2:i32 age)
}


step2. generate code

각 언어별로 code를 생성합니다.

$ thrift --gen java --gen cpp --gen py --gen perl --gen php hello.thrift


step3. thrift server code 작성

package co.kr.mycompany.hello.thrift;

import org.apache.thrift.server.TThreadPoolServer;

import org.apache.thrift.server.TServer;

import org.apache.thrift.transport.TServerSocket;


public class HelloServer{

        public static void main(String[] args) throws Exception{

                if(args.length < 1){

                        System.out.println("Usage java HelloServer <port>");

                        System.exit(0);

                }

                int port = Integer.parseInt(args[0]);

                final TServerSocket socket = new TServerSocket(port);

                final HelloService.Processor processor = new HelloService.Processor(new HelloHandler());

                final TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(socket).processor(processor));

                System.out.println("started port:"+port);

                server.serve();

        }

}


step4. thrift client code 작성

package co.kr.mycompany.hello.thrift;

import org.apache.thrift.protocol.TBinaryProtocol;

import org.apache.thrift.protocol.TProtocol;

import org.apache.thrift.transport.TSocket;

import org.apache.thrift.transport.TTransport;


public class HelloClient {

        public static void main(String[] args) throws Exception {

                if(args.length < 1){

                        System.out.println("Usage java HelloServer <port>");

                        System.exit(0);

                }

                String host ="localhost";

                int port = Integer.parseInt(args[0]);

                int timeout = 10 * 1000;


                final TTransport transport = new TSocket(host, port);

                final TProtocol protocol = new TBinaryProtocol(transport);


                final HelloService.Client client = new HelloService.Client(protocol);


                transport.open();


                String result = client.greeting("rocksea", 29);

                System.out.println("Received [" + result + "]");


                transport.close();

        }

}




step 5. thrift client / server Test

$ java -cp .:./build/libthrift-0.9.0.jar:build/lib/slf4j-api-1.5.8.jar:build/lib/slf4j-log4j12-1.5.8.jar:build/lib/log4j-1.2.14.jar co/kr/mycompany/hello/thrift/HelloServer 9090

started port:9090


$ java -cp .:./build/libthrift-0.9.0.jar:build/lib/slf4j-api-1.5.8.jar:build/lib/slf4j-log4j12-1.5.8.jar:build/lib/log4j-1.2.14.jar co/kr/softcast/hello/thrift/HelloClient 9090

Received [Hello rocksea, You are 29 years old!!]


Maven artifact ( maven 추가시 )

<dependency>
  <groupId>org.apache.thrift</groupId>
  <artifactId>libthrift</artifactId>
  <version>0.9.0</version>
</dependency>

이상 thrift설치에 대해 알아보았습니다.
.by rocksea



'Developer' 카테고리의 다른 글

[ glusterFS ] installation guide  (2) 2012.10.12
apt-get package 설치에러  (0) 2012.10.12
like문 작성법  (0) 2012.10.10
[ expect ] telnet, ssh 자동화 script  (0) 2012.10.09
[ console ] commands  (0) 2012.10.08
댓글