【Thrift二】Thrift版的Hello World

标签: thrift thrift hello | 发表时间:2014-08-20 15:08 | 作者:bit1129
出处:http://www.iteye.com

本篇,不考虑细节问题和为什么,先照葫芦画瓢写一个Thrift版本的Hello World,了解Thrift RPC服务开发的基本流程

 

1. 在Intellij中创建一个Maven模块,加入对Thrift的依赖,同时还要加上slf4j依赖,如果不加slf4j依赖,在后面启动Thrift Server时会报错

        <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libthrift</artifactId>
            <version>0.9.1</version>
        </dependency>
       <dependency>
	   <groupId>org.slf4j</groupId>
	   <artifactId>slf4j-api</artifactId>
	   <version>1.7.7</version>
       </dependency>

 

2. 在resources目录下创建接口定义文件helloworld.thrift文件,内容如下

namespace java com.tom.thrift.hello

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

 

3.在命令号终端cd到helloworld.thrift所在的目录,执行如下命令

  

thrift -r -gen java helloworld.thrift

 

4. 命令执行完成后,在当前目录下生成一个gen-java目录,其目录结构为 gen-java/com/tom/thrift/hello/IHelloWorldService.java,这么一个简单的接口声明,自动生成了957行代码。。复杂!!!

 

5.使用cp -r命令将com/tom/thrift/hello/IHelloWorldService.java目录连同文件copy到Maven模块的src/java/main下面

 

6.在Maven模块中,自定义IHelloWorldService的实现类HelloWorldService,需要实现IHelloWorldService.Iface接口,不出意料,果然仅仅需要实现sayHello方法,类定义如下:

package com.tom.thrift.hello;

import org.apache.thrift.TException;

public class HelloWorldService implements IHelloWorldService.Iface {
    @Override
    public String sayHello(String username) throws TException {
        return "Hi, " + username + ", Welcome to the Thrift world, enjoy it!";
    }
}

 

 10.自定义单线程模式的ThriftServer用于响应客户端的rpc请求,注意一点,IHelloWorldService.Iface的实现类在服务器端进行了实例化

 

package com.tom.thrift.hello;

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

public class HelloWorldSimpleServer {
    public static final int SERVER_PORT = 8090;

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

            TProcessor tprocessor = new IHelloWorldService.Processor<IHelloWorldService.Iface>(
                    new HelloWorldService());
            // 简单的单线程服务模型,一般用于测试
            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();
        }
    }

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

}

 

 11.自定义HelloWorld的客户端,用于远程调用第10步Thrift Server提供的IHelloWorldService服务

 

package com.tom.thrift.hello;

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 HelloWorldSimpleClient {

	public static final String SERVER_IP = "localhost";
	public static final int SERVER_PORT = 8090;//Thrift server listening port
	public static final int TIMEOUT = 30000;

	/**
	 *
	 * @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);
			IHelloWorldService.Client client = new IHelloWorldService.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();
			}
		}
	}

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

 

12.启动HelloWorldSimpleServer,控制台输出HelloWorld TSimpleServer start ....,同时,HelloWorldSimpleServer作为Server一直处于运行过程中

 

13.启动HelloWorldSimpleClient,控制台输出Thrift client result =: Hi, Tom, Welcome to the Thrift world, enjoy it! 执行完后,客户端进程结束

 

总结

 前面一步一步的完成了Thrift版本的Hello World,对Thrift开发RPC服务器,有了一个基本的了解。Thrift本身的细节和更深入的学习,将在后面继续。

 

本文参考:http://www.micmiu.com/soa/rpc/thrift-sample/

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [thrift thrift hello] 推荐:

【Thrift二】Thrift版的Hello World

- - 开源软件 - ITeye博客
本篇,不考虑细节问题和为什么,先照葫芦画瓢写一个Thrift版本的Hello World,了解Thrift RPC服务开发的基本流程. 在Intellij中创建一个Maven模块,加入对Thrift的依赖,同时还要加上slf4j依赖,如果不加slf4j依赖,在后面启动Thrift Server时会报错.

【Thrift一】Thrift编译安装

- - 开源软件 - ITeye博客
上面这段话选自Apache对Thrift的一句话介绍,Thrift是一个高性能的RPC服务框架. 在技术选型时,有如下三方面的需求时,考虑使用Thrift. 2.请求和响应的数据传输量大. 个人认为在没有特别strong的理由情况下,慎用Thrift. HTTP请求通常都能够满足需求,使用Thrift带来很多开发上的额外的工作量,一个简单的服务,就要写客户端代码,.thrift接口定义以及服务器端的服务响应代码,简单的事情复杂化.

Thrift入门试用

- - Java - 编程语言 - ITeye博客
在新的项目中公司在平台内部系统间使用Thrift通讯,都没有听说过. 然后听同事说,是跨语言Socket通讯的开源组件. 1.跨平台和语言的Socket通讯组件. 2.根据伪代码的结构语言定义对象和服务结构,然后生成各语言的代码和接口. 3.各语言根据组件提供的库,编写客户端和服务器端程序. 服务器端实现接口并编写业务逻辑.

thrift快速入门实例

- - 五四陈科学院-坚信科学,分享技术
以下内容由 [五四陈科学院]提供. Thrift是Facebook的核心框架之一,使不同的开发语言开发的系统可以通过该框架实现彼此的通信,类似于webservice,但是Thrift提供了近乎变态的效率和开发的方便性,是webservice所不能比拟的.  * @author 54chen(陈臻) [chenzhen@xiaomi.com czhttp@gmail.com] .

Thrift原理简析(JAVA)

- - ITeye博客
    本文以UserService为例,描述一下使用thrift的方式,以及其原理...     首先下载和安装thrift客户端,比如在windows平台下,下载thrift.exe,不过此处需要提醒,不同的thrift客户端版本生成的API可能不兼容.本例使用thrift-0.9.0.exe;通过"--gen"指定生成API所适配的语言.本实例为生成java客户端API..

Apache Thrift - java开发详解

- - 编程语言 - ITeye博客
2、编写IDL文件 Hello.thrift. 4、编写实现类、实现Hello.Iface:. 5、编写服务端,发布(阻塞式IO + 多线程处理)服务.      * 阻塞式、多线程处理 .             //设置传输通道,普通通道  .             //使用高密度二进制协议  .

Apache Thrift入门1-架构&介绍

- 彦强 - J2EE企业应用 顾问/咨询- H.E.&#39;s Blog
  Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时的facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传 输通信以及系统之间语言环境不同需要跨平台的特性. 所以thrift可以支持多种程序语言,例如:  C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk.

thrift最佳实践:版本与兼容

- 铭文 - 五四陈科学院-坚信科学,分享技术
以下内容由[五四陈科学院]提供. 在许多系统里面,被称做message.. 协议随着岁月而演变,如果一个已经存在的消息类型不再满足需求,但是你仍然想使用原来使用thrift文件生成的代码,比如你想在现在的消息类型上增加一个额外的字段. 不用担心人,不搞坏原来的任何代码而更新消息类型,是非常简单的,只需要时刻记录以下的规则:.

浅谈Thrift内部实现原理

- - 董的博客
Dong | 新浪微博: 西成懂 | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及 版权声明. 网址: http://dongxicheng.org/search-engine/thrift-internals/. Thrift由两部分组成:编译器(在compiler目录下,采用C++编写)和服务器(在lib目录下),其中编译器的作用是将用户定义的thrift文件编译生成对应语言的代码,而服务器是事先已经实现好的、可供用户直接使用的RPC Server(当然,用户也很容易编写自己的server).

Thrift 原理与使用实例

- - 互联网旁观者
一、Thrift 框架介绍. Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目. Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),并由生成的代码负责RPC协议层和传输层的实现.