wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar xvf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure --prefix=/usr
make
sudo make install
cd ..
更新automake
automake --version //查看设备automake版本,版本高则可忽略更新
wget http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz
tar xvf automake-1.14.tar.gz
cd automake-1.14
./configure --prefix=/usr
make
sudo make install
cd ..
更新bison
bison --version //查看设备bison版本,版本高则可忽略更新
wget http://ftp.gnu.org/gnu/bison/bison-2.5.1.tar.gz
tar xvf bison-2.5.1.tar.gz
cd bison-2.5.1
./configure --prefix=/usr
make
sudo make install
cd ..
问题:出现error while loading shared libraries: libthrift.so: cannot open shared object file: No such file错误。
原因:链接器ld提示找不到库文件,ld默认的目录是/lib和/usr/lib,如果放在其他路径也可以,需要让ld知道库文件所在的路径。
解决方法:
# vim /etc/ld.so.conf //在新的一行中加入库文件所在目录
/usr/lib
# ldconfig //更新/etc/ld.so.cache文件
thrift是什么
thrift主要用于各个服务之间的RPC通信,支持跨语言。thrift是一个典型的CS结构,客户端和服务端可以使用不同的语言开发,thrift通过IDL(Interface Description Language)来关联客户端和服务端。thrift的整体架构图如下图所示 图中Your Code是用户实现的业务逻辑,接下来的FooService.Client和Foo.write()/read()是thrift根据IDL生成的客户端和服务端的代码,对应于RPC中Client stub和Server stub。TProtocol 用来对数据进行序列化与反序列化,具体方法包括二进制,JSON 或者 Apache Thrift 定义的格式。TTransport 提供数据传输功能,使用 Apache Thrift 可以方便地定义一个服务并选择不同的传输协议。 如下图所示为thrift的网络栈结构 thirft使用socket进行数据传输,数据以特定的格式发送,接收方进行解析。我们定义好thrift的IDL文件后,就可以使用thrift的编译器来生成双方语言的接口、model,在生成的model以及接口代码中会有解码编码的代码。
TTransport层
代表thrift的数据传输方式,thrift定义了如下几种常用数据传输方式
TSocket
: 阻塞式socket;TFramedTransport
: 以frame为单位进行传输,非阻塞式服务中使用;TFileTransport
: 以文件形式进行传输;TProtocol层
代表thrift客户端和服务端之间传输数据的协议,通俗来讲就是客户端和服务端之间传输数据的格式(例如json等),thrift定义了如下几种常见的格式
TBinaryProtocol
: 二进制格式;TCompactProtocol
: 压缩格式;TJSONProtocol
: JSON格式;TSimpleJSONProtocol
: 提供只写的JSON协议;thrift支持的Server模型
thrift主要支持以下几种服务模型
TSimpleServer
: 简单的单线程服务模型,常用于测试;TThreadPoolServer
: 多线程服务模型,使用标准的阻塞式IO;TNonBlockingServer
: 多线程服务模型,使用非阻塞式IO(需要使用- TFramedTransport数据传输方式);THsHaServer
: THsHa引入了线程池去处理,其模型读写任务放到线程池去处理,Half-sync/Half-async处理模式,Half-async是在处理IO事件上(accept/read/write io),Half-sync用于handler对rpc的同步处理;thrift IDL文件
thrift IDL不支持无符号的数据类型,因为很多编程语言中不存在无符号类型,thrift支持一下几种基本的数据类型
byte
: 有符号字节i16
: 16位有符号整数i32
: 32位有符号整数i64
: 63位有符号整数double
: 64位浮点数string
: 字符串此外thrift还支持以下容器类型:
list
: 一系列由T类型的数据组成的有序列表,元素可以重复;set
: 一系列由T类型的数据组成的无序集合,元素不可重复;map
: 一个字典结构,Key为K类型,Value为V类型,相当于java中的HashMap;thrift容器中元素的类型可以是除了service之外的任何类型,包括exception
thirft支持
struct
类型,目的就是讲一些数据聚合在一起,方便传输管理,struct定义形式如下:thrift支持
枚举
类型,定义形式如下:thrift支持自定义异常类型exception,异常定义形式如下:
thrift定义服务相当于Java中创建接口一样,创建的service经过代码生thrift代码生成工具编译后就会生成客户端和服务端的框架代码,service的定义形式如下:
thrift支持给类型定义别名,如下所示:
thrift也支持常量的定义,使用
const
关键字:thrift支持命名空间,命名空间相当于Java中的package,主要用于组织代码,thrift使用关键字namespace定义命名空间,格式是
namespace 语言名 路径
,如下示例所示:thrift也支持文件包含,相当于CPP中的
include
,Java中的import
,使用关键字include
:#
、//
、/**/
都可以作为thrift文件中的注释。thrift提供两个关键字
required
和optional
,分别用于表示对应的字段是必填的还是可选的(推荐尽量使用optional),如下所示:原文参考:[thrift] thrift基本原理及使用
thrift优点
Thrift一些已经明确的优点包括:
安装thrift
安装设备: 172.24.1.89 和172.24.1.110
安装环境:
autoconf
>= 2.69automake
>= 1.13bison
>= 2.5.1boost
>= 1.53安装过程:
boost比较大,建议直接到89上/home/threepart/上拿1.59版压缩文件。
也可以安装别的版本,两台设备上都是装的0.12.0版本
参考文章:Apache thrift官方安装文档
两台设备之间进行通信并抓包
1.定义idl文件acsuser.thrift,用来生成初始的服务器端框架
2.生成c++代码框架
执行完这个命令可以看到生成了gen-cpp文件夹,这就是我们的框架。里面的文件有:
3.修改
UserService_server.skeleton.cpp
注意这段代码使用TCompactProtocol,需要#include
另外这个是Blocking的多线程服务器
4.生成客户端文件
UserClient.cpp
5.生成Makefile
注:两台设备上都安装了服务端和客户端
6.在172.24.1.89上启动server
7.在172.24.1.110上测试client
8.抓取报文
这样就抓到了报文可以进行分析了。
遇到的问题及解决方法