Netty的深入浅出--13.Apache Thrift的简单项目实战

本文围绕Apache Thrift简单项目展开,介绍了在Windows环境下的准备工作,包括下载编译应用、配置环境变量。还说明了开发配置文件,如创建data.thrift文件、生成相关Java代码。此外,讲解了引入依赖、创建服务端和客户端代码,实现两台计算机远程信息调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

thrift的Windows环境准备

首先在Apache官网下载thrift 编译应用,戳这里下载 Apache Thrift - Download

  下载好windows 版本的exe文件。在c盘新建一个thrift文件夹,将下载好的thrift-xxx.exe文件该名成 thrift.exe,放入Thrift文件夹中。

配置环境变量

检查是否配置成功:

开发配置文件

在str目录下与main文件夹平级:

在idea中添加插件使用,它的插件相比来说比protobuf的插件要强大很多:

 创建文件data.thrift里面包含其中设置命令空间为java路径

将thrift里面的数据类型定义成java类型,这样看起来比较舒服,而且使用起来也比较方便,现在对比发现相比之前那个protobuf来说好用多了o(* ̄︶ ̄*)o

namespace java thrift.generated

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

struct Person {
    1: required String username,
    2: required int age,
    3: required boolean married
}

exception DataException {
    1: optional String message
    2: optional String callStack
    3: optional String data
}

service PersonService {
    void savePerson(1: required Person person) throws (1: DataException dataException)
    Person getPersonByUsername(1: required String username) throws (1: DataException dataException)
}

生成thrift相关java代码:

 thrift --gen java .\src\thrift\data.thrift

将thrift的代码复制到java目录下,方便使用:

引入依赖

<dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.79.Final</version>
        </dependency>
        <!-- 依赖包地址:https://thrift.apache.org/download
                https://thrift.apache.org/
         -->
        <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libthrift</artifactId>
            <version>0.20.0</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.24</version>
        </dependency>

这里提醒一下大家,没必要去看那些生产的java代码,直接看.thrift文件就可以了,直接了当,而且数据本身更具有可读性。

创建一个类,然后实现来自thrift中java代码中的接口,这种代码敲起来的感觉和写java的service层那里感觉很像

PersonServiceImpl:

服务端:

创建主函数来调用ThriftServer.java

其中NonblockingServerSocket是一个非阻塞式的socket

简单的和protobuf对比理解,相当于就是一个加入了很多处理器,对数据进行处理

package thrift.service.main;

import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;
import org.apache.thrift.transport.layered.TFramedTransport;
import thrift.generated.PersonService;
import thrift.service.PersonServiceImpl;

public class ThriftServerBoot {
    public static void main(String[] args) throws TTransportException {
        TNonblockingServerSocket socket = new TNonblockingServerSocket(8899);
        THsHaServer.Args arg = new THsHaServer.Args(socket).minWorkerThreads(1).maxWorkerThreads(10);
        PersonService.Processor<PersonServiceImpl> personServiceProcessor = new PersonService.Processor<>(new PersonServiceImpl());

        arg.protocolFactory(new TCompactProtocol.Factory());
        arg.transportFactory(new TFramedTransport.Factory());
        arg.processorFactory(new TProcessorFactory(personServiceProcessor));

        THsHaServer server = new THsHaServer(arg);

        server.serve();
    }
}

 

客户端:

服务端用的是TFrameTransport,那客户端也得使用一样的:

600毫秒为超时时间;

package thrift.client.main;

import org.apache.thrift.TException;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.layered.TFramedTransport;
import thrift.generated.Person;
import thrift.generated.PersonService;


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


        transport.open();
        Person mxl = client.getPersonByUsername("mxl");
        System.out.println("Username:"+mxl.getUsername());
        System.out.println("age:" +mxl.getAge());
        System.out.println("married:"+mxl.isMarried());

        Person person = new Person();
        person.setAge(100);
        person.setUsername("xiaoming");
        person.setMarried(true);
        client.savePerson(person);
    }
}

运行服务端:

一直处于一个运行的状态;

运行客户端:

服务端收到结果 :

这样一来就解决了一个很大的问题,两台计算机远程调用彼此之间的信息。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值