Thrift 소개
1. Thrift는 무엇인가요?
Thrift는 초기에 Facebook 내부 팀에서 개발한 것으로, 주로 언어 간 메서드 호출을 구현하는 데 사용되었습니다. 오픈 소스로 아파치에 통합되어 아파치 절약 프로젝트가 되었습니다.
thrift를 사용하면 간단한 정의 파일에서 데이터 유형과 서비스 인터페이스를 입력 파일로 정의할 수 있으며, 컴파일러는 원활한 교차 프로그래밍 언어를 위해 RPC 클라이언트 및 서버 통신을 쉽게 생성하는 코드를 생성합니다.
2. RPC란?
RPC(Remote Procedure Call Protocol), 원격 프로시저 호출 프로토콜입니다.
간단히 말하면, RPC는 매개변수를 전달하여 한 머신(클라이언트)에서 다른 머신(서버)의 함수나 메소드를 호출하고 반환된 결과를 얻는 것입니다.
RPC는 기본 통신 세부 정보를 숨깁니다(소켓 통신이나 HTTP 통신을 직접 처리할 필요 없음). RPC는 요청 응답 모델입니다.
클라이언트는 요청을 시작하고 서버는 응답을 반환합니다(Http 작동 방식과 유사). RPC는 로컬 함수(또는 메서드)를 호출하는 것처럼 원격 함수(또는 메서드)를 호출하는 데 사용됩니다.
Thrift 스택 구조
Thrift 데이터 유형
기본 유형:
bool: Java의 부울에 해당하는 부울 값, true 또는 false
byte: Java의 바이트에 해당하는 8비트 부호 있는 정수
i16: Java의 short에 해당하는 16비트 부호 있는 정수
i32: Java의 int에 해당하는 32비트 부호 있는 정수
i64: Java의 long에 해당하는 64비트 부호 있는 정수
double: 다음에 해당하는 64비트 부동 소수점 수 Java의 이중
string: Java의 String
구조 유형에 해당하는 알 수 없는 인코딩된 텍스트 또는 이진 문자열:
struct: C 언어의 구조 정의와 유사한 공용 객체를 정의합니다. Java에서는 JavaBean
컨테이너 유형입니다. :
list: Java의 ArrayList에 해당
set: Java의 HashSet에 해당
map: Java의 HashMap에 해당
Exception 유형 :
Exception: Java의 Exception에 해당
Service 유형 :
service: 서비스 수업에
http : //thrift.apache.org/download
namespace java service.demo service Hello{ string helloString(1:string para) i32 helloInt(1:i32 para) bool helloBoolean(1:bool para) void helloVoid() string helloNull() }
hello.java content
(1) 비동기 클라이언트 클래스 비동기 클라이언트 및 비동기 인터페이스 Asynciface (2) 동기식 클라이언트 클래스 Client 및 동기화 인터페이스 Ife. Client 클래스는 TServiceClient를 상속하고 Thrift 파일에 정의된 인터페이스 기능을 기반으로 Iface를 생성하여 Thrift에서 사용합니다. 클라이언트 프로그램에서 클라이언트 클래스는 Iface의 클라이언트 스텁 구현입니다. Thrift 서버 프로그램은 Iface 인터페이스를 구현해야 합니다.
(3) 프로세서 클래스, 이 클래스는 Thrift 서버 프로그램을 개발할 때 주로 사용됩니다. 이 클래스는 내부적으로 모든 함수 이름과 함수 개체의 매핑을 저장하는 맵을 정의합니다. Thrift는 함수 호출 요청을 받으면 해당 함수를 찾습니다. 맵의 함수 이름에 따라 함수 객체를 실행한 다음 이를 실행합니다.
(4) 매개변수 클래스, 각 인터페이스 함수에 대한 매개변수 클래스를 정의합니다. 예: 인터페이스 helloInt에 대한 매개변수 클래스 생성: helloInt_args, 일반적으로 인터페이스 함수 매개변수 클래스의 이름 지정 방법은 다음과 같습니다. 상황에 따라 인터페이스 함수 반환 값 클래스의 명명 방법은 다음과 같습니다. 인터페이스 함수 name_result;
매개 변수 클래스와 반환 값 클래스에는 데이터 읽기 및 쓰기 작업이 있습니다. 매개 변수 클래스에서는 호출할 함수 이름과 매개 변수를 수행합니다. 캡슐화는 프로토콜 클래스에 따라 반환 값 클래스에서 프로토콜에 따라 데이터를 읽습니다.
Client
Iface
HelloServiceImpl
Calling process
Thrift 호출 프로세스에서는 전송 계층 클래스, 프로토콜 계층 클래스 및 처리 클래스의 세 가지 주요 핵심 클래스가 주로 Thrift 클라이언트와 서버 간에 사용됩니다. 이 세 클래스의 협력이 rpc 전체를 공동으로 완성합니다. 호출 프로세스
(1) 클라이언트 프로그램이 호출한 함수 이름과 매개변수를 프로토콜 계층(TProtocol)에 전달합니다. 프로토콜 계층은 함수 이름과 매개변수를 프로토콜 형식에 따라 캡슐화한 후 캡슐화된 결과를 하위 계층에 전달합니다. 전송 계층. 참고: Thrift 서버 프로그램에서 사용하는 프로토콜 유형은 동일해야 합니다. 그렇지 않으면 Thrift 서버 프로그램은 프로토콜 계층에서 데이터를 구문 분석할 수 없습니다.
(2) 전송 계층(TTransport)은 전달된 데이터를 처리합니다. 예를 들어, 전송 계층의 구현 클래스 TFramedTransport는 데이터를 프레임, 즉 "데이터 길이 + 데이터 내용"으로 캡슐화한 다음 처리된 데이터를 네트워크를 통해 Thrift 서버로 보내는 것도 중요합니다. 참고 사항: Thrift 서버 프로그램과 일치해야 합니다. 사용된 전송 계층의 구현 클래스는 일관적입니다. 그렇지 않으면 Thrift의 전송 계층이 데이터를 역방향으로 처리할 수 없습니다.
(3) Thrift 서버는 전송된 호출 요청 데이터를 받습니다. 예를 들어, 전송 계층의 구현 클래스 TFramedTransport는 "데이터 길이 + 데이터 내용" 형식의 네트워크 데이터를 형식으로 변환합니다.
( 4) Thrift 서버의 프로토콜 클래스(TProtocol)는 전송 계층에서 처리한 데이터를 프로토콜에 따라 디캡슐화하여 전달합니다. 캡슐화 해제된 데이터를 Processor 클래스로 처리
(5) Thrift 서버의 Processor 클래스는 프로토콜 계층(TProtocol) 구문 분석 결과에 따라 데이터를 디코딩하고, 함수 이름에 따라 함수 이름에 해당하는 함수 개체를 찾습니다.
(6) Thrift 서버는 전달된 매개변수를 사용하여 발견된 함수 객체를 호출합니다.
(7) Thrift 서버가 함수 객체를 실행한 결과를 프로토콜 계층에 전달합니다. Thrift 서버 측은 함수의 실행 결과를 프로토콜에 캡슐화합니다.
(9) Thrift 서버 측의 전송 계층은 프로토콜 계층 캡슐화의 결과를 프레임으로 캡슐화하는 등 처리한 후 Thrift 클라이언트로 보냅니다.
(10) Thrift 클라이언트 프로그램의 전송 계층은 수신된 네트워크 결과를 역으로 처리하여 실제 프로토콜 데이터를 얻습니다.
(11) Thrift 클라이언트의 프로토콜 계층은 프로토콜 형식에 따라 데이터를 디캡슐화합니다. 특정 함수 실행 결과를 호출하는 함수에 전달합니다.
프로토콜 및 전송 방법
Thrift를 사용하면 클라이언트와 서버 간의 전송 통신 프로토콜 유형을 선택할 수 있습니다. 전송 프로토콜은 일반적으로 비용을 절약하고 향상시키기 위해 텍스트(텍스트) 전송 프로토콜과 바이너리(바이너리) 전송 프로토콜로 구분됩니다. 전송 효율성을 위해 일반적으로 바이너리 유형 전송 프로토콜을 사용하고 때로는 텍스트 기반 프로토콜도 사용됩니다. 이는 프로젝트/제품의 실제 요구 사항을 기반으로 해야 합니다. 일반적으로 사용되는 프로토콜은 다음과 같습니다.TBinaryProtocol: Thrift의 기본 프로토콜로 데이터 전송에 바이너리 인코딩 형식을 사용하며 기본적으로 원시 데이터를 직접 전송합니다. TCompactProtocol: 압축되고 조밀한 데이터 전송 프로토콜, 가변 길이 수량 형식을 기반으로 한 지그재그 인코딩 TJSONProtocol : JSON(JavaScript Object Notation) 데이터 인코딩 프로토콜을 사용한 데이터 전송
TDebugProtocol: 코더가 테스트하는 데 자주 사용되며 쉽게 읽을 수 있도록 텍스트 형식으로 표시됨 일반적으로 사용되는 전송 계층은 다음과 같습니다.TSocket — — 차단 I/ O는 전송을 위한 가장 일반적인 모드입니다. TFramedTransport — Java의 NIO와 유사하게 블록 크기별로 전송하는 비차단 모드를 사용합니다.
TNonblockingTransport — 비동기 클라이언트를 구축하는 데 사용됩니다.TServerSocket: 비차단 소켓 , 서버 측에서 사용되는 소켓 유형은 모두 TSocket입니다(즉, 차단 소켓)
위 내용은 Thrift 프레임워크 빠른 시작 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!