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. for循环中i++和++i 的区别(转载)

    ++i是先执行i=i+1再使用i的值,而i++是先使用i的值再执行i=i+1: for循环的执行顺序是这样的: for(a;b;c){ d; } 进入for循环,首先执行起始语句a,然后判断语句b是否 ...

  2. Spring5框架学习笔记(详细)

    目录 01 Spring框架概述 02 IOC容器 IOC概念和原理 IOC BeanFactory接口 IOC操作 Bean管理(概念) IOC操作 Bean管理(基于xml方式) IOC操作 Be ...

  3. Java基础--序列化和反序列化

    作用:在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Sessi ...

  4. Git如何使用,操作流程

    官方示例 git config --global user.name "sanqianll" git config --global user.email "224001 ...

  5. python 镜像仓库获取最新版本号

    #/bin/python# -*- coding: utf-8 -*-import requestsfrom urllib import parsefrom requests.auth import ...

  6. 千万级 PV是什么意思?

    首先介绍下pv的概念: PV(访问量):即Page View,页面刷新一次算一次. UV(独立访客):即Unique Visitor,00:00-24:00内相同的客户端只被计算一次. IP(独立IP ...

  7. C#实现抢红包算法

    二倍均值法(公平版) 发出一个固定金额的红包,由若干个人来抢,需要满足哪些规则? 1.所有人抢到金额之和等于红包金额,不能超过,也不能少于. 2.每个人至少抢到一分钱. 3.要保证所有人抢到金额的几率 ...

  8. springCould注解和配置以及pom依赖

    SpringCloud注解和配置以及pom依赖说明 在本文中说明了pom依赖可以支持什么功能,以及支持什么注解,引入该依赖可以在application.properties中添加什么配置. 1.Spr ...

  9. jq全选、全不选、反选、单删、批量删除

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  10. 2.5 C++STL stack详解

    文章目录 2.5.1引入 2.5.2 代码示例 2.5.3 代码运行结果 总结 2.5.1引入 stack是一种"先进后出"的容器. 不过值得注意的是stack是一种关联容器,是通 ...