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

一.什么是RPC?

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

二.什么是Thrift?

thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。

thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。

三.下载,安装,配置Thrift

本机环境:ubuntu 12.04 (64bit)

1.下载:

下载地址:http://www.apache.org/dyn/closer.cgi?path=/thrift/0.9.1/thrift-0.9.1.tar.gz (目前最新0.9.1,2014/08/11)

2.安装,配置Thrift

官网教程:http://thrift.apache.org/docs/BuildingFromSource

Building from source

First make sure your system meets all necessary Apache Thrift Requirements

If you are building from the first time out of the source repository, you will need to generate the configure scripts. (This is not necessary if you downloaded areleased tarball.) From the top directory, do:

./bootstrap.sh

Once the configure scripts are generated, thrift can be configured. From the top directory, do:

./configure

Disable a language:

./configure --without-java

You may need to specify the location of the boost files explicitly. If you installed boost in /usr/local, you would run configure as follows:

./configure --with-boost=/usr/local

If you want to override the logic of the detection of the Java SDK, use the JAVAC environment variable:

./configure JAVAC=/usb/bin/javac

Note that by default the thrift C++ library is typically built with debugging symbols included. If you want to customize these options you should use the CXXFLAGS option in configure, as such:

./configure CXXFLAGS=‘-g -O2‘
./configure CFLAGS=‘-g -O2‘
./configure CPPFLAGS=‘-DDEBUG_MY_FEATURE‘

To see other configuration options run

./configure --help

Once you have run configure you can build Thrift via make:

make

and run the test suite:

make check

and the cross language test suite:

sh test/test.sh

Issues while compiling

  • "compiler/cpp/thriftl.cc:2190: undefined reference to `yywrap‘"

    you need to install the Flex library (See also Apache Thrift Requirements ) and re-run the configuration script.

  • mv: cannot stat "‘.deps/TBinaryProtocol.Tpo‘: No such file or directory" while building the Thrift Runtime Library

    Re-reun configure with

    --enable-libtool-lock

    or by turning off parallel make by placing .NOTPARALLEL: in lib/cpp/Makefile or

    make -j 1

    Although the thrift compiler build appears to be compatible with parallel make without libtool lock, the thrift runtime build is not.

Installing

From the top directory, become superuser and do:

make install

Note that some language packages must be installed manually using build tools better suited to those languages (this applies to Java, Ruby, PHP).

Look for the README file in the lib/<language>/ folder for more details on the installation of each language library package.

总结下来,第1步,先解压thrift-0.9.1.tar.gz,解压命令:

tar -xvf thrift-0.9.1.tar.gz

第2步,输入以下命令:

$cd thrift-0.9.1
$./configure
$make
#sudo make install  

关于配置的问题可以查看命令:

./configure --help

可以关闭你不熟悉的语言,因为thrift支持的语言非常多,可以关闭一些用不到的,如python,gt4等;

关闭命令为:

./configure --without-qt4

在install的过程中如果报一些test方面的error可以忽略.

上面的步骤走完以后,可以在任意一个目录下输入如下命令进行测试:

[email protected]:~/workspace$ thrift -version
Thrift version 0.9.1

四.Thrift基本概念

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:对应服务的类

2.服务端编码基本步骤:

  • 实现服务处理接口impl
  • 创建TProcessor
  • 创建TServerTransport
  • 创建TProtocol
  • 创建TServer
  • 启动Server

3.客户端编码基本步骤:

  • 创建Transport
  • 创建TProtocol
  • 基于TTransport和TProtocol创建 Client
  • 调用Client的相应方法

4.数据传输协议

  • TBinaryProtocol : 二进制格式.
  • TCompactProtocol : 压缩格式
  • TJSONProtocol : JSON格式
  • TSimpleJSONProtocol : 提供JSON只写协议, 生成的文件很容易通过脚本语言解析

tips:客户端和服务端的协议要一致

五.Java实例

1.引入jar包

我这里用到的是maven进行管理jar包的,所以首先新建一个maven项目,然后在pom.xml中添加如下内容:

  <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libthrift</artifactId>
            <version>0.9.1</version>
  </dependency>
  <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.5.8</version>
 </dependency>

2.创建Thrift文件

创建Thrift文件:[email protected]:/media/f91a4cca-0b96-4c30-b140-7918a196de3e/amosli/java/rpc/DemoTest/demoHello.thrift ,内容如下:

namespace java com.amos.thrift.demo

service  HelloWorldService {
  string sayHello(1:string username)
}

3.生成java文件:

thrift -r -gen java demoHello.thrift

文件目录如下:

$ tree
.
├── demoHello.thrift
└── gen-java
    └── com
        └── amos
            └── thrift
                └── demo
                    └── HelloWorldService.java

把生成的HelloWorldService.java文件拷贝到项目中去.

4.实现接口Iface

package com.amos;

/**
 * Created by amosli on 14-8-12.
 */
public class HelloWorldImpl implements HelloWorldService.Iface {

    public HelloWorldImpl() {
    }

    @Override
    public String sayHello(String username) {
        return "Hi," + username + " ,Welcome to the thrift‘s world !";
    }

}

5.TSimpleServer服务端

简单的单线程服务模型,一般用于测试。

编写服务端server代码:HelloServerDemo.java

package com.amos;

import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;

/**
 * Created by amosli on 14-8-12.
 */
public class HelloServerDemo {
    public static final int SERVER_PORT = 8090;

    /**
     * @param args
     */
    public static void main(String[] args) {
        HelloServerDemo server = new HelloServerDemo();
        server.startServer();
    }

    public void startServer() {
        try {
            System.out.println("HelloWorld TSimpleServer start ....");

//          TProcessor tprocessor = new HelloWorldService.Processor<HelloWorldService.Iface>(new  HelloWorldImpl());
            HelloWorldService.Processor<HelloWorldService.Iface> tprocessor = new HelloWorldService.Processor<HelloWorldService.Iface>(new HelloWorldImpl());

            // 简单的单线程服务模型,一般用于测试
            TServerSocket serverTransport = new TServerSocket(SERVER_PORT);
            TServer.Args tArgs = new TServer.Args(serverTransport);
            tArgs.processor(tprocessor);
//            tArgs.protocolFactory(new TBinaryProtocol.Factory());
            tArgs.protocolFactory(new TCompactProtocol.Factory());
            // tArgs.protocolFactory(new TJSONProtocol.Factory());
            TServer server = new TSimpleServer(tArgs);
            server.serve();

        } catch (Exception e) {
            System.out.println("Server start error!!!");
            e.printStackTrace();
        }
    }

}

6.编写客户端代码

package com.amos;

import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;

/**
 * Created by amosli on 14-8-12.
 */
public class HelloClientDemo {

    public static final String SERVER_IP = "localhost";
    public static final int SERVER_PORT = 8090;
    public static final int TIMEOUT = 30000;

    /**
     * @param args
     */
    public static void main(String[] args) {
        HelloClientDemo client = new HelloClientDemo();
        client.startClient("amosli");

    }

    /**
     * @param userName
     */
    public void startClient(String userName) {
        TTransport transport = null;
        try {
            transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT);
            // 协议要和服务端一致
//            TProtocol protocol = new TBinaryProtocol(transport);
            TProtocol protocol = new TCompactProtocol(transport);
            // TProtocol protocol = new TJSONProtocol(transport);
            HelloWorldService.Client client = new HelloWorldService.Client(
                    protocol);
            transport.open();
            String result = client.sayHello(userName);
            System.out.println("Thrift client result =: " + result);
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        } finally {
            if (null != transport) {
                transport.close();
            }
        }
    }

}

项目最终结构图:

7.最终运行效果

服务端:

客户端:

本文源码:https://github.com/amosli/rpc

参考:

1.http://baike.baidu.com/view/1698865.htm?fr=aladdin

2.http://thrift.apache.org/docs/BuildingFromSource

3.http://www.micmiu.com/soa/rpc/thrift-sample/

4.http://blog.chinaunix.net/uid-20357359-id-2876170.html

5.http://baike.baidu.com/view/7287257.htm?fromtitle=RPC&fr=aladdin

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

时间: 2024-10-27 06:04:04

RPC学习----Thrift快速入门和Java简单示例的相关文章

Thrift快速入门

Thrift 简单示例 2017-01-19 16:47:57 首先通过先面两个示例简单感受一下Thrift(RPC)服务端与客户端之间的通信...... RPC学习----Thrift快速入门和Java简单示例 Thrift入门及Java实例演示 Thrift 是什么? Thrift 源于大名鼎鼎的 facebook 之手,在 2007 年 facebook 提交 Apache 基金会将 Thrift 作为一个开源项目,对于当时的 facebook 来说创造 thrift 是为了解决 face

3、Kafka学习分享|快速入门-V3.0

Kafka学习分享|快速入门 这个教程假定你刚开始是新鲜的,没有现存的Kafka或者Zookeeper 数据.由于Kafka控制控制脚本在Unix和Windows平台不同,在Windows平台使用bin\windows\ 代替 bin/,并且更改脚本扩展名为.bat. 第一步:下载编码 下载0.10.2.0版本并且解压它. 第二步:启动服务器 Kafka使用Zookeeper,因此如果你没有Zookeeper server,你需要先启动a ZooKeeper server.你可以使用Kafka的

Hadoop快速入门(WordContent简单应用)

Hadoop快速入门 WordContent简单应用 Hadoop的HelloWorld程序 创建HDFS目录 hdfs命令位于bin目录下,通过hdfs dfs -mkdir命令可以创建一个目录. [[email protected] hadoop-2.7.3]# bin/hdfs dfs -mkdir -p input dfs创建的目录默认会放到/user/{username}/目录下面,其中{username}是当前用户名.所以input目录应该在/user/root/下面. 下面通过`h

大数据Hadoop学习之快速入门方法

1.Hadoop生态概况 Hadoop是一个由Apache基金会所开发的分布式系统集成架构,用户可以在不了解分布式底层细节情况下,开发分布式程序,充分利用集群的威力来进行高速运算与存储,具有可靠.高效.可伸缩的特点 Hadoop的核心是YARN,HDFS,Mapreduce,常用模块架构如下 ? 我还是要推荐下我自己创建的大数据资料分享群142973723,这是大数据学习交流的地方,不管你是小白还是大牛,小编都欢迎,不定期分享干货,包括我整理的一份适合零基础学习大数据资料和入门教程. 2.HDF

Spring学习(1) —— 快速入门

认识 Spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转) 和 AOP(Aspect Oriented Programming,面向切面编程). Spring IoC 和 DI 简介 IoC:Inverse of Control(控制反转) 读作“反转控制”,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理. 正控:若要使用某个对象,需要自己去负责对象

mybatis快速入门,mybatis简单实例, 如何使用mybatis

目录结构: 1. 导入所需要的包 2. 创建数据库 create database mybatis; use mybatis; CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT); INSERT INTO users(NAME, age) VALUES('Tom', 12); INSERT INTO users(NAME, age) VALUES('Jack', 11); 3. 建立相应

Elasticsearch学习之快速入门案例

1. document数据格式 面向文档的搜索分析引擎 (1)应用系统的数据结构都是面向对象的,复杂的(2)对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式,相当麻烦(3)ES是面向文档的,文档中存储的数据结构,与面向对象的数据结构是一样的,基于这种文档数据结构,es可以提供复杂的索引,全文检索,分析聚合等功能(4)es的document用json数据格式来表达 1 public class Employee { 2 3 private String em

Qt入门学习——Qt快速入门(vim纯代码编写)

写代码前,先需搭建环境,详情请看:<Qt 5.4.2 ubuntu环境搭建>. 一个简单空白窗口 打开终端,通过vim first_qt.cpp新建文件,由于Qt代码为C++代码,所以,新建文件的后缀为.cpp. 代码内容如下: #include <QApplication> #include <QWidget> int main(int argc, char *argv[]) { QApplication app(argc, argv); //初始化 QWidget

Vue快速入门-1-Vue的简单使用

小生博客:http://xsboke.blog.51cto.com如果有疑问,请点击此处,然后发表评论交流,作者会及时回复. -------谢谢您的参考,如有疑问,欢迎交流 目录: 1. 简单的将数据渲染到DOM 2. Vue的"v-"指令 3. "v-if"指令的使用 4. "v-for"指令的使用 5. Vue的事件处理 6. "v-model:value"实现双向数据绑定 7. Vue实现逆转字符串 8. Vue 动态添