1 前言

thrift的官方文档比较差,很多细节没有介绍清楚,比如require、optional和default字段的区别是什么,为什么字段前面要写序号等,带着这些疑问,我们需要阅读生成的源码来了解具体细节。另外thrift的非官方文档可以参考这篇:http://diwakergupta.github.io/thrift-missing-guide

2 network stack

thrif的网络栈在官网已经介绍的比较清楚了,分为4层,从下往上依次是:

  1. Transport。提供网络IO的简单抽象
  2. Protocol。用于编解码,将底层的字节编码成二进制、JSON等;Protocol层用于对模式编码以及负责序列化
  3. Processor。封装了从Protocol读写的功能,可以理解为用户的业务逻辑所在地
  4. Server。代码一个服务端,将Transport、Protocol、Processor整合起来,等待请求到来并处理

3 简单使用

3.1 thrift安装

thrift的安装按照官网的教程或者网上其他教程来就行了,这里安装的是thrift的0.8.0版本, 安装完后可以使用命令查看安装的thrift版本

thrift -version

3.2 编写IDL

创建文件mythrift.thrift,在里面编写如下内容

namespace java com.learn.learnthrift

 struct Stu {
1:i32 name = 13
2:required i32 age
3:optional i32 height = 23
} struct Teacher {
1:string name = "13"
2:required string age = "14"
3:optional string height = "15"
} service MyService {
void printStu(1:Stu stu, 2:Teacher teacher)
void printStu2(1:Stu stu, 2:Teacher teacher)
}

3.3 生成java代码

运行命令,生成java代码,然后将生成的代码拷贝进项目即可使用,其中mythrift.thrift就是刚才我们编写的IDL文件。运行命令后会在mythrift.thrift所在的目录生成gen-javabean文件夹,其内容就是我们生成java文件

thrift --gen java:beans mythrift.thrift

生成的文件如下:

3.4 编写代码

将生成的代码copy到项目中,其中红框框起来的是thrift生成的文件,其他的是需要我们编写的代码

另外需要我们在pom.xml中加入thrift的依赖

<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.8.0</version>
</dependency>

DemoClient.java

public class DemoClient {
public static void main(String[] args) throws Exception{
// 创建Transport
TTransport transport = new TSocket("localhost", 9090, 5000);
//创建protocol
TProtocol protocol = new TBinaryProtocol(transport); //创建客户端
MyService.Client client = new MyService.Client(protocol);
transport.open(); Stu stu = new Stu();
stu.setAge(23); Teacher teacher = new Teacher("jack", "32");
client.printStu(stu, teacher); transport.close();
}
}

DemoServer.java

public class DemoServer {
public static void main(String[] args) throws Exception{
// 创建processor
TProcessor tProcessor = new MyService.Processor<MyService.Iface>(new MyServiceImpl());
//创建protocol
TProtocolFactory tProtocolFactory = new TBinaryProtocol.Factory(); // 创建transport, TServerSocket继承自TTransport
TServerSocket tServerSocket = new TServerSocket(9090);
//创建server参数
TServer.Args tArgs = new TServer.Args(tServerSocket);
tArgs.processor(tProcessor);
tArgs.protocolFactory(tProtocolFactory); // 创建TServer
TServer tServer = new TSimpleServer(tArgs);
tServer.serve();
}
}

MyServiceImpl.java

public class MyServiceImpl implements MyService.Iface {
@Override
public void printStu(Stu stu, Teacher teacher) throws TException {
System.out.println(stu);
System.out.println("name:" + stu.getName());
System.out.println("age:" + stu.getAge());
System.out.println("height:" + stu.getHeight()); System.out.println("nameset: " + stu.isSetName());
System.out.println("ageset: " + stu.isSetAge());
System.out.println("height: " + stu.isSetHeight());
} @Override
public void printStu2(Stu stu, Teacher teacher) throws TException {
System.out.println("printStu2 : " + stu);
}
}

然后分别运行DemoServer和DemoClient就可以了,这就是简单的RPC通信

4 源码阅读

thrift源码分析

thrift使用和源码分析的更多相关文章

  1. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

  2. Android Debuggerd 简要介绍和源码分析(转载)

    转载: http://dylangao.com/2014/05/16/android-debuggerd-%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D%E5%92%8C%E ...

  3. Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析

    相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...

  4. Kubernetes Job Controller 原理和源码分析(一)

    概述什么是 JobJob 入门示例Job 的 specPod Template并发问题其他属性 概述 Job 是主要的 Kubernetes 原生 Workload 资源之一,是在 Kubernete ...

  5. Kubernetes Job Controller 原理和源码分析(二)

    概述程序入口Job controller 的创建Controller 对象NewController()podControlEventHandlerJob AddFunc DeleteFuncJob ...

  6. Kubernetes Job Controller 原理和源码分析(三)

    概述Job controller 的启动processNextWorkItem()核心调谐逻辑入口 - syncJob()Pod 数量管理 - manageJob()小结 概述 源码版本:kubern ...

  7. jQuery静态方法globalEval使用和源码分析

    Eval函数大家都很熟悉,但是globalEval方法却很少使用,大多数参考手册也没有相关api,下面就对其用法和源码相应介绍: jQuery.globalEval()函数用于全局性地执行一段Java ...

  8. Android开发学习之路-LruCache使用和源码分析

    LruCache的Lru指的是LeastRecentlyUsed,也就是近期最少使用算法.也就是说,当我们进行缓存的时候,如果缓存满了,会先淘汰使用的最少的缓存对象. 为什么要用LruCache?其实 ...

  9. jQuery静态方法inArray,grep,merge,makeArray方法使用和源码分析

    inArray方法 确定第一个参数在数组中的位置,从0开始计数(如果没有找到则返回 -1 ). 示例: var arr = [ 4, "Pete", 8, "John&q ...

随机推荐

  1. 异常篇—— VEH 与 SEH

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  2. 面试题(造火箭必备技能):请举例一个最有成就感的性能bug

    当前,绝大部分招聘都有性能要求或者把其作为加分项(会性能优先),哪怕你不是面试的性能,面试的时候可能会问性能,所以大家才会有"面试造火箭,进去拧螺丝"的共鸣.至于企业为什么重视性能 ...

  3. CVE-2021-40449 NtGdiResetDC UAF

    背景   CVE-2021-40449是一个存在于Win32k内核驱动中的UAF漏洞.该漏洞在2021年八月下旬九月上旬被Kaspersky发现用于野外攻击活动中.通过Hook win32k驱动执行N ...

  4. 【C# 线程】 volatile 关键字和Volatile类、Thread.VolatileRead|Thread.VolatileWrite 详细 完整

    overview 同步基元分为用户模式和内核模式 用户模式:Iterlocked.Exchange(互锁).SpinLocked(自旋锁).易变构造(volatile关键字.volatile类.Thr ...

  5. 【windows 操作系统】线程句柄HANDLE与线程ID的关系

    什么是句柄 句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访 ...

  6. 【windows 访问控制】二、安全描述符(Security Descriptors,SD)

    安全描述符(Security Descriptors,SD) 定义 安全描述符是与安全对象的安全信息,它含有这个对象所有者的SID,以及一个访问控制列表(ACL,Access Control List ...

  7. 无法将具有语句体的lambda表达式转换为表达式树

    很早就碰到了这个问题,当时也没有深入的研究,趁着空闲,遂把这个问题研究清楚. (一)普通案例 下面从一个普通的案例入手,下面准备两个List集合,都是放在内存里面的(需要模拟到远端执行的时候,我们是通 ...

  8. [炼丹术]DeepLabv3+训练模型学习总结

    DeepLabv3+训练模型学习总结 一.DeepLabs3+介绍 DeepLabv3是一种语义分割架构,它在DeepLabv2的基础上进行了一些修改.为了处理在多个尺度上分割对象的问题,设计了在级联 ...

  9. Python自动化 unittest生成测试报告(HTMLTestRunner)03

    批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的. unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTest ...

  10. awk讲义-1-快速入门

    awk讲义-1-快速入门 一.目标问题: 1.统计各个省份中城市的数量(一维数组) 2.统计城市中区县数量,要求输出格式:省份 城市 区县数量(二维数组) 3.求两个文件的交集 4.省市和市区两个文件 ...