apache thrift_Apache Thrift快速入门教程

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何恢复被删短信_手机便签记事本的内容如何恢复?快试试这款好用的便签

手机便签记事本是很多人日常工作和生活中都会用到的一种辅助工具&#xff0c;它不但可以记录我们的待办事项&#xff0c;经常坚持使用的话&#xff0c;还能养成良好的生活节奏。常在河边走哪有不湿鞋&#xff0c;很多人都发生过误删的情况&#xff0c;手机便签记事本的内容如何…

分享一些在内网操作的远程办公经验

前言大家好&#xff0c;我叫孙叫兽&#xff0c;本期内容给大家分享一群在内网操作的程序员远程办公经验。为啥说是内网呢&#xff0c;因为从事的开发项目比较保密&#xff0c;比如某银行总行的新一代智能柜台项目。这些平时开发的内容不能直接和互联网进行连接。只能通过行方的…

[刷题]算法竞赛入门经典(第2版) 4-1/UVa1589 - Xiangqi

书上具体所有题目&#xff1a;http://pan.baidu.com/s/1hssH0KO 代码&#xff1a;&#xff08;Accepted&#xff0c;0 ms&#xff09; //UVa1589 #include<iostream> #include<cmath> #define P(x,y) Pi[x].position[y] using namespace std; int N;//2<N<7…

OpenMap教程–第1部分

介绍 本系列教程将向您展示如何使用OpenMap GIS Java Swing库构建Java应用程序。 OpenMap的开发人员指南是非常有用的文档&#xff0c;描述了OpenMap的体系结构&#xff0c;但没有说明如何逐步启动和构建应用程序。 源代码附带的示例很有用&#xff0c;但还不够。 OpenMap是用…

killall 后面信号_Linux 下使用 killall 命令终止进程的 8 大用法

Linux 的命令行提供很多命令来杀死进程。比如&#xff0c;你可以向 kill 命传递一个PID来杀死进程&#xff1b;pkill 命令使用一个正则表达式作为输入&#xff0c;所以和该模式匹配的进程都被杀死。但是还有一个命令叫 killall &#xff0c;默认情况下&#xff0c;它精确地匹配…

分享一些我的远程办公经验

前言 大家好&#xff0c;我叫孙叫兽&#xff0c;本期内容给大家分享一群在内网操作的程序员远程办公经验。为啥说是内网呢&#xff0c;因为从事的开发项目比较保密&#xff0c;比如某银行总行的新一代智能柜台项目。这些平时开发的内容不能直接和互联网进行连接。只能通过行方的…

SqlServer按中文数字排序

表数据: 按名称排序 并不能得到一二三四五六的顺序 select * from LiWei order by name 找到中文数字在一二三四五六七八九十的位置 select id,name,SUBSTRING(name,2,1) as 中文数字,charindex(SUBSTRING(name,2,1),一二三四五六七八九十) as 中文数字所在位置 from LiWei 按中…

C语言--直接插入排序【排序算法|图文详解】

一.直接插入排序介绍&#x1f357; 直接插入排序又叫简单插入排序&#xff0c;是一种简单直观的排序算法&#xff0c;它通过构建有序序列&#xff0c;对于未排序的数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。 算法描述&#xff1a; 假设要排序…

python 读取sqlite存入文件_如何通过python读取sqlite数据文件

sqlite简介&#xff1a;sqlite是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它的设计目标是嵌入式的&#xff0c;而且目前已经在很多嵌入式产品中使用了它(如安卓系统)&#xff0c;它占用资源非常的低&#xff0c;在嵌入式设…

分享一些前端优质的掘金小册,学完技术感觉已经超神了

大家好&#xff0c;本期内容给大家推荐一些优质的前端掘金小册&#xff0c;基本每个都是专栏小册的形式&#xff0c;比较适合初学者及工作几年的前端小伙伴&#xff0c;里面的内容讲解的比较详细&#xff0c;作者也是一线的大厂工作者。有兴趣的小伙伴快来打卡看一下吧&#xf…

sp烘焙流程_次世代86机甲战神制作全流程

1介绍Hello&#xff0c;大家好&#xff01;我叫周玉亮。首先感谢一下小左老师对我的作品的认可&#xff0c;以及给予我这次宝贵的分享机会。本次分享的是我的第一个次世代硬表面作品&#xff0c;名为《86机甲战神》&#xff0c;制作时间3周。时间还是相当紧的&#xff0c;要在3…

esper_Twitter4j和Esper:在Twitter上跟踪用户情绪

esper对于复杂事件处理和Twitter API的新手&#xff0c;我希望这是一个简短的教程&#xff0c;可以帮助他们Swift起步。 管理大数据并从中挖掘有用的信息是当前技术中最热门的讨论主题。 来自Twitter&#xff0c;Facebook和Linkedin等社交网络的半结构化数据的爆炸式增长使Hado…

前端实现流星雨特效

目录 前言 效果图&#xff1a; HTML CSS 完整代码 前言 使用htmlcss实现简单得浏览器特效&#xff0c;在编译器用导入项目&#xff0c;直接在浏览器打开即可&#xff0c;效果十分得炫酷&#xff0c;十分得哇塞&#xff0c;女朋友直呼NB! 效果图&#xff1a; HTML <!DO…

RxJava线程控制

RxJava中的线程转换主要通过下面两个方法&#xff1a; 1.subscribeOn 2.observeOn 一、subscribeOn 1.调用一次subscribeOn时&#xff1a; Observable observable; Schedulers schedulers; Observer observer; observable.subscribeOn(schedulers).subscribe(observer) 通过解析…

elementui中tabs切换item中的内容会变_中后台UX优化之道

前言“前台重体验&#xff0c;后台重逻辑”&#xff0c;B端谈 UX 有没有价值&#xff1f;一切电子化的今天&#xff0c;运营、审核、电销、账务……无数岗位依赖中后台系统来完成他们的日常工作&#xff0c;好的 UX 确实可以直接为这些产能提效当中后台的工程师们花费了巨大精力…

介体设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

判断一个对象是否是空对象的处理办法

目录 前言 方法一&#xff0c;Object.keys()方法&#xff0c;返回对象的属性名组成的一个数组&#xff0c;若长度为0&#xff0c;则为空对象 方法二、for in循环 方法三&#xff1a;将对象转换成字符串&#xff0c;再判断是否等于“{}” 前言 在维护客户基本信息的时候包含…

Oracle 11g RAC 第二节点root.sh执行失败后再次执行root.sh

Oracle 11g RAC 第二节点root.sh执行失败后再次执行root.sh前&#xff0c;要先清除之前的crs配置信息 # /u01/app/11.2.0/grid/crs/install/rootcrs.pl -verbose -deconfig -force # /u01/app/11.2.0/grid/root.sh转载于:https://www.cnblogs.com/abclife/p/5725962.html

jvm需要多长时间才能进行转义分析? 可能比您想象的要长。

这篇文章着眼于转义分析&#xff0c;特别是jvm在运行的程序中执行转义分析需要多长时间。 我做了一些观察&#xff0c;但目前还没有全部解释。 作为介绍&#xff0c;让我们绕道看看jvm -Xcomp中一个鲜为人知且使用更少的标志&#xff08;这将是一件好事&#xff09;。 该标志…

postgres 判断null_PostgreSQL NULLIF()用法及代码示例

PostgreSQL的有一个NULLIF函数来处理空值。这个NULLIF函数是PostgreSQL提供的最常见的条件表达式之一。 用法:NULLIF(argument_1,argument_2); 这个NULLIF如果函数返回空值参数_1等于参数_2,否则返回参数_1。 例: 首先,我们创建a 表名为帖子如下: CREATE TABLE posts ( id…