Thrift 샘플 분석

4392 단어 프레임

Thrift 파일

namespace java calculator

//     
enum Operator{
	ADD,SUB,MUL,DIV
}

//     (        )
exception InvalidationOperator{
	1: i32 what,
	2: string why
}

//    
struct Work{
	1: i32 num1,
	2: i32 num2,
	3: Operator op
}

//   
service Calculator{
	
	//     :      (num:        ) throws (num:          )
	i32 calculate(1: Work work) throws (1:InvalidationOperator e)
}

서버 코드


Thrift 파일에 정의된 서비스 인터페이스를 구현합니다.

import calculator.Work;
import calculator.Calculator.Iface;
import calculator.InvalidationOperator;

class CalHandler implements Iface{
	
	@Override
	public int calculate(Work work) throws InvalidationOperator, TException {
		switch(work.op){
		case ADD:
			return work.num1 + work.num2;
		case SUB:
			return work.num1 - work.num2;
		case MUL:
			return work.num1*work.num2;
		case DIV:
			if(work.num2 == 0){
				throw new InvalidationOperator(work.op.getValue(), "0     !");
			}
			return work.num1/work.num2;
		default:
			throw new InvalidationOperator(work.op.getValue(), "     !");
		}
	}
}
Iface의 정의는 다음과 같습니다.
public interface Iface {

    public int calculate(Work work) throws InvalidationOperator, org.apache.thrift.TException;

  }

  public interface AsyncIface {

    public void calculate(Work work, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;

  }
서버 스니퍼 서비스 구현:
public class CalServer {
	public static void main(String[] args) throws TTransportException{
		TServerTransport transport = new TServerSocket(9999);
		CalHandler cal = new CalHandler();
		Processor processor = new Processor(cal);
		TServer server = new TSimpleServer(new Args(transport).processor(processor));
		System.out.println("      ...");
		server.serve();
	}
}
Thrift의
네트워크 스택은 다음과 같습니다.

  +-------------------------------------------+
  | Server                                    |
  | (single-threaded, event-driven etc)       |
  +-------------------------------------------+
  | Processor                                 |
  | (compiler generated)                      |
  +-------------------------------------------+
  | Protocol                                  |
  | (JSON, compact etc)                       |
  +-------------------------------------------+
  | Transport                                 |
  | (raw TCP, HTTP etc)                       |
  +-------------------------------------------+
  • Transport은 베이스 데이터 전송에 대한 추상화(abstraction for reading/writing from/to the network)로 데이터 전송과 데이터(반) 서열화의 결합을 실현했다.전형적인 socket 데이터 전송 방식(Tserver Socket) 외에도 Thrift는 하드디스크 파일 읽기와 쓰기(TFile Transport), 캐시 읽기와 쓰기(TBuffered Transport), 프레임 읽기와 쓰기(TFramed Transport), 메모리 읽기와 쓰기(TMemory Buffer) 등을 지원한다.
  • Protocol은 메모리의 데이터 형식(in-memory data structures)을 전송 데이터 형식(wire-format)으로 변환하는 방식을 정의했다. 다시 말하면 프로토콜은 맨 윗부분의 데이터 형식과 Transport 층 데이터의 변환 방식을 정의한다(how datatypes use the underlying Transport to encode/decode themselves).일반적인 프로토콜은 JSON, XML, plain text, compact binary 등입니다.
  • Processor는 흐름에서 데이터를 읽고 쓰는 것을 책임지고 Processor의 구조 함수는 다음과 같다.
  •   public static class Processor {
        public Processor(I iface) { }
    
        protected Processor(I iface, Map processMap) {  }
    
      }
    
      public static class AsyncProcessor {
        public AsyncProcessor(I iface) {  }
    
        protected AsyncProcessor(I iface, Map processMap) {   }
    	
      }
  • Server 종합 이상 모든 물건에 대한 대외 서비스 제공
  • Transport 생성
  • Transport 기반 데이터 전송 프로토콜 실행
  • 데이터 전송 프로토콜 및 데이터 전송 논리 기반 Processor 생성
  • 서비스 시작, 클라이언트 요청 수신
  • 클라이언트 코드

    public class CalClient {
    	public static void main(String[] args) throws InvalidationOperator, TException{
    		TTransport transport = new TSocket("localhost", 9999);
    		transport.open();
    		TProtocol protocol = new TBinaryProtocol(transport);
    		Client client = new Client(protocol);
    		Work work = new Work(1,2,Operator.ADD);
    		int rst = client.calculate(work);
    		System.out.println("  :"+rst);
    		transport.close();
    	}
    }

    좋은 웹페이지 즐겨찾기