文档章节

Apahce Thrift 学习笔记

G
 Galanodel
发布于 2017/05/09 10:34
字数 1145
阅读 28
收藏 0

一、什么是 Thrift
    Thrift :读音是[θrɪft] ,其英文含义是节俭,节约;茁壮成长。
    Thrift 是一种高效的、支持多种语言的远程服务调用(RPC)的框架。
Thrift最初由facebook公司开发的,在2007年FaceBook将其提交Apache基金会开源。
对于当时的facebook来说创造 Thrift 是为了解决 FaceBook 系统中各系统间大数据量的传输通信以及系统之间语言环境不同需要跨平台的特性。
    Thrift主要功能是:通过自定义的Interface Definition Language(IDL),可以创建基于RPC的客户端和服务端的服务代码。数据和服务代码的生成是通过Thrift内置的代码生成器来实现的。Thrift 的跨语言性体现在,它可以生成 C++, Java, Go,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml 等语言的代码,且它们之间可以进行透明的通信。
    Thrift 的官方网址是 http://thrift.apache.org/

二、下载Thrift
    使用Thrift前,需要从官方网站(http://thrift.apache.org/download)下载Thrift ,下载地址:

Liunx 版本:  http://www.apache.org/dyn/closer.cgi?path=/thrift/0.10.0/thrift-0.10.0.tar.gz
Window版本: http://www.apache.org/dyn/closer.cgi?path=/thrift/0.10.0/thrift-0.10.0.exe

    Liunx 版本需要解压tar.gz包

tar -xzvf -C /usr/thrift -f thrift-0.10.0.tar.gz

    Window 版本将 thrift-0.10.0.exe 放到目录既可。

三、使用Thrift

    下载Thrift 之后完这里开始正式开始编写一个小程序。

    1. 定义 thrift 文件

    首先需要根据 thrift 的语法规范编写脚本文件,例如 hello.thrift,代码如下:

namespace java yyl.example.demo.thrift

service HelloService {
  string hello(1:string text)
}

    2. 使用命令编译 thrift  

    定义完 thrift脚本 之后,我们需要对 thrift 脚本进行编译,编译的命令格式为:

thrift --gen <language> <Thrift filename>

    例如,需要编译成编译成java代码,则输入以下命令:

thrift-0.10.0.exe -r -gen java ./hello.thrift 

    命令执行成功之后,会自动生成一个gen-java的目录,其中有构建的客户端有用的源代码 (HelloService.java)

    如果找不到thrift-0.10.0.exe,可能是需要配置一下 thrift-0.10.0.exe 目录的环境变量,也可以将脚本拷贝到 thrift 所在目录,再执行一下。

    3. 创建 service handler

package yyl.example.demo.thrift;

import org.apache.thrift.TException;

public class HelloServiceHandler implements HelloService.Iface {
	@Override
	public String hello(String text) throws TException {
		return "hello " + text;
	}
}

    4. 创建服务器代码

package yyl.example.demo.thrift;

import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TNonblockingServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.transport.TTransportException;

/**
 * 简单的Thrift服务器<br>
 */
public class HelloServer {

	private static final int SERVER_PORT = 8090;

	public static void main(String[] args) {

		try {

			HelloService.Processor<HelloServiceHandler> processor = new HelloService.Processor<>(new HelloServiceHandler());

			TServer server = getSimpleServer(SERVER_PORT, processor);

			System.out.println("Starting the simple server...");
			server.serve();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/** 简单的单线程服务模型,一般用于测试 */
	public static TServer getSimpleServer(int port, HelloService.Processor<HelloServiceHandler> processor) throws TTransportException {
		TServerTransport transport = new TServerSocket(port);
		TServer server = new TSimpleServer(new TServer.Args(transport).processor(processor));
		return server;
	}

	/** 线程池服务模型,使用标准的阻塞式IO,预先创建一组线程处理请求 */
	public static TServer getPoolServer(int port, HelloService.Processor<HelloServiceHandler> processor) throws TTransportException {
		TServerTransport transport = new TServerSocket(port);
		TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(transport).processor(processor));
		return server;
	}

	/** 使用非阻塞式IO,服务端和客户端需要指定 TFramedTransport 数据传输的方式 。 */
	public static TServer getNonblockingServer(int port, HelloService.Processor<HelloServiceHandler> processor) throws TTransportException {
		TNonblockingServerSocket transport = new TNonblockingServerSocket(port);
		TNonblockingServer.Args args = new TNonblockingServer.Args(transport).processor(processor);
		//服务端和客户端需要指定TFramedTransport数据传输的方式
		TServer server = new TNonblockingServer(args);
		return server;
	}

	/** 半同步半异步的服务端模型,需要指定为: TFramedTransport 数据传输的方式 */
	public static TServer getHsHaServer(int port, HelloService.Processor<HelloServiceHandler> processor) throws TTransportException {
		TNonblockingServerSocket transport = new TNonblockingServerSocket(port);
		THsHaServer.Args args = new THsHaServer.Args(transport).processor(processor);
		TServer server = new THsHaServer(args);
		return server;
	}
}

    5.创建客户端代码

package yyl.example.demo.thrift;

import org.apache.thrift.TException;
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) {

		TTransport transport = null;

		try {

			transport = new TSocket("localhost", 8090);
			transport.open();

			TProtocol protocol = new TBinaryProtocol(transport);
			HelloService.Client client = new HelloService.Client(protocol);

			System.out.println(client.hello("thrift world"));

		} catch (TException e) {
			e.printStackTrace();
		} finally {
			transport.close();
		}
	}
}

 6. 测试代码
按顺序启动 HelloServer 和 HelloClient ,查看输出。

四、Thrift 架构图

五、Thrift 支持的数据类型

    Thrift 脚本可定义的数据类型包括以下几种类型:

基本类型  
bool 布尔值,true 或 false,对应 Java 的 boolean
byte 8 位有符号整数,对应 Java 的 byte
i16 16 位有符号整数,对应 Java 的 short
i32 32 位有符号整数,对应 Java 的 int
double 64 位浮点数,对应 Java 的 double
string 未知编码文本或二进制字符串,对应 Java 的 String
结构体类型  
struct 定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
容器类型  
list 对应 Java 的 ArrayList
set 对应 Java 的 HashSet
map 对应 Java 的 HashMap
异常类型  
exception 对应 Java 的 Exception
服务类型  
service 对应服务的类

© 著作权归作者所有

共有 人打赏支持
G
粉丝 2
博文 72
码字总数 49356
作品 0
海淀
高级程序员
私信 提问
apache学习笔记一(安装apache2+php+resin)

工作原因,今后要配置、管理公司web服务了。 跟着公司老大学了有一段时间,看了不少资料。也作了不少东西。 但还是老是忘记,要不挺的问。 :( 在老大的提议下,我把我的每天工作学习写下来,...

JavaGG
2009/05/06
273
0
大叔推荐博客索引

以下是我的所有推荐文章,其中多半是文章系列,并且这个索引会在以后过程中进行追加,所以,各位看到的,永远都不是最新的,呵呵! 大叔推荐文章系列 DotNetCore跨平台~文章索引~永久更新(...

mcy247
2017/12/05
0
0
Thrift学习笔记—IDL基本类型

原文地址:http://zhwen.org/xlog/?p=658 thrift 采用IDL(Interface Definition Language)来定义通用的服务接口,并通过生成不同的语言代理实现来达到跨语言、平台的功能。在thrift的IDL中...

helight
2014/01/22
0
0
分布式服务框架学习笔记7 Thrift入门试用

Thrift是facebook开发,08年进入apache孵化器 官网地址 : https://thrift.apache.org 使用过程 下载配置 新建Maven项目 pom.xml 如果自己编译lib包 把下载的压缩包解压到X:盘,然后在X:thrif...

xundh
2017/03/09
0
0
Thrift 学习笔记1——Ubuntu环境下Thrift的安装、编译以及测试

1、Thrift 概念 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell,...

天外飞鱼
2013/06/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
今天
3
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
4
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
3
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部