apache thrift基础学习

  1. 下载编译器

    http://thrift.apache.org/download

在这里插入图片描述

在这里插入图片描述

  1. 配置环境变量

    下载完成后改名为thrift

在这里插入图片描述

在环境变量path中添加路径

在这里插入图片描述

  1. 验证

    thrift --version

在这里插入图片描述

  1. 在idea中创建.thrift文件

在这里插入图片描述

namespace java thrift.generated

//编译命令  thrift --gen java src/thrift/data.thrift
//为数据类型起别名
typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String

struct Person{
    1:optional String userName,
    2:optional int age,
    3:optional boolean married
}
exception DataException{
    1:optional String message,
    2:optional String callStack,
    3:optional String date
}

service PersonService{

    Person getPersonByUserName(1:required String userName) throws (1:DataException dataException),
    void savePerson(1:required Person person) throws(1:DataException dataException)

}
  1. 编译

在这里插入图片描述
在这里插入图片描述

  1. 编写实现类
    public class PersonServiceImpl implements PersonService.Iface {
    
        @Override
        public Person getPersonByUserName(String userName) throws TException {
            System.out.println("userName:"+userName);
            Person person =new Person();
            person.setUserName(userName);
            person.setAge(14);
            person.setMarried(false);
            return person;
        }
    
        @Override
        public void savePerson(Person person) throws  TException {
            System.out.println("person:"+person);
            System.out.println(person.getUserName());
            System.out.println(person.getAge());
            System.out.println(person.isMarried());
        }
    }
    
  2. 编写服务端
    public class ThriftServer {
    
        public static void main(String[] args) throws TTransportException {
            /**
             * thrift支持的服务模型
             * TSimpleServer 简单的单线程服务模型,常用于测试
             * TThreadPoolServer 多线程服务模型,使用标准的阻塞式IO
             * TNonblockingServer 多线程服务模型,用用非阻塞式IO(需使用TFramedTransport数据传输方式)
             * THsHaServer -THsHa 引入了线程池去处理,其模型把读写任务放到线程池去处理;Half-sync/Half-async的处理模式,Half-async是在处理IO时间上(accept/read/write io) Half-sync用于handler对rpc的同步处理
             */
            TNonblockingServerSocket socket =new TNonblockingServerSocket(8899);
            THsHaServer.Args arg =new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4);
            PersonService.Processor<PersonServiceImpl> processor =new PersonService.Processor<>(new PersonServiceImpl());
            /**
             * 数据协议/格式
             * TBinaryProtocol  二进制格式
             * TCompactProtocol 压缩格式
             * TJSONProtocol    json格式
             * TSimpleJSONProtocol 提供json只写协议,生成的文件很容易通过脚本语言解析
             * TDebugProtocol 使用易懂的可读的文本格式,以便于debug
             */
            arg.protocolFactory(new TCompactProtocol.Factory());
            /**
             * 数据传输方式
             * TSocket  阻塞式socket
             * TFramedTransport 以frame为单位进行传输,非阻塞式服务中使用
             * TFileTransport   以文件形式进行传输
             * TMemoryTransport 将内存用于I/O,java实现时内部实际使用了简单的ByteArrayOutPutStream
             * TZliTransport  使用zlib进行压缩,与其它传输方式联合使用,当前无java实现
             */
            arg.transportFactory(new TFastFramedTransport.Factory());
            arg.processorFactory(new TProcessorFactory(processor));
    
            TServer server =new THsHaServer(arg);
            System.out.println("thrift  server started!");
            server.serve();
        }
    }
    
  3. 编写客户端
    public class ThriftClient {
    
        public static void main(String[] args) {
    
            TTransport transport = new TFastFramedTransport(new TSocket("localhost", 8899), 600);
            TProtocol protocol = new TCompactProtocol(transport);
            PersonService.Client client = new PersonService.Client(protocol);
    
            try {
                transport.open();
                Person person = client.getPersonByUserName("张三");
                System.out.println(person.getUserName());
    
                Person p =new Person();
                p.setUserName("李四");
                p.setAge(14);
                p.setMarried(true);
                client.savePerson(p);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                transport.close();
            }
    
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值