apache thrift

Thrift是一种跨语言RPC框架,最初是在Facebook上开发的,现在作为Apache项目开源。 这篇文章将描述如何以不同的模式(例如阻塞,非阻塞和异步)编写Thrift服务和客户端。

(我觉得后两种模式的文档较少,需要一些教程类型的介绍,因此是本文的动机。) 为了轻松地遵循本教程,您对Thrift体系结构(由传输,协议和处理器组成)有基本的了解是有益的。 (可以在[1]上找到好的论文)。 在这里,我将使用Thrift 0.7版和Thrift的Java绑定。

节俭安装
可以在http://wiki.apache.org/thrift/ThriftInstallation中找到安装说明。

总结Ubuntu安装步骤。

1.安装所需的依赖项。
$ sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libevent-dev automake libtool flex bison pkg-config g ++ libssl-dev
2.转到安装根目录。 3. $ ./configure 4. $ make 5.成为超级用户并 $进行安装

现在,让我们继续创建服务并使用它。

服务定义

此处定义了具有简单算术运算的服务。 请注意,使用typedef指令为基本类型i64和i32声明备用名称。 在名为“ 算术.thrift ”的文件中添加以下内容。

namespace java tutorial.arithmetic.gen  // define namespace for java codetypedef i64 long
typedef i32 int
service ArithmeticService {  // defines simple arithmetic service
long add(1:int num1, 2:int num2),
long multiply(1:int num1, 2:int num2),
}

代码将在“ tutorial.arithmetic.gen ”包下生成。

现在,使用以下命令行生成Java代码。

$ thrift –gen java算术.thrift

将生成源tutorial.arithmetic.gen.ArithmeticService.java

封锁模式

让我们创建一个阻塞模式的服务器和一个使用服务的客户端。

首先,我们需要使用生成的服务框架来实现服务。 要实现的接口是ArithmeticService.Iface。

public class ArithmeticServiceImpl implements ArithmeticService.Iface {public long add(int num1, int num2) throws TException {return num1 + num2;}public long multiply(int num1, int num2) throws TException {return num1 * num2;}}

现在,让我们创建Thrift服务器,该服务器将请求此服务。 请记住,这是一台阻塞服务器,因此执行I / O的服务器线程将等待。

public class Server {private void start() {try {TServerSocket serverTransport = new TServerSocket(7911);ArithmeticService.Processor processor = new ArithmeticService.Processor(new ArithmeticServiceImpl());TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));System.out.println("Starting server on port 7911 ...");server.serve();} catch (TTransportException e) {e.printStackTrace();}}public static void main(String[] args) {Server srv = new Server();srv.start();}}

这里使用了TThreadPoolServer实现,该实现将利用线程池来处理传入的请求。

现在让我们编写客户端。

public class ArithmeticClient {private void invoke() {TTransport transport;try {transport = new TSocket("localhost", 7911);TProtocol protocol = new TBinaryProtocol(transport);ArithmeticService.Client client = new ArithmeticService.Client(protocol);transport.open();long addResult = client.add(100, 200);System.out.println("Add result: " + addResult);long multiplyResult = client.multiply(20, 40);System.out.println("Multiply result: " + multiplyResult);transport.close();} catch (TTransportException e) {e.printStackTrace();} catch (TException e) {e.printStackTrace();}}public static void main(String[] args) {ArithmeticClient c = new ArithmeticClient();c.invoke();}
}

TBinaryProtocol用于对服务器和客户端之间传输的数据进行编码。 现在启动服务器,并使用客户端调用服务以生成结果。

非阻塞模式
现在让我们创建一个非阻塞服务器,该服务器在下面使用Java非阻塞I / O。 我们可以使用与以前相同的服务实现(ArithmeticServiceImpl)。

public class NonblockingServer {private void start() {try {TNonblockingServerTransport serverTransport = new TNonblockingServerSocket(7911);ArithmeticService.Processor processor = new ArithmeticService.Processor(new ArithmeticServiceImpl());TServer server = new TNonblockingServer(new TNonblockingServer.Args(serverTransport).processor(processor));System.out.println("Starting server on port 7911 ...");server.serve();} catch (TTransportException e) {e.printStackTrace();}}public static void main(String[] args) {NonblockingServer srv = new NonblockingServer();srv.start();}
}

在这里,使用TNonblockingServerSocket封装了ServerSocketChannel。

非阻塞客户端的代码如下。

public class NonblockingClient {private void invoke() {TTransport transport;try {transport = new TFramedTransport(new TSocket("localhost", 7911));TProtocol protocol = new TBinaryProtocol(transport);ArithmeticService.Client client = new ArithmeticService.Client(protocol);transport.open();long addResult = client.add(100, 200);System.out.println("Add result: " + addResult);long multiplyResult = client.multiply(20, 40);System.out.println("Multiply result: " + multiplyResult);transport.close();} catch (TTransportException e) {e.printStackTrace();} catch (TException e) {e.printStackTrace();}}public static void main(String[] args) {NonblockingClient c = new NonblockingClient();c.invoke();}}

注意使用TFramedTransport包装正常的TSocket传输。 非阻塞服务器要求客户端使用TFramedTransport,它将对通过网络发送的数据进行框架化。 启动服务器并使用客户端发送请求。 您将看到与以前相同的结果,这次使用非阻止模式。

异步模式

我们可以编写异步客户端来调用Thrift服务。 需要注册一个回调,该回调将在请求成功完成时被调用。 阻塞模式服务器在异步客户端上不起作用(方法调用返回的响应为空)(可能是因为我们在客户端使用TNonblockingSocket。请参见ArithmeticService.AsyncClient的构造。因此这可能是正确的行为)。 非阻塞模式服务器似乎可以正常工作。 因此,您可以将早期版本的非阻塞服务器与下面显示的客户端一起使用。

public class AsyncClient {private void invoke() {try {ArithmeticService.AsyncClient client = new ArithmeticService.AsyncClient(new TBinaryProtocol.Factory(), new TAsyncClientManager(),new TNonblockingSocket("localhost", 7911));client.add(200, 400, new AddMethodCallback());client = new ArithmeticService.AsyncClient(new TBinaryProtocol.Factory(), new TAsyncClientManager(),new TNonblockingSocket("localhost", 7911));client.multiply(20, 50, new MultiplyMethodCallback());} catch (TTransportException e) {e.printStackTrace();} catch (TException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {AsyncClient c = new AsyncClient();c.invoke();}class AddMethodCallbackimplements AsyncMethodCallback<ArithmeticService.AsyncClient.add_call> {public void onComplete(ArithmeticService.AsyncClient.add_call add_call) {try {long result = add_call.getResult();System.out.println("Add from server: " + result);} catch (TException e) {e.printStackTrace();}}public void onError(Exception e) {System.out.println("Error : ");e.printStackTrace();}}class MultiplyMethodCallbackimplements AsyncMethodCallback<ArithmeticService.AsyncClient.multiply_call> {public void onComplete(ArithmeticService.AsyncClient.multiply_call multiply_call) {try {long result = multiply_call.getResult();System.out.println("Multiply from server: " + result);} catch (TException e) {e.printStackTrace();}}public void onError(Exception e) {System.out.println("Error : ");e.printStackTrace();}}}

已经定义了两个回调,分别与服务的每个操作相对应。 请注意,这两个调用使用了两个客户端实例。 每个调用都需要一个单独的客户端实例,否则客户端将因以下异常而失败

线程“ main ”中的异常java.lang.IllegalStateException:客户端当前正在执行另一种方法:tutorial.arithmetic.gen.ArithmeticService $ AsyncClient $ add_call

因此,本文以不同的操作模式总结了我在Thrift上的快速入门。 希望有人会觉得有用。 如有任何建议或更正,请随时发表评论。

[1] http://thrift.apache.org/static/thrift-20070401.pdf

参考:来自JCG合作伙伴的 Apache Thrift快速入门教程   Source Open博客中的Buddhika Chamith。

翻译自: https://www.javacodegeeks.com/2012/03/apache-thrift-quickstart-tutorial.html

apache thrift

apache thrift_Apache Thrift快速入门教程相关推荐

  1. Apache Thrift快速入门教程

    Thrift是一种跨语言RPC框架,最初是在Facebook上开发的,现在作为Apache项目开源. 这篇文章将描述如何以不同的模式(例如阻塞,非阻塞和异步)编写Thrift服务和客户端. (我觉得后 ...

  2. solr6 java_Solr6 快速入门教程

    Solr6 快速入门教程 安装 环境要求 JDK1.8 下载Solr,本文试验时,使用的Solr6.6.0 开始安装 解压solr-6.6.0.zip cd solr-6.6.0\ 启动solr,ru ...

  3. php yii2 api框架,Yii2框架制作RESTful风格的API快速入门教程

    先给大家说下什么是REST restful REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Ro ...

  4. Subversion快速入门教程(SVN)

    Subversion快速入门教程(SVN vs CVS) 文中提及的Subversion动画教程并不可用,如有任何Subversion相关问题可以一起探讨. Subversion是新一代的版本控制工具 ...

  5. TurtleBot4快速入门教程-软件综述

     系列文章目录: Turtlebot4快速入门教程-目录 TurtleBot4快速入门教程-硬件介绍 Turtlebot4快速入门教程-软件综述 TurtleBot4快速入门教程-远程PC安装 Tur ...

  6. Activiti 快速入门教程:SpringBoot 集成 Activiti6 + Activiti Modeler 流程配置可视化

    Activiti 快速入门教程:SpringBoot 集成 Activiti6 + Activiti Modeler 流程配置可视化 7大服务与核心表 23张表概览 7大核心服务(重要) 加依赖 内部 ...

  7. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

  8. ​HealthKit开发快速入门教程大学霸内部教程

    ​HealthKit开发快速入门教程大学霸内部教程 ​ ​ 国内第一本HealthKit专向教程.本教程详细讲解iOS中,如何使用HealthKit框架开发健康应用.最后,本教程结合HealthKit ...

  9. Apple Watch开发快速入门教程

     Apple Watch开发快速入门教程  试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...

最新文章

  1. 多个线程为了同个资源打起架来了,该如何让他们安分?
  2. MCMC笔记Metropilis-Hastings算法(MH算法)
  3. SpringBoot—启动报错Exception in thread “main“ java.lang.ClassNotFoundException
  4. git rebase 变基
  5. 重置密码解决MySQL for Linux错误 ERROR 1045 (28000):
  6. 【2】puppet笔记 - package、service、user资源
  7. 【转载】VC遍历文件夹下所有文件和文件夹
  8. ScrewTurn Wiki 初识
  9. spring mvc +@Valid +@RequestBody 来做参数校验返回400,并且不显示具体message 如何解决...
  10. ubuntu安装dockers和images:dvwa
  11. autoCAD 使用图层、颜色和线型
  12. php微商城微信支付教程,微信支付接口配置教程(微商城版)
  13. UE4 更改工程文件名字的方法
  14. 什么是App推广技术?
  15. python生成10个随机密码_python题:随机密码生成。编写程序,在26个字母大小写和9个数字组成的列表中随机生成10个8位密码...
  16. 【PostgreSQL实战】之还原备份文件
  17. 华为鸿蒙P10plus,华为P10 Plus全面评测 华为P10 Plus值不值得买
  18. php运算符综合实例,php中三元运算符的嵌套实例
  19. [Win32] 获取进程完整路径
  20. 【USB接口】USB-Type-A B C 、Micro-USB、Mini-USB接口描述

热门文章

  1. vue cli 4.x打包后如何部署到tomcat服务器上
  2. java中随机生成26个字母组合的随机验证码
  3. 利用命令来打开所有程序,这个装逼给满分!
  4. ubuntu 16.4 安装postgreSQL,使C++链接到数据库
  5. java oschina_简单说说 OSChina 的技术架构
  6. 计算机在轻化工程中的应用,计算机在轻化工程专业中的应用-中国大学mooc-题库零氪...
  7. URLConnection-URL连接
  8. ReviewForJob——二叉堆优先队列的实现(三种堆节点类型——int + struct HeapNode + struct HeapNode*)
  9. kafka netty_惠而浦:使用Netty和Kafka的微服务
  10. 策略模式示例代码_策略设计模式示例