文档章节

thrift详解

卢禹
 卢禹
发布于 2016/09/27 15:18
字数 1362
阅读 229
收藏 2

背景

thrift最早由facebook开发,后来贡献给了apache。thrift主要解决跨语言调用的问题。

thrift和protobuf有啥区别?

thrift和protobuf,都解决了一个问题就是夸语言数据结构的定义,json也解决了跨语言的数据结构定义,只不过json都是字符串的,传输的开销和解析的开销可能有些大。那么想传输二进制的话怎么办呢,可以自己定义数据结构,比如大家熟知的网络协议就是这么定出来的,前1个字节代表啥啥啥,第二个字节代表啥啥啥,然后客户端和服务端都遵守这个协议。在没有thrift或者profobuf之前好多cs程序就是这么干的。但是这么干很累啊,还得写文档,而且开发时候也不好记,不好交流。后来人们想出了个办法,就是用一个类似json格式的文件定义数据结构,然后自动生成代码去处理二进制的转换,这样人们既可以用好读的格式定义数据结构,又可以高效的使用,于是就诞生了protobuf和thrift这类东西。protobuf到此为止了,thrift又把服务端程序和客户端程序也顺手加进去可以自动生成了,这样程序员就只负责写业务逻辑,其他的传输啊神马的都自动生成了,这就是protobuf和thrift的区别。这样thrift就有了全套的RPC机制,

为什么要跨语言调用?

有人认为是团队需要,不同的人擅长不同的语言,我认为从架构的角度想,有2点好处

  1. 用适合的语言做适合的事情,比如一些复杂算法的部分,c语言比较合适,性能高冗余的事情干的少,PHP的话可能性能就慢很多,这时候可以考虑跨语言调用
  2. 对于大型项目的团队间的解耦,在大公司中可能不同的功能并不是一个组完成的,可能会跨组甚至跨部门,这时候把一个功能以服务的形势对其他部门提供,是一种比较好的方式。

为什么不直接用HTTP json交互多方便?

是的,可以用json,好多api都是用json形式的,现在也流行REST,其实也是蛮方便的,但是有几个缺点

  1. 不管用什么语言吧,都得有个http服务,java和php还好,像c这种就有点费劲。
  2. json很灵活,也好改,但是需要有良好的文档,自己用非常好,大团队可能会有些沟通上的问题,起码文档要写清楚json各个字段含义,值可能有哪些类型,不然你就给人家一个url说这个就是xxx的api,人家对接如果没文档基本是不可能接的了的。
  3. 鉴权和验签问题,之前做网站的get请求可以不考虑调用者的身份问题,因为反正给人家看的嘛,谁看不一样。但是作为api的时候特别是涉及增删改的时候,调用者的身份问题就得考虑了,不能谁都能调啊,所以一般http的api都要设计个签名规则,对接的人得按照你的验签规则去写程序,通常这是对接时候比较耗时和容易出问题的地方。 1.从传输量大小上,不如二进制省空间,对于

安装

thrift的安装分两部分

  1. 是thrift本身
  2. 是语言包

安装thrift 编译器

这个其实没必要编译安装的,直接下载windows版的就行。 在linux上编译安装也还比较好装,但是可能会缺这缺那,缺啥用yum装即可

./configure
make
make install

安装语言lib

语言包都在源码的lib目录下,所以下载linux版本才有,windows版本那个只是个编译好的thrift编译器

比如java

cd thrift源码/lib/java
ant
会生成libthrift-0.9.3.jar

再比如python

cd thrift源码/lib/py
python setup.py install

使用步骤:

  1. 准备:thrift编译器,服务端、客户端语言的lib
  2. 写thrift文件
service HelloService{
    string sayHello(1:string username)
}

然后用thrift编译:

  • thrift.exe -r -gen java hello.thrift
  • thrift.exe -r -gen php hello.thrift
  • thrift.exe -r -gen py hello.thrift 要啥语言就生成啥
  1. 写实现
import org.apache.thrift.TException;

    public class helloImp implements HelloService.Iface {

        @Override
        public String sayHello(String username) throws TException {
            System.out.println(username);
            return username;
        }

    }

这里这个HelloService就是thrift生成的java文件 3. 写服务端

    import org.apache.thrift.TProcessor;
    import org.apache.thrift.protocol.TBinaryProtocol;
    import org.apache.thrift.server.TServer;
    import org.apache.thrift.server.TSimpleServer;
    import org.apache.thrift.transport.TServerSocket;
    import org.apache.thrift.transport.TTransportException;

    public class Server  {
        
        public void start()
        {
            TProcessor tpProcessor = new HelloService.Processor<HelloService.Iface>(new helloImp());
            TServerSocket serverTransport;
            try {
                serverTransport = new TServerSocket(8889);
                TServer.Args args = new TServer.Args(serverTransport);
                args.processor(tpProcessor);
                args.protocolFactory(new TBinaryProtocol.Factory());
                TServer server = new TSimpleServer(args);
                System.out.println("thrift server start");
                server.serve();
                
            } catch (TTransportException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
         
        }
        
        public static void main(String[] args) {
            Server server = new Server();
            server.start();
        }

    }

4.写客户端 以python为列子

import sys
import glob

from hello import HelloService

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol

# Make socket
transport = TSocket.TSocket('localhost', 8889)

# Buffering is critical. Raw sockets are very slow
transport = TTransport.TBufferedTransport(transport)

# Wrap in a protocol
protocol = TBinaryProtocol.TBinaryProtocol(transport)

# Create a client to use the protocol encoder
client = HelloService.Client(protocol)

# Connect!
transport.open()


rs = client.sayHello('luyu')

print rs

其他语言版本怎么写????

在源码的tutorial目录下有各种语言的例子

持续更新 未完待续...

© 著作权归作者所有

共有 人打赏支持
卢禹

卢禹

粉丝 21
博文 14
码字总数 8852
作品 2
朝阳
程序员
私信 提问
跨语言RPC框架Thrift详解

Thrift的传输格式(协议层) Thrift之所以被称为一种高效的RPC框架,其中一个重要的原因就是它提供了高效的数据传输。 以下是Thrift的传输格式种类: TBinaryProtocol: 二进制格式。效率显然...

dragon_tech
01/07
0
0
Thrift入门初探--thrift安装及java入门实例

  公司的一些平台服务框架底层封装了thrift提供服务,最近项目不是很紧,于是研究了一下,刚刚入门,理解得不深,写这篇博文来整理一下思路. 什么是thrift?   简单来说,是Facebook公布的一款开...

冬至饮雪
2017/02/21
0
0
golang: Baa框架文章列表

database: mongodb服务启动脚本 golang: Baa框架中的依赖注入(DI)是个什么鬼? golang go get出现unrecognized import path 微服务实践 - golang Thrift 开发一个月的感受 Algorithm: 移动...

d_watson
2016/06/13
33
0
架构设计:系统间通信(12)——RPC实例Apache Thrift 中篇

(接上文《架构设计:系统间通信(11)——RPC实例Apache Thrift 上篇》) 3、Aapche Thrift详解 在《架构设计:系统间通信(10)——RPC的基本概念》一文中,我专门介绍了一款RPC规范的具体...

引鸩怼孑
2016/01/29
38
0
elastic stack 基础组件beats详解

elastic stack 基础组件beats详解 fielbeat filebeat:spool_size: 1024 # 最大可以攒够 1024 条数据一起发送出去idle_timeout: "5s" # 否则每5 秒钟也得发送一次registry_file: ".filebeat" ......

collglle_cx
2017/05/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux iptables之mangle表使用案例

mangle表的用途 mangle表的主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。 mangel表使用示例 示例1-策略路由1 内网的客户机通...

月下狼
33分钟前
2
0
OSChina 周日乱弹 —— 兼职我想去学学布偶戏

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @clouddyy : 《火炎 - 女王蜂》 《火炎 - 女王蜂》 手机党少年们想听歌,请使劲儿戳(这里) @小鱼丁 :还在睡觉突然接到一个小哥哥电话“x...

小小编辑
46分钟前
42
3
租房软件隐私保护如同虚设

近日,苏州市民赵先生向江苏新闻广播新闻热线025-84658888反映,他在“安居客”手机应用软件上浏览二手房信息,并且使用该软件自动生成的虚拟号码向当地一家中介公司进行咨询。可电话刚挂不久...

linux-tao
今天
3
0
分布式项目(五)iot-pgsql

书接上回,在Mapping server中,我们已经把数据都整理好了,现在利用postgresql存储历史数据。 iot-pgsql 构建iot-pgsql模块,这里我们写数据库为了性能考虑不在使用mybatis,换成spring jd...

lelinked
今天
6
0
一文分析java基础面试题中易出错考点

前言 这篇文章主要针对的是笔试题中出现的通过查看代码执行结果选择正确答案题材。 正式进入题目内容: 1、(单选题)下面代码的输出结果是什么? public class Base { private Strin...

一看就喷亏的小猿
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部