티스토리 뷰
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 하여 코드를 생성합니다.
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>
'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 |
- Total
- Today
- Yesterday
- 스페인 여행
- redis
- 영작
- maven
- 가정법
- 베트남
- 영문법
- 여행
- 조동사
- Python
- it
- hadoop
- hdfs
- 비지니스 영어
- Python Django
- nodejs
- NGINX
- memcached
- Business English
- ubuntu
- 다낭
- 대명사 구문
- 해외여행
- AWS
- mongoDB
- 도덕경
- k8s
- JBOSS
- 비교구문
- PostgreSQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |