正井猫

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

rpc之thrift

一.介绍

  thrift是一个rpc(remove procedure call)框架,可以实现不同的语言(java、c++、js、python、ruby、c#等)之间的相互调用。是知名的社交网络公司facebook贡献出来,现有apache基金会负责维护的高效的rpc框架。是一种典型的C/S架构模式,我们可以定义一个IDL(Interface Definetion Language)文件,然后通过该文件可以生成对应语言的代码,然后在各语言之间就如同调用本地方法一样,相信之前有做过protobuf或者grpc开发的朋友对这种模式非常的熟悉,当然这种模式是几乎笔者所熟悉的所有的rpc框架都采用的方式。thrift非常使用于大型的且并发量很高的应用,至少在笔者曾经就职的公司的项目上没有出现过任何的性能瓶颈。

二.IDL文件的介绍以及编写

  在使用thrift的时候,最关键的部分就是编写IDL文件,首先需要给大家介绍的是thrift的数据类型: 

bool    布尔类型
byte    字节
i16     短整型
i32     整型
i64     长整型
double  浮点型
string  字符串

     IDL文件定义:

namespace java com.test.netty.lesson9

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

//定义结构
struct Person {
    1: optional String name;
    2: optional int age;
    3: optional boolean isMarried;
}

//定义异常
exception DataException {
    1: optional String message;
    2: optional String callStack;
    3: optional String date;
}

//定义服务
service PersonService {
    Person getPersonByName(1: required String name) throws (1: DataException dataException);
    void savePerson(1: required Person person) throws (1: DataException dataException);
}

三. 根据Idl文件生成对应代码的文件

   首先需要下载thrift,读者可以到官网查找对应系统的安装文件,然后再配置环境变量,windows下非常的简单,只需要将下载好的thrift.exe文件加入到path下就可以了。

   在命令行下执行命令:thrift  --gen java test.thrift 

                    

四.测试代码的编写

4.1 服务端代码

public class ThriftServer {
    public static void main(String[] args) throws TTransportException {
        
        TNonblockingServerSocket socket = new TNonblockingServerSocket(8999);
        
        THsHaServer.Args arg = new THsHaServer.Args(socket).maxWorkerThreads(4).minWorkerThreads(2);
        
        PersonService.Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl());
        
        arg.protocolFactory(new TCompactProtocol.Factory());
        arg.transportFactory(new TFramedTransport.Factory());
        arg.processorFactory(new TProcessorFactory(processor));
        
        TServer server = new THsHaServer(arg);
        
        System.out.println("server begin started...");
        
        server.serve();
    }
}

4.2 客户端代码编写

public class ThriftClient {
    public static void main(String[] args) {
        TTransport transport = new TFramedTransport(new TSocket("localhost", 8999), 600);
        
        TProtocol protocol = new TCompactProtocol(transport);
        
        PersonService.Client client = new PersonService.Client(protocol);
        
        try {
            transport.open();
            Person person = client.getPersonByName("王五");
            System.out.println(person.getAge() + ";;" + person.getName() + ";;" + person.isIsMarried());
            
            Person p = new Person();
            p.setAge(56);
            p.setName("田七");
            p.setIsMarried(false);
            
            client.savePerson(p);
            
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            transport.close();
        } 
    }
}

 

posted on 2017-10-31 14:10  正井猫  阅读(648)  评论(0编辑  收藏  举报