12.22 学习笔记-Thrift简单实例

Thrift介绍

在上一章节中我已经向大家详细的介绍了Thrift,详见

学习笔记-Thrift简单实例

Thrift安装

到官网下载最新版本

1. 如果是Maven构建项目的,直接在pom.xml 中添加如下内容:

<code><dependency>  
<groupid>org.apache.thrift/<groupid>
<artifactid>libthrift/<artifactid>
<version>0.8.0/<version>
/<dependency>/<code>

2.如果自己编译lib包,把下载的压缩包解压到X:盘,然后在X:\\thrift-0.8.0\\lib\\java 目录下运行ant进行自动编译,会在X:\\thrift-0.8.0\\lib\\java\\build\\ 目录下看到编译好的lib包:libthrift-0.8.0.jar 利用Thrift部署服务的主要流程:编写服务说明保存到.thrift文件,根据需要 编译.thrift文件,生成相应的语言源代码,根据实际需要编写client端和server端代码。

Thrift部署

thrift 是官网提供的windows下编译工具,运用这个工具生成相关代码:

生成源代码的命令:

<code>thrift -r -gen java ./demo.thrift   //生成java代码/<code>

结果代码存放在gen-java目录下 client端和sever端代码要调用编译.thrift生成的中间文件。在client端,用户自定义CalculatorClient类型的对象(用户在.thrift文件中声明的服务名称是Calculator, 则生成的中间代码中的主类为CalculatorClient), 该对象中封装了各种服务,可以直接调用(如client.ping()), 然后thrift会通过封装的rpc调用server端同名的函数。在server端,需要实现在.thrift文件中声明的服务中的所有功能,以便处理client发过来的请求。

数据类型

基本类型:

bool:布尔值,true 或 false,对应 Java 的 boolean

byte:8 位有符号整数,对应 Java 的 byte

i16:16 位有符号整数,对应 Java 的 short

i32:32 位有符号整数,对应 Java 的 int

i64:64 位有符号整数,对应 Java 的 long

double:64 位浮点数,对应 Java 的 double

string:utf-8编码的字符串,对应 Java 的 String

结构体类型:

struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean

容器类型:

list:对应 Java 的 ArrayList

set:对应 Java 的 HashSet

map:对应 Java 的 HashMap

异常类型:

exception:对应 Java 的 Exception

服务类型:

service:对应服务的类

编写步骤

服务端:

实现服务处理接口impl

创建TProcessor

创建TServerTransport

创建TProtocol

创建TServer

启动Server

客户端

创建Transport

创建TProtocol

基于TTransport和TProtocol创建 Client

调用Client的相应方法

Thrift实例

hrift脚本

首先编写脚本HelloWorldIDL.thrift

<code>namespace java thrift.demo
service HelloWorldIDL {
string sayHello(1:stringusername)

}
/<code>

生成通用服务接口类

生成对应的java代码,并引入到Java工程当中,生成的HelloWorldIDL.java,请勿手工修改。

<code>thrift --gen java HelloWorldIDL.thrift/<code>

Server端编写服务实现类

<code>package thrift.demo;
import org.apache.thrift.TException;
public class HelloWorldHandler implements HelloWorldIDL.Iface {
\t@Override
\tpublic String sayHello(String username) throws TException {
\t\treturn "Hello Thrift! [" + username + "]";
\t}
}/<code>

Server端注册服务并监听请求

<code>package thrift.demo;

import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.transport.TTransportException;

import thrift.demo.HelloWorldIDL.Iface;

public class HelloWorldServer {

\tpublic static void main(String[] args) throws TTransportException {
\t\tHelloWorldIDL.Iface helloWorldHandler = new HelloWorldHandler();
\t\tHelloWorldIDL.Processor<iface> processor =
new HelloWorldIDL.Processor<iface>(helloWorldHandler);

\t\t
\t\tTServerTransport serverTransport = new TServerSocket(7890);
\t\t
\t\tTThreadPoolServer.Args tArgs = new TThreadPoolServer.Args(serverTransport);
\t\ttArgs.processor(processor);
\t\ttArgs.protocolFactory(new TBinaryProtocol.Factory());
\t\t
\t\tTServer server = new TThreadPoolServer(tArgs);
\t\tserver.serve();
\t}

}/<iface>/<iface>/<code>

Client发送请求并得到响应

<code>package thrift.demo;

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 HelloWorldClient {

\tpublic static void main(String[] args) {
\t\ttry {
\t\t\tTTransport transport = new TSocket("127.0.0.1", 7890);
\t\t\ttransport.open();
\t\t\t
\t\t\tTProtocol protocol = new TBinaryProtocol(transport);
\t\t\tHelloWorldIDL.Client client = new HelloWorldIDL.Client(protocol);
\t\t\t
\t\t\tString result = client.sayHello("TTHHRRIIFFTT");
\t\t\tSystem.out.println(result);
\t\t\t
\t\t\ttransport.close();
\t\t} catch (Exception e) {
\t\t\te.printStackTrace();
\t\t}
\t}

}/<code>

运行

运行HelloWorldServer,启动服务。

运行HelloWorldClient,调用远程服务接口,控制台打印如下:

<code>HelloThrift! [TTHHRRIIFFTT]/<code>

成功调用远程服务。


本文的初衷为学习笔记的分享,部分图文来源于网络,如侵,联删。


分享到:


相關文章: