netty学习八:在window上安装thrift以及第一个小demo

原创 2017年08月09日 09:28:37

下载thrift window编译器


需要先下载编译器,本文用的版本是:

thrift-0.10.0.exe

对应的下载链接:thrift编译器

将下载好后的thrift-0.10.0.exe重命名成thrift.exe,并配置到window path路径上,假设thrift.exe是放置在如下目录:

D:\test\software\lib\thrift

那么直接将D:\test\software\lib\thrift配置到path上。

使用cmd命令打开一个窗口,执行:

thrift -version

正常情况下会输出thrift的版本号:

Thrift version 0.10.0


下载thrift java依赖包


<dependency>
    <groupId>org.apache.thrift</groupId>
    <artifactId>libthrift</artifactId>
    <version>0.10.0</version>
</dependency>

使用maven命令下载即可,下载成功后会有四个依赖包:

libthrift-0.10.0.jar
slf4j-api-1.7.12.jar
httpclient-4.4.1.jar
httpcore-4.4.1.jar

下载thrift eclipse 插件


直接使用Eclipse的MarketPlace找不到thrift support这个插件,得使用Eclipse的Install new software的方式。

点击Eclipse的install new software按钮,输入地址

http://thrift4eclipse.sourceforge.net/updatesite/

下载thrift support 插件,这个插件的高亮功能还是相当完备的,建议开发者安装。


编写thrift idl文件


编写animal.thrift

namespace java thrift.generated

typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String

struct Animal {
 1: optional String username,
 2: optional int age,
 3: optional boolean married
}

exception DataException {
 1: optional String message,
 2: optional String callStack,
 3: optional boolean date
}

service AnimalService {
  Animal getAnimalByUsername(1: required String name) throws (1: DataException dataException),
  void saveAnimal(1: required Animal animal) throws (1: DataException dataException)
}

animal.thrift位于:

src/main/java/thrift

完整路径是:

src/main/java/thrift/animal.thrift

其中的

typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String

是做类型定义,因为thrift默认的类型定义不太符合java程序员的使用习惯.


使用thrift编译器生成java类


执行命令:

thrift –gen java src/main/java/thrift/animal.thrift

注意是gen前面是两个-,不是一个- .

执行成功后会生成gen-java目录:

gen-java
   thrift
     generated
       Animal.java
       AnimalService.java
       DataException.java

这些文件不是在java source目录下的,我们可以将其拷贝到source目录下,本文中将其拷贝到如下source目录:

thrift.generated


实现Animal业务层服务类


package thrift.firstdemo;

import org.apache.thrift.TException;

import thrift.generated.Animal;
import thrift.generated.AnimalService;
import thrift.generated.DataException;
/**
 * 业务层服务类 
 *
 */
public class AnimalBizService implements AnimalService.Iface{

    @Override
    public Animal getAnimalByUsername(String name) throws DataException, TException {
        System.out.println("client name:"+name);
        Animal animal = new Animal();
        animal.setUsername(name);
        animal.setAge(34);
        animal.setMarried(true);

        return animal;
    }

    @Override
    public void saveAnimal(Animal animal) throws DataException, TException {
        System.out.println("saveAnimal");
        System.out.println(animal.getUsername());
        System.out.println(animal.getAge());
        System.out.println(animal.isMarried());
    }

}

通常用thrift生成service后,会用一个业务实现类来实现thrift servce接口,完成业务逻辑.


Thrift Server端代码


package thrift.firstdemo;

import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.THsHaServer.Args;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;

import thrift.generated.AnimalService;
public class ThriftServer {

    public static void main(String[] args) throws TTransportException {
        TNonblockingServerSocket socket = new TNonblockingServerSocket(8899);
        Args arg = new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4);

        AnimalService.Processor<AnimalBizService> processors = new AnimalService.Processor<>(new AnimalBizService());
        arg.protocolFactory(new TCompactProtocol.Factory());
        arg.transportFactory(new TFramedTransport.Factory());
        arg.processorFactory(new TProcessorFactory(processors));

        TServer server = new THsHaServer(arg);
        server.serve();
    }
}

Thrift Client端代码


package thrift.firstdemo;

import org.apache.thrift.TException;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;

import thrift.generated.Animal;
import thrift.generated.AnimalService;
import thrift.generated.AnimalService.Client;
import thrift.generated.DataException;

public class ThriftClient {

    public static void main(String[] args) throws DataException, TException {
        TTransport transport = new TFramedTransport(new TSocket("localhost", 8899),600); 
        TCompactProtocol tCompactProtocol = new TCompactProtocol(transport);
        Client client = new AnimalService.Client(tCompactProtocol);

        transport.open();
        Animal animal = client.getAnimalByUsername("sam");
        System.out.println(animal.getUsername());
        System.out.println(animal.getAge());
        System.out.println(animal.isMarried());


        Animal animal2 = new Animal();
        animal2.setUsername("sam2");
        animal2.setAge(35);
        animal2.setMarried(false);
        client.saveAnimal(animal2);
    }
}

运行代码


分别运行ThriftServer类和ThriftClient类的main方法,启动服务端和客户端,正常情况下会打印如下日志:

client name:sam
saveAnimal
sam2
35
false


csdn code 路径


这个项目的源代码放置在csdn code上,欢迎访问。

netty_study

版权声明:本文为博主原创文章,未经博主允许不得转载。

一起学Netty(八)之 浅析ByteToMessageDecoder

上一节一起学习了几个解码器,用于解决TCP协议网络传输过程中粘包和拆包的问题,用过Netty的人总会说一句话“用Netty一定要了解一下它的底层原理,这样才敢用”,其实很有感悟,Netty in ac...
  • linuu
  • linuu
  • 2016年05月11日 19:43
  • 4503

一起学Netty(十二)之 Netty心跳简单Demo

前面简单地了解了一下IdleStateHandler,我们现在写一个简单的心跳demo: 1)服务器端每隔5秒检测服务器端的读超时,如果5秒没有接受到客户端的写请求,也就说服务器端5秒没有收到读事件,...
  • linuu
  • linuu
  • 2016年05月14日 10:15
  • 6338

思科CCNA第一学期第八章答案

1   OSI 哪一层负责网络通信的二进制传输、电缆规格和物理方面? 表示层 传输层 数据链路层 ...
  • u014253173
  • u014253173
  • 2015年01月02日 23:18
  • 3659

netty学习六:第一个protobuf小demo

概述本文介绍google的protobuf框架的环境搭建以及使用它编写一个小demo。配置proto编译器如果要在window上使用proto编译器,需要下载针对window的编译器,本文使用的是: ...
  • linsongbin1
  • linsongbin1
  • 2017年08月06日 18:08
  • 417

thrift 基于window的安装配置

thrift是由facebook开发用做系统内各语言之间的RPC通信 。主要特点是可以跨多语言,并且能承受高并发访问。在使用的过程中,跟同为RPC的hessian比较,最令人印象深刻的是,需要定义一个...
  • zhenshibendan
  • zhenshibendan
  • 2016年01月08日 15:24
  • 345

thrift学习第二步,一个简单的双向通信demo以及原理讲解,以及注意事项

经过一番研究后,摸清楚了thrift的基本使用方法和其工作原理.thrift的确是封装了java原生Socket,所以从根本上来讲是可以实现双向通信的,正如上一篇文章中翻译的外文中所说的,无需建立双连...
  • qq_27989757
  • qq_27989757
  • 2016年02月28日 18:26
  • 983

thrift_java_demo和安装包

  • 2017年06月05日 13:48
  • 2.45MB
  • 下载

Netty学习(七)-Netty编解码技术以及ProtoBuf和Thrift的介绍

谈到序列化我们自然想到java提供的Serializable接口,在java中我们如果需要序列化只需要继承该接口就可以通过输入输出流进行序列化和反序列化。但是在提供很用户简单的调用的同时他也存在很多问...
  • a953713428
  • a953713428
  • 2017年04月05日 13:08
  • 1522

netty学习三:基于socket的聊天小demo

netty学习三:基于socket的聊天小demo
  • linsongbin1
  • linsongbin1
  • 2017年07月30日 12:53
  • 567

netty学习二:基于socket通讯的小demo

netty socket编程小demo
  • linsongbin1
  • linsongbin1
  • 2017年07月29日 16:07
  • 687
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:netty学习八:在window上安装thrift以及第一个小demo
举报原因:
原因补充:

(最多只允许输入30个字)