在探索未知的程序之前,我们往往会使用“Hello World”这个经典的输出作为测试,为了遵循这个惯例,作为thrift菜鸟都不算的一员,决定跑一下“Hello world”正式进入菜鸟的行列。

thrift通过一个跨语言的定义文件的方式定义数据类型和服务接口,这个文件作为RPC客户端和服务器通信的标准,所谓跨语言,就是客户端和服务器端的语言是没有限制的,可以相同也可以不同,本质上定义的服务和接口都是一样的。

下面是我用intellij跑的java的例子:

环境配置:

1. ubuntu 13
2. thrift 0.5.0
3. Intellij 13

1.在Intellij中创建maven项目,在pom.xml中添加项目需要的依赖:

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

2.在resources目录下新建helloworld.thrift文件,内容如下:

namespace java com.qiao.thrift.hello

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

3.在命令端打开helloworld.thrift文件所在的目录,执行下面的命令:

thrift -r --gen java hello_world.thrift 

这时目录下会产生gen-java目录,目录下就是thrift自动生成的代码。

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

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

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

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

public class HelloWorldSimpleServer {
public static final int SERVER_PORT=8090;
public void startServer(){
try{
System.out.println("Hello World TSimpleServer start..."); TProcessor tp=new IHelloWorldService.Processor(new HelloWorldService());
TServerTransport sT=new TServerSocket(SERVER_PORT);
TServer server=new TSimpleServer(tp,sT);
System.out.println("Starting the server"); server.serve(); }catch (Exception e){
System.out.println("Server start error!!");
e.printStackTrace();
}
System.out.println("done.");
} public static void main(String[] args){
HelloWorldSimpleServer server=new HelloWorldSimpleServer();
server.startServer();
}
}

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

public class HelloWorldSimpleClient {

    public void startClient(String userName) {

        TTransport transport = null;
try { transport = new TSocket("localhost", 8090);
TProtocol protocol = new TBinaryProtocol(transport);
IHelloWorldService.Client client = new IHelloWorldService.Client(protocol); transport.open(); String res = client.sayHello(userName);
System.out.println("Thrift result =:" + res); } catch (Exception x) {
System.out.println("Start client Error!");
x.printStackTrace();
} finally {
if (transport != null) {
transport.close();
}
} }
public static void main(String[] args){
HelloWorldSimpleClient client=new HelloWorldSimpleClient();
client.startClient("qiao");
} }

8.启动HelloWorldSimpleServer,控制台输出HelloWorld TSimpleServer start ....,同时,HelloWorldSimpleServer作为Server一直处于运行过程中;启动HelloWorldSimpleClient,控制台输出Thrift client result =: Hi, Tom, Welcome to the Thrift world, enjoy it! 执行完后,客户端进程结束。

另外在运行过程中出现下面的警告:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

原因是org.slf4j.impl.StaticLoggerBinder 无法载入到内存,原因是没有找到合适的绑定SLF4J,需要添加所列举的包中的某一个。解决方案是手动下载一个slf4j-nop.jar,然后添加到路径中就可以了。

另外比较全的代码例子为:https://github.com/mariusae/thrift-0.5.0-finagle.git

thrift0.5入门操作的更多相关文章

  1. spring boot 入门操作(二)

    spring boot入门操作 使用FastJson解析json数据 pom dependencies里添加fastjson依赖 <dependency> <groupId>c ...

  2. spring boot 入门操作(三)

    spring boot入门操作 devtools热部署 pom dependencies里添加依赖 <dependency> <groupId>org.springframew ...

  3. Mysql的二进制安装和基础入门操作

    前言:Mysql数据库,知识非常的多,要想学精学通这块知识,估计也要花费和学linux一样的精力和时间.小编也是只会些毛皮,给大家分享一下~ 一.MySQL安装 (1)安装方式: 1 .程序包yum安 ...

  4. java之servlet入门操作教程一续

    本节主要是在java之servlet入门操作教程一  的基础上使用myeclipse实现自动部署的功能 准备: java之servlet入门操作教程一 中完成myFirstServlet项目的创建: ...

  5. Mysql数据库的二进制安装和基础入门操作

    前言:Mysql数据库,知识非常的多,要想学精学通这块知识,估计也要花费和学linux一样的精力和时间.小编也是只会些毛皮,给大家分享一下~ 一.MySQL安装 (1)安装方式: 1 .程序包yum安 ...

  6. Mycat 中间件配置初探与入门操作

    Mycat中间件配置初探与入门操作 By:授客 QQ:1033553122 实践环境 Mycat-server-1.5.1-RELEASE-20161130213509-win.tar.gz 下载地址 ...

  7. EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象

    EF+LINQ事物处理   在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...

  8. 01.JDBC操作数据库-快速入门操作

    /** * 简单入门操作 * 注:先将mysql-connector-java-5.1.36.jar 构建 Build Path环境当中去 * @param args * @throws Except ...

  9. (转)私有代码存放仓库 BitBucket介绍及入门操作

    转自:http://blog.csdn.net/lhb_0531/article/details/8602139 私有代码存放仓库 BitBucket介绍及入门操作 分类: 研发管理2013-02-2 ...

随机推荐

  1. 【node.js】模块系统、函数

    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码.JSON 或者编译过的C/C++ 扩 ...

  2. js对LocalDateTime时间的格式化成yyyy-MM-dd HH:mm:ss

    formatter: function(value,row,index){ var arr = value; if(arr==null || arr==""){ return &q ...

  3. ls: Call From hdoop2/192.168.18.87 to hdoop2:8020 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see

    场景:  预发环境中,同事已经搭建了一套hadoop集群,由于版本与所需不符,所以需要替换版本 问题描述: 在配置文件都准确的情况下,启动hadoop,出现以下报错: 启动之前初始化:   初始化目录 ...

  4. 强连通分量算法·$tarjan$初探

    嗯,今天好不容易把鸽了好久的缩点给弄完了--感觉好像--很简单? 算法的目的,其实就是在有向图上,把一个强连通分量缩成一个点--然后我们再对此搞搞事情,\(over\) 哦对,时间复杂度很显然是\(\ ...

  5. Mysql安装(win10 64位)

    公司的测试数据库只有读的权限,而且还不能用IP和端口去访问,所有很多时候不方便(尤其是想练手的时候).闲着也是闲着,自己搭建一个Mysql数据库出来.以下操作,全部基于win10专业版 64位,仅供参 ...

  6. java学习笔记-基础篇

    Java基础篇 1—12 常识 13 this关键字 14参数传递 16 继承 17 访问权限 28—31异常 1—12 常识 1.文件夹以列表展示,显示扩展名,在地址栏显示全路径 2.javac编译 ...

  7. IOS马甲包(诚招大量开发)

    马甲包的字面意思给产品穿马甲,但是我认为马甲包更像是产品的一种分身,一种和产品一样拥有灵魂,拥有肉身的一种分身.它能为产品带来同样的功能效果. 一.什么是马甲包通过技术手段,多次上架同一款产品的方法. ...

  8. helpera64开发板下制作ubuntu rootfs镜像

    下一篇路径:https://www.cnblogs.com/jizizh/p/10499448.html 环境: HelperA64开发板 Linux3.10内核 时间:2019.02.14 目标:定 ...

  9. 【11.18总结】从SAML出发在重定向中发现的XSS漏洞

    Write-up地址:How I Discovered XSS that Affects around 20 Uber Subdomains 作者:fady mohammed osman 总算回家了, ...

  10. cifar数据集介绍及到图像转换的实现

    CIFAR是一个用于普通物体识别的数据集.CIFAR数据集分为两种:CIFAR-10和CIFAR-100.The CIFAR-10 and CIFAR-100 are labeled subsets ...