RPC - apache thrift

使用:

先在官网下载对应的编译器,然后在项目里配置好依赖

之后我们就可以编写我们的idl文件了

namespace java thrift.generated

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)
}

之后我们就用我们的下载的编译器来根据我们的idl文件来编译

我们只需要使用  thrift-0.12.0.exe Java  + 文件名 就可以使用了。

最后生成了我们idl文件里对应的信息

之后我们就可以编写我们的客户端和服务器端来实现远程过程通信了。

注意,服务端的接口工作内容由我们自己实现

public class PersonServiceImpl implements PersonService.Iface {

    @Override
    public Person getPersonByUsername(String username) throws DataException, TException {

        System.out.println("get client param: " + username);
        Person person = new Person().setAge(18).setUsername("zhangsan").setMarried(true);
        return person;
    }

    @Override
    public void savePerson(Person person) throws DataException, TException {
        System.out.println("get client param: ");
        System.out.println(person.getAge());
        System.out.println(person.getUsername());
        System.out.println(person.isMarried());
    }

}

 

服务端:

public class ThriftServer {

    public static void main(String[] args) throws Exception {
        TNonblockingServerSocket socket = new TNonblockingServerSocket(8080);
        THsHaServer.Args ags = new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4);
        PersonService.Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl());

        ags.protocolFactory(new TCompactProtocol.Factory());
        ags.transportFactory(new TFramedTransport.Factory());
        ags.processorFactory(new TProcessorFactory(processor));

        TServer server = new THsHaServer(ags);

        System.out.println("server started...");

        server.serve();

    }
}

 

客户端:

 
public class ThriftClient {

    public static void main(String[] args) {
        TTransport transport = new TFramedTransport(new TSocket("localhost", 8080), 600);
        TProtocol protocol = new TCompactProtocol(transport);
        PersonService.Client client = new PersonService.Client(protocol);

        try {
            transport.open();
            Person person = client.getPersonByUsername("zhangsan");
            System.out.println(person.getUsername());
            System.out.println(person.getAge());
            System.out.println(person.isMarried());

            System.out.println("----------");

            Person newPerson = new Person().setAge(20).setUsername("lisi").setMarried(false);
            client.savePerson(newPerson);


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            transport.close();
        }

    }
}

之后启动服务端, 客户端就可以实现通讯了。

 

原理:

官网的指南

1. 先下载Apache thrift

2. 如果是Linux环境要编译,安装  

./configure && make

3.编写一个 .thrift的文件

这个文件定义了thrift的类型和服务信息,这些服务由服务器端实现,由客户端来调用

4.之后使用命令就可以了

 

服务器端:

1. 服务器端要设置一个socket来绑定端口

socket有两种,阻塞式的和非阻塞式的

TServerSocket, TNonblockingServerSocket

他们都是   TServerTransport  的子类

2.创建好socket之后我们就可以创建服务器来使用这个socket了

服务器也有很多种,上面我们使用的是  THsHaServer

这是一个基于frame(块)传输信息的

3. 之后就是一些服务器的参数设置了,比如线程数,传输的协议,以及我们要处理的服务实现等等信息,设置好了之后就可以启动了。

 

客户端:

客户端也是指定了要连接的服务器的ip,端口号之后就可以启动了。

之后就会像调用本地方法一样来调用远程的接口来返回结果了。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值