Apache Thrift with Java Quickstart(thrift入门及Java实例)
    thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
1. 概述
Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。
官网地址:thrift.apache.org 
推荐值得一看的文章: 
http://thrift.apache.org/ 
http://thrift.apache.org/download 
http://jnb.ociweb.com/jnb/jnbJun2009.html 
http://wiki.apache.org/thrift
2. maven依赖
如果是Maven构建项目的,直接在pom.xml 中添加如下内容:
<dependency>
  <groupId>org.apache.thrift</groupId>
  <artifactId>libthrift</artifactId>
  <version>0.9.2</version>
</dependency>
3. 基本概念
3.1.数据类型
基本类型: 
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:对应服务的类 
3.2.服务端编码基本步骤:
实现服务处理接口impl 
创建TProcessor 
创建TServerTransport 
创建TProtocol 
创建TServer 
启动Server 
3.客户端编码基本步骤:
创建Transport 
创建TProtocol 
基于TTransport和TProtocol创建 Client 
调用Client的相应方法 
4.数据传输协议
TBinaryProtocol : 二进制格式. 
TCompactProtocol : 压缩格式 
TJSONProtocol : JSON格式 
TSimpleJSONProtocol : 提供JSON只写协议, 生成的文件很容易通过脚本语言解析 
tips:客户端和服务端的协议要一致
4、实例演示
在此前一定要安装thrift,可以在windows上安装也可以在linux上安装,只要能执行thrift命令产生服务端接口就行了。
4.1. 新增一个文件 add.thrift,包含以下内容:
如果你用过 Google Protocol Buffer一定不会对下面的操作感到陌生。
namespace java com.jamesfen.thrift  // java的包名
    typedef i32 int  //typedefs to get convenient names for your types
    service AdditionService {  // defines the service to add two numbers
    int add(1:int n1, 2:int n2), //defines a method
}
4.2.产生服务端接口代码,执行以下命令
thrift --gen java add.thrift
4.3. 实现接口 
  当你操作完第二步后,会当前目录产生一个gen-java文件夹,里面包含了一个AdditionService.java文件,把这个类拷到你的包中。有一个要实现的内部接口,现在要实现该接口。
package com.jamesfen.thrift;
import org.apache.thrift.TException;
public class AdditionServiceHandler implements AdditionService.Iface{
    @Override
    public int add(int n1, int n2) throws TException {
      return n1 + n2;
    }
}
4.4.服务端代码,为AdditionServiceHandler类开启一个监听接口(9090)
package com.jamesfen.thrift;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TServer.Args;
import org.apache.thrift.server.TSimpleServer;
public class MyServer {
    public static void StartsimpleServer(
            AdditionService.Processor<AdditionServiceHandler> processor) {
        try {
            TServerTransport serverTransport = new TServerSocket(9090);
            TServer server = new TSimpleServer(
                    new Args(serverTransport).processor(processor));
            // Use this for a multithreaded server
            // TServer server = new TThreadPoolServer(new
            // TThreadPoolServer.Args(serverTransport).processor(processor));
            System.out.println("Starting the simple server...");
            server.serve();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        StartsimpleServer(new AdditionService.Processor<AdditionServiceHandler>(
                new AdditionServiceHandler()));
     }
}
5.客户端代码,请求服务
package com.jamesfen.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;
import org.apache.thrift.transport.TTransportException;
public class AdditionClient {
    public static void main(String[] args) {
        try {
            TTransport transport;
            transport = new TSocket("localhost", 9090);
            transport.open();
            TProtocol protocol = new TBinaryProtocol(transport);
            AdditionService.Client client = new AdditionService.Client(protocol);
            System.out.println(client.add(100, 200));
            transport.close();
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException x) {
            x.printStackTrace();
        }
    }
}
4.6.运行结果 
服务端: 
Starting the simple server… 
客户端: 
300 
4.7:demo源码 
https://github.com/Bellonor/myhadoop2.x/tree/master/myhadoop2.x/src/main/java/com/jamesfen/thrift
版权声明:本文为博主原创文章,未经博主允许不得转载。
Apache Thrift with Java Quickstart(thrift入门及Java实例)的更多相关文章
- Java程序员入门:Java程序员面试失败的5大原因
		
1 说得太少 尤其是那些开放式的问题,如"请介绍下你自己"或"请讲一下你曾经解决过的复杂问题".面试官会通过你对这些技术和非技术问题的回答来评估你的激情.他们也 ...
 - Java对象序列化入门
		
Java对象序列化入门 关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制 ...
 - Apache Thrift学习之一(入门及Java实例演示)
		
目录: 概述 下载配置 基本概念 数据类型 服务端编码基本步骤 客户端编码基本步骤 数据传输协议 实例演示(java) thrift生成代码 实现接口Iface TSimpleServer服务模型 T ...
 - Thrift入门及Java实例演示<转载备用>
		
Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...
 - RPC学习----Thrift快速入门和Java简单示例
		
一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议 ...
 - Thrift入门及Java实例演示
		
目录: 概述 下载配置 基本概念 数据类型 服务端编码基本步骤 客户端编码基本步骤 数据传输协议 实例演示(java) thrift生成代码 实现接口Iface TSimpleServer服务模型 T ...
 - Thrift入门及Java实例演示【转】
		
概述 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++.Java.Python.PHP.Ruby.Erlang.Perl.Ha ...
 - 【通信框架】Apache的开源通信框架thrift概述
		
在阅读的过程中有不论什么问题.欢迎一起交流 邮箱:1494713801@qq.com QQ:1494713801 一.作用 Thrift("Scalable Cross-Languag ...
 - Java使用Thrift,Thrift结构体定义
		
1.Thrift定义文件,Thrift常见的数据类型 1.基本类型(括号内为对应的Java类型): bool(boolean): 布尔类型(TRUE or FALSE) byte(byte): 8位带 ...
 
随机推荐
- RecycleView出现折叠效果--第三方开源--SectionedExpandableGridRecyclerView
			
下载地址:https://github.com/ddwhan0123/SectionedExpandableGridRecyclerView/archive/master.zip 具体见源码
 - 分布式_理论_05_ 一致性算法 Paxos
			
一.前言 二.参考资料 1.分布式理论(五)—— 一致性算法 Paxos 2.分布式理论(五) - 一致性算法Paxos
 - 条款51:编写new以及delete的时候需要固守常规
			
C++中delete一个指针之后,只是回收指针指向位置的空间,而指针本身的值不变.你需要手工将其赋值为NULL.注意的一点是delete NULL指针的时候不会有任何的事情发生 小结: o ...
 - MySQL全文搜索
			
http://www.yiibai.com/mysql/full-text-search.html 在本节中,您将学习如何使用MySQL全文搜索功能. MySQL全文搜索提供了一种实现各种高级搜索技术 ...
 - 在ios7中使用zxing
			
ZXing(Github镜像地址)是一个开源的条码生成和扫描库(开源协议为Apache2.0).它不但支持众多的条码格式,而且有各种语言的实现版本,它支持的语言包括:Java, C++, C#, Ob ...
 - HihoCoder1080 更为复杂的买卖房屋姿势(线段树+多重lazy)
			
描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们可以化身上帝模式,买卖房产. 在这个游戏里,会不断的发生如下两种事件:一种是房屋自发的涨价或者降价,而另一种是政 ...
 - 1151 LCA in a Binary Tree(30 分)
			
The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...
 - jenkins 参数化构建和增加环境变量
			
1.参数化构建 2.增加环境变量 prepare an environment for the run,需要安装Environment Injector插件
 - eval(function(p,a,c,k,e,r)解密程序
			
以eval(function(p,a,c,k,e,r){e=function(c)开头的js文件是经过加密的 使用下面方法可以对js文件进行加密.解密 步骤:1.新建html页面,内容如下列代码 2. ...
 - c语言-树的基础知识
			
第一.树的定义: 1.有且只有一个称为根的节点 2.有若干个互不相交的子树,这些子树本身也是一颗树 第二.专业术语: 树的深度:从根节点到最低层,节点的层数 ,称之为树的深度. 根节点是第一 ...