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

时间: 2024-10-01 07:25:38

Apache Thrift with Java Quickstart(thrift入门及Java实例)的相关文章

第一章 java网络编程入门_mailClient.java

import java.net.*;import java.io.*; public class MailSender{  private String smtpServer="smtp.mydomain.com";  //SMTP邮件服务器的主机名  //private String smtpServer="localhost";  private int port=25; public static void main(String[] args){    Me

第一章 java网络编程入门_EchoPlayer.java

import java.io.*;public class EchoPlayer {  public String echo(String msg) {    return "echo:"+msg;  }  public void talk()throws IOException {    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));    String msg=null;    whil

第一章 java网络编程入门_HTTPClient.java

import java.net.*;import java.io.*;public class HTTPClient {  String host="www.baidu.com";  int port=80;  Socket socket;    public void createSocket()throws Exception{    socket=new Socket("www.baidu.com",80);  } public void communicat

RPC学习----Thrift快速入门和Java简单示例

一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI网络通信模型中,RPC跨越了传输层和应用层.RPC使得开发包括网络分布式多程序在内的应用程序更加容易. 二.什么是Thrift? thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和

Thrift入门及Java实例演示&lt;转载备用&gt;

Thrift入门及Java实例演示 作者: Michael 日期: 2012 年 6 月 14 日 •概述 •下载配置 •基本概念 1.数据类型 2.服务端编码基本步骤 3.客户端编码基本步骤 4.数据传输协议 •实例演示(java) 1. thrift生成代码 2. 实现接口Iface 3.TSimpleServer服务模型 4.TThreadPoolServer 服务模型 5.TNonblockingServer 服务模型 6.THsHaServer服务模型 7.异步客户端 [一].概述 T

用java做thrift服务端,php做thrift客户端简单例子

注意: 1).需要的包以及路径问题要注意修改为自己本地的 2)详细情况见  http://pan.baidu.com/s/1qW8xI0k 这里以Hello.thrift为例 namespace java hellodemo namespace php hellodemo service Hello{ string helloString(1:string para) i32 helloInt(1:i32 para) bool helloBoolean(1:bool para) void hel

Thrift教程初级篇——thrift安装环境变量配置第一个实例

前言: 因为项目需要跨语言,c++客户端,web服务端,远程调用等需求,所以用到了RPC框架Thrift,刚开始有点虚,第一次接触RPC框架,后来没想到Thrift开发方便上手快,而且性能和稳定性也不错,项目也顺利完成.所以给各位小白们,"科普"一下如何使用Thrift完成自己的远程调用. 1.什么是RPC:                      平时开发的服务,大多都是本地调用,如果说需要依赖他人服务了,而且他人的服务在远端,那怎么调用呢? RPC能够游刃有余的解决这样的问题.首

C++ Thrift Client 与 Flume Thrift Source 对接

项目需要C++代码与flume对接,进而将日志写入HDFS.flume原生为java代码,原先的解决方案是通过JNI调用flume java方法.但是由于一来对jni的调用效率的担心,二来C++调用JNI需要照顾local reference和GC的问题,被搞得头痛了.一怒之下,重写代码了,使用C++与远端的JAVA Flume对接. 在协议的选择上,AVRO C++虽然也有apache的开源项目,但是目前只支持读写文件,而不能使用RPC.故使用了thrift与远端Flume thrift so

Thrift RPC实战(三) thrift序列化揭秘

本文主要讲解Thrift的序列化机制, 看看thrift作为数据交换格式是如何工作的? 1.构造应用场景: 1). 首先我们先来定义下thrift的简单结构. 1 2 3 4 5 namespace java com.yangyang.thrift.api struct Pair { ? ? 1: required string key ? ? 2: required string value } required修饰符你肯定能猜测到它的意义, 但是你是否有没有这样的疑惑, "1",