thrift实例
Thrift实例
Apache thrift是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。
它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。
配置第一个thrift实例:
1、 去thrift官网 http://thrift.apache.org/tutorial/ 下载thrift压缩包和thrift编译工具thrift.exe.如图所示:
2、 安装ant和maven工具,去官网下载并配置环境变量即可。然后进入/lib/java目录下使用ant编译build.xml,(就是执行ant build.xml,当然注意路径)可以生成libthrift-0.9.2.jar,如图所示。
3、 编译一个简单的hello服务:新建文件改名为hello.thrift(注意更改后缀名)内容如下:
namespace java service.demo
service Hello{
string helloString(1:string para)
}
Thrif文件中为服务定义了方法的接口其中包括返回值类型和参数列表,参数列表中包括参数序号、参数名和参数类型。
4、Thrift 脚本可定义的数据类型包括以下几种类型:
- 基本类型:
- 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:未知编码文本或二进制字符串,对应 Java 的 String
- 结构体类型:
- struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
- 容器类型:
- list:对应 Java 的 ArrayList
- set:对应 Java 的 HashSet
- map:对应 Java 的 HashMap
- 异常类型:
- exception:对应 Java 的 Exception
- 服务类型:
- service:对应服务的类
5、进入thrift.exe所在目录执行thrift-0.9.2.exe –gen java hello.thrift 编译刚才写的thrift脚本就可以得到一个hello.java 文件。
6、用Java做服务器端和客户端测试服务的发布:
建立一个Java项目,将生成的hello.java 引入项目中,引入libthrift-0.9.2-snapshot.jar(第二步用ant工具编译生成的)、slf4j-api-1.5.8.jar、slf4j-log4j12-1.5.8.jar 和 log4j-1.2.14.jar四个jar包。项目如下图:
然后编写接口的实现类,服务端,客户端。
7、这里为了方便将服务器端代码和实现类写在了一起
服务器端:
package demo.rpc;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TNonblockingServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TNonblockingServerTransport;
import org.apache.thrift.transport.TTransportException;
import service.demo.Hello;
/**
* Thrift测试服务器
*/
public class Server implements Hello.Iface {
public static void main(String[] as) {
TNonblockingServerTransport serverTransport = null;
try {
serverTransport = new TNonblockingServerSocket(19090);
} catch (TTransportException e) {
e.printStackTrace();
}
//Server 为Hello接口的实现类
Hello.Processor<Hello.Iface> processor = new Hello.Processor<Hello.Iface>(
new Server());
Factory protFactory = new TBinaryProtocol.Factory(true, true);
TNonblockingServer.Args args = new TNonblockingServer.Args(
serverTransport);
args.processor(processor);
args.protocolFactory(protFactory);
TServer server = new TNonblockingServer(args);
System.out.println("Start server on port 19090 ...");
server.serve();
}
@Override
public String helloString(String para) throws TException {
return "hello";
}
}
客户端代码如下:package demo.rpc;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import service.demo.Hello;
/**
* Thrift测试客户端
*/
public class Client {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
try {
TTransport transport = new TFramedTransport(new TSocket(
"localhost", 19090));
TBinaryProtocol protocol = new TBinaryProtocol(transport);
// TCompactProtocol protocol = new TCompactProtocol(transport);
Hello.Client client = new Hello.Client(protocol);
transport.open();
for (int i = 0; i < 1000; i++) {
System.out.println(client.helloString("login"));
}
transport.close();
} catch (TException x) {
x.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println(" 本次调用完成时间:" + (endTime - startTime));
}
}
8、启动服务器端,再运行客户端。控制台打印循环调用1000次服务所用时间。
thrift实例的更多相关文章
- Thrift-java实例
➠更多技术干货请戳:听云博客 Thrift实例1 功能描述:客户端与服务器端分别是两个应用,先启动服务器端,再启动客户端,实现执行客户端运行服务器端的加法方法. 源码截图(源码在附件中): 客户端: ...
- Apache Thrift 跨语言服务开发框架
Apache Thrift 是一种支持多种编程语言的远程服务调用框架,由 Facebook 于 2007 年开发,并于 2008 年进入 Apache 开源项目管理.Apache Thrift 通过 ...
- Apache Thrift 服务开发框架学习记录
Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架. 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Servic ...
- Apache Thrift - 可伸缩的跨语言服务开发框架
To put it simply, Apache Thrift is a binary communication protocol 原文地址:http://www.ibm.com/developer ...
- Apache Thrift学习之二(基础及原理)
Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.本文将从 Java 开发人员角度详细介绍 Apache Thrift 的架构.开发和部署,并且 ...
- JaveWeb 公司项目(3)----- 通过Thrift端口获取数据库数据
前面两篇博客的内容主要是界面搭建的过程,随着界面搭建工作的完成,网页端需要加入数据,原先的B/S架构中C#通过Thrift接口获取数据,所以在网页端也沿用这个设计 首先,新建一个Maven下的Web项 ...
- 【转载】Thrift概述
来自 <https://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/#ibm-pcon> 一个简单的 Thrift 实例 首先 ...
- thrift框架总结,可伸缩的跨语言服务开发框架
thrift框架总结,可伸缩的跨语言服务开发框架 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等.其 ...
- 【转】Apache Thrift - 可伸缩的跨语言服务开发框架
Apache Thrift - 可伸缩的跨语言服务开发框架 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.本文将从 Java 开发人员角度详 ...
随机推荐
- ios开发 Socket通信
Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的双发,即客户端(Clien ...
- 2017.4.26 慕课网--Java 高并发秒杀API配置文件(持续更新)
新建项目,new maven project. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- 设置快速的debian源的方法:
1)设置临时源 vi /etc/apt/sources.list #添加以下一行到文件最后 deb http://http.us.debian.org/debian stable main 2)更新软 ...
- 【MVC5】使用Autofac实现依赖注入
1.安装Autofac 在Package Manager Console执行如下命令: Install-Package AutofacInstall-Package Autofac.Mvc5 2.追加 ...
- HttpURLConnection读取网页文件
一.关键代码 public class MainActivity extends Activity { TextView content; ; Handler handler = new Handle ...
- Odoo 8,9,10 制造领料、入库 实践
Odoo12 已经支持在 同一个仓库内,使用 投入/产品 库位, 不必采用本文的方法 Odoo 设计在 仓库/库存 进行生产,也就是 在 仓库/库存 领料,产出, 例如 如果要实现一般 ...
- Mybatis 存在多个日志时设置日志
mybatis默认使用log4j,当有self4j这个日志jar包存在时会无法打印sql,请移除或者在工程启动时显示设置mybatis使用的日志类 log4j.logger.org.apache.ib ...
- 读EXCEL
import xlrdbook=xlrd.open_workbook('app_student.xls')sheet=book.sheet_by_index(0)#根据(索引)顺序获取到sheet页# ...
- smali文件内容具体介绍
大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看到的是(Google Play下载的完整版版 ...
- The return types for the following stored procedures could not be detected
1.使用dbml映射数据库,添加存储过程到dbml文件时报错. 2.原因:存储过程中使用了临时表 3.解决方案 3.1 通过自定义表值变量实现 Ex: DECLARE @TempTable TABLE ...