Apache Thrift的使用

Stella981
• 阅读 559

Thrift是什么,看这里:http://thrift.apache.org/

1.从官网下载thrift

  Thrift官网:http://thrift.apache.org/,Windows 和 Linux请分别下载不同的版本。 在Windows上,将下载的压缩文件解压后,放到一个文件夹下,并为其配置环境变量,以便以后可以直接从命令行启用它。注意:在网上找找,将libthrift-0.9.0.jar和slfj-api-1.7.2.jar一起放入我们项目的lib文件夹下,并添加到项目的buildpath中,因为thrift生成的java文件中,将会引用到这两个包中的类。

2.编写thrift文件

  thrift文件是一个文本文件,文件名自定义,后缀也自定义。但是为了方便理解,建议后缀写为:.thrift。一个thrift文件(Person.thrift)像下面这样:

namespace java com.abc.gen
struct Person{
  1:i32 id;
  2:string name;
  3:int age;
  4:bool married;
}
service PersonService {
  Person getPersonById(1:i32 id) ,
  bool deletePersonById(1:i32 id )
}

  这个文件中,namespace描述了生成的类的包名;struct用于定义一种结构体(在Java中叫做对象),thrift将生成这个Person对象,Person对象中定义了几个基本的属性。service用于定义“服务”,这些“服务”将以接口的方式生成在类中。我们需要做的,就是待thrift为我们生成相应的文件之后,去实现这些接口。

3.用thrift生成自定义的类

  使用命令:thrift -r -gen java Person.thrift 来生成我们需要的类。

  其中-r表示递归,如果这个Person.thrift文件中又引用了其他thrift文件中定义的对象,那么在生成的时候,将会把引用的对象的thrift文件中定义的所有对象一起生成。 

  -gen Java 表示生成的是java语言的文件,最后一个参数表示定义thrift对象和服务的文件。

4.实现生成的接口

  根据以上的thrift文件,生成之后的文件有Person.java和PersonService.java,其中PersonService.java类中有一个Iface接口,这个接口就是我们需要实现的。我们把这两个生成的Java类复制到我们的项目包中待用。现在,新建一个类PersonServiceImpl,这个类实现了PersonService.Iface。这里以方法getPersonById为例,为了简单起见,直接在PersonServiceImpl的getPersonById中new一个Person对象,设置相关的属性并返回。如下:

import org.apache.thrift.TException;
import com.abc.gen.Person;
import com.abc.gen.PersonService;
public class PersonServiceImpl implements PersonService.Iface {
  @Override
  public Person getPersonById(int id) throws TException {
    Person p = new Person();
    p.setId(id);
    p.setAge(20);
    p.setName("name");
    p.isMarried(false);
    return p;
  }
  @Override
  public boolean deletePersonById(int id) throws TException {
    // TODO Auto-generated method stub
    return false;
  }
}

  其中这两个复写的接口,就是我们在Person.thrift中定义的service。

5.编写ThriftServer

import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.server.TThreadPoolServer.Args;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import com.abc.gen.PersonService;
import com.abc.impl.PersonServiceImpl;
public class ThriftServer {
  public static void main(String[] args) {
    PersonService.Processor processor = new PersonService.Processor(new PersonServiceImpl());
    try{
      TServerTransport serverTransport = new TServerSocket( new InetSocketAddress("127.0.0.1",9999));
      Args trArgs=new Args(serverTransport);
      trArgs.processor(processor);
      TServer server = new TThreadPoolServer(trArgs);
      System.out.println("Thrift服务已开启...");
      server.serve();
      server.stop();
      System.out.println("Thrift服务已停止...");
    }catch(Exception e){
      throw new RuntimeException("thrift服务启动失败"+"\n"+e.getMessage());
    }
  }
}

6.编写ThriftClient

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 com.abc.gen.Person;
import com.abc.gen.PersonService;
public class ThriftClient {
  public static void main(String[] args) throws TException {
    TTransport transport = new TSocket("127.0.0.1",9999);
    long start=System.currentTimeMillis();
    TProtocol protocol = new TBinaryProtocol(transport);
    PersonService.Client client=new PersonService.Client(protocol);
    transport.open();
    System.out.println("调用开始...");
    Person person = client.getPersonById(1);
    System.out.println("调用结果:" + person.toString());
    transport.close();
    System.out.println("消耗时间:" + (System.currentTimeMillis()-start) + "ms");
  }
}

7.调用

  先启动ThriftServer,在启动ThriftClient,这时会看到以下内容:

Thrift服务已开启...  
调用开始...
调用结果:Person(id:1, name:name, age:20, married:false)
消耗时间:115ms
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
thrift简单示例 (基于C++)
这个thrift的简单示例,来源于官网(http://thrift.apache.org/tutorial/cpp),因为我觉得官网的例子已经很简单了,所以没有写新的示例,关于安装的教程,可以参考https://www.cnblogs.com/albizzia/p/10838646.html,关于thrift文件的语法,可以参考:https
Wesley13 Wesley13
2年前
P2P技术揭秘.P2P网络技术原理与典型系统开发
Modular.Java(2009.06)\.Craig.Walls.文字版.pdf:http://www.t00y.com/file/59501950(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.t00y.com%2Ffile%2F59501950)\More.E
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这