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. 00_UML图形分类

    1.   描述对象 类图(Class Diagram) 包图(Package Diagram) 对象图(Object Diagram) 组件图(Component Diagram) 部署图(Deplo ...

  2. KTL 一个支持C++14编辑公式的K线技术工具平台 - 第四版,稳定支持Qt5编程,zqt5语法升级,MA函数提升性能1000%,更多公式算法的内置优化实现。

    K,K线,Candle蜡烛图. T,技术分析,工具平台 L,公式Language语言使用c++14,Lite小巧简易. 项目仓库:https://github.com/bbqz007/KTL 国内仓库 ...

  3. Oracle的用户权限和角色

    用户和权限 LOCK|UNLOCK创建用户时是否锁定,默认为锁定状态.锁定的用户无法正常的登录进行数据库操作. --给普通用户SCOTT解锁,同时把SCOTT用户的密码进行修改 --语法结构:ALTE ...

  4. Hadoop - MapReduce学习笔记(详细)

    第1章 MapReduce概述 定义:是一个分布式运算程序的编程框架 优缺点:易于编程.良好的扩展性.高容错性.适合PB级以上数据的离线处理 核心思想:MapReduce 编程模型只能包含一个Map ...

  5. 教程1--安装Git软件

    在https://git-scm.com/下载git for windows,双击安装即可. (1)单击Next (2)选择安装目录 (3)勾选创建桌面快捷方式.Git Bash.Git GUi.已经 ...

  6. docker入门-docker应用场景和优势

    一.什么是docker Docker是一个使用 Go 语言开发的,并且开源的应用容器引擎,基于LXC(Linux Container)内核虚拟化技术实现,提供一系列更强的功能,比如镜像.Dockerf ...

  7. MaRVIN

    [ResourceRegistration] 加给Resource类 [ResourceReference(--)] 加给Resource类中引动到的Resource类,引用多个的话用IReferen ...

  8. [USACO20FEB]Equilateral Triangles P 题解

    优雅的暴力. 设三个点为 \((i,j,k)\),则有 \(6\) 个未知数即 \(x_i,x_j,x_k,y_i,y_j,y_k\).又因为有 \(2\) 条关于这 \(6\) 个未知数的方程 \( ...

  9. HarmonyOS小白入门设备开发的“芯”路历程

    HarmonyOS Connect设备开发,相信不少刚入门的开发者都被这些问题所困扰,面对五花八门的开发板不知道该怎么选取?芯片.模组.开发板傻傻分不清?如何使用代码控制开发板? 本期,我们将一一为你 ...

  10. 如何使用 Hexo 搭建个人博客

    原文链接 什么是 Hexo ? Hexo 是一个简单快速的静态博客框架,可以通过编辑 Markdown 文档生成好看的静态博客. 搭建 Hexo 要求 安装 Hexo 十分简单,只需要 Node.js ...