搜易贷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-动手篇的主要内容,如果未能解决你的问题,请参考以下文章