搜易贷RPC框架thrift-动手篇

Posted 狐狸金服研发中心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜易贷RPC框架thrift-动手篇相关的知识,希望对你有一定的参考价值。


动手了,动手了···,别紧张,我们都是文明的技术男,不会对产品美眉耍流氓的。

言归正传,从上篇介绍大家都知道了,thrift作为一个为其它编程语言服务的沟通工具,那它作为一个软件的一般规律来说,都会像微信一样有客户端和服务端之分的哈。同样道理,它肯定也有自己的协议,软件,文档,示例等等。Ok,先找它官网看看他们怎么说的(http://thrift.apache.org)。了解了一些原理,我们先下载一个软件,按照官方网站的提示,安装起来看看。比如我下载的是:http://apache.fayea.com/thrift/0.9.3/thrift-0.9.3.tar.gz

如果你网速比较慢,你顺便看看thrift的协议定义,我假设你已经看懂官网的英文了。

Thrift 脚本可定义的数据类型包括以下几种类型:

·       基本类型:

o     bool:布尔值,true 或 false,对应  Java 的 Boolean

o     byte:8 位有符号整数,对应 Java 的  byte

o     i16:16 位有符号整数,对应 Java 的 short

o     i32:32 位有符号整数,对应 Java 的 int

o     i64:64 位有符号整数,对应 Java 的 long

o     double:64 位浮点数,对应 Java 的  double

o     string:未知编码文本或二进制字符串,对应 Java 的 String

·       结构体类型:

o     struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean

·       容器类型:

o     list:对应 Java 的 ArrayList

o     set:对应 Java 的 HashSet

o     map:对应 Java 的 HashMap

·       异常类型:

o     exception:对应 Java 的 Exception

·       服务类型:service:对应服务的类


在Linux下的源码安装,直接wget或手动下载最tar.gz安装包编译安装:

tar -xvf thrift-0.9.3.tar.gz

cd thrift-0.9.3

./configure

make 

make install

使用命令thrift -version,显示Thriftversion 0.9.3 则表示安装成功。


安装好后,就可以试试身手了。

来看示例:

思路: 1.参照官网示例写一个hello.thrift,定义结构。

2.使用thrift工具生成你需要的语言的接口程序。

3.实现接口程序服务端,并暴露服务。

4.使用程序客户端调用服务端。



 

① 编写IDL文件helloService.thrift,如下:

/**

 * Hello world Testing

 * @author yangshengyuan@souyidai.com

 */

namespace java com.soeasy.thrift.demo

service HelloService {

    i32 sayInt(1:i32 param)

    string sayString(1:string param)

    bool sayBoolean(1:bool param)

    void sayVoid()

}


② 使用thrift编译器生成所需语言的代码:

thrift --gen java helloService.thrift

在当前目录下生成gen-java目录,里面生成了HelloService.java文件。

Thrift --genpy helloService.thrift 可以生成python相关代码。


③ 新建Java工程或maven工程,java工程引入ant生成的lib,maven工程pom.xml中引入依赖

<dependency>

      <groupId>org.apache.thrift</groupId>

       <artifactId>libthrift</artifactId>

      <version>0.9.3</version>

</dependency>

自动会将依赖的lib下载下来。


④ 编写HelloServiceImpl.java业务实现类. 需要实现HelloService.Iface接口,由thrift自动生成的代码

package com.soeasy.thrift.demo; 

import org.apache.thrift.TException;

public class HelloServiceImpl implements  HelloService.Iface{

    @Override

    public int sayInt(int param) throws  TException {

        System.out.println("say  int :" + param);

        return param;

    }

    @Override

    public String sayString(String param) throws  TException {

        System.out.println("say  string :" + param);

        return param;

    }

    @Override

    public boolean sayBoolean(boolean param)  throws TException {

        System.out.println("say boolean  :" + param);

        return param;

    }

    @Override

    public void sayVoid() throws TException {

        System.out.println("say  void ...");

    }

}

 

⑤ 编写thrift-java服务器端,监听端口8080

package com.soeasy.thrift.demo.server;

import org.apache.thrift.protocol.TBinaryProtocol;

import org.apache.thrift.protocol.TBinaryProtocol.Factory;

import org.apache.thrift.server.TServer;

import org.apache.thrift.server.TSimpleServer;

import org.apache.thrift.transport.TServerSocket;

import org.apache.thrift.transport.TTransportException;

import com.soeasy.thrift.demo.HelloService;

import com.soeasy.thrift.demo.HelloServiceImpl;

import com.soeasy.thrift.demo.HelloService.Processor;

/**

 * 启动thrift的java服务器端

 *

 * @author yangshengyuan@souyidai.com

 *

 */

public class HelloServiceServer {

   

    public static void main(String[] args) {

        try {

            // 设置服务器端口

            TServerSocket  serverTransport = new TServerSocket(8080);

            // 设置二进制协议工厂

            Factory  protocolFactory = new TBinaryProtocol.Factory();

            //处理器关联业务实现

             Processor<HelloService.Iface> processor = new  HelloService.Processor<HelloService.Iface>(new HelloServiceImpl());

            // 1. 使用单线程标准阻塞I/O模型

            TServer.Args  simpleArgs = new TServer.Args(serverTransport);

             simpleArgs.processor(processor);

             simpleArgs.protocolFactory(protocolFactory);

            TServer server =  new TSimpleServer(simpleArgs);

            // 2. 使用线程池服务模型

//             TThreadPoolServer.Args poolArgs = new  TThreadPoolServer.Args(serverTransport);

//             poolArgs.processor(processor);

//             poolArgs.protocolFactory(protocolFactory);

//            TServer  poolServer = new TThreadPoolServer(poolArgs);

//            poolServer.serve();

             System.out.println("开启thrift服务器,监听端口:8080");

            server.serve();

        } catch (TTransportException e)  {

             e.printStackTrace();

        }

    }

}

 

⑥ 编写thrift-java客户端,发出请求

package com.soeasy.thrift.demo.client;

import org.apache.thrift.TException;

import org.apache.thrift.protocol.TBinaryProtocol;

import org.apache.thrift.protocol.TProtocol;

import org.apache.thrift.transport.TSocket;

import org.apache.thrift.transport.TTransport;

import org.apache.thrift.transport.TTransportException;

import com.soeasy.thrift.demo.HelloService; 

/**

 * 调用thrift的java客户端

 *

 * @author david

 *

 */

public class HelloServiceClient {

       public static void main(String[]  args) {

        try {

            TTransport  transport = new TSocket("localhost", 8080);

            //  使用二进制协议

            TProtocol  protocol = new TBinaryProtocol(transport);

            // 使用的接口

             HelloService.Client client = new HelloService.Client(protocol);

            //打开socket

            transport.open();

             client.sayBoolean(true);

             client.sayString("Hello world");

             client.sayInt(20141111);

            client.sayVoid();

             transport.close();

        } catch (TTransportException e)  {

             e.printStackTrace();

        } catch (TException te) {

             te.printStackTrace();

        }

    }

}

以上编写完了server和client端代码,运行server开启监听。然后运行client就能够与server端进行rpc调用方式的通讯了。如果你想进一步封装净化,可以请教我们的大神wanghaomiao@souyidai.com


OK,既然有例子了,那就拿着例子开始各种玩耍吧。


和大家分享简单有效的俩策略:

动手三思式,一思why,二思what,三思how

动手三点式:who动手,where动手,when 动手


最后计算下自己的学习实践,资源利用时间,长期对比自己学习曲线,你就会变成男神哒!

如想成为牛逼的男神,敬请看下篇《thrift原理&性能》。



以上是关于搜易贷RPC框架thrift-动手篇的主要内容,如果未能解决你的问题,请参考以下文章

rpc服务框架thrift介绍

非死不可的RPC框架:thrift

RPC框架之Thrift

小白入门Thrift RPC框架

thrift rpc 框架的安装和使用

编程实践为了带你搞懂RPC,我们手写了一个RPC框架