使用thrift进行RPC通信(附c程序示例)

news/2024/12/22 10:26:08/

前言

为了实现不同语言的程序跨进程、跨主机通信,一般可以采用mq或rpc框架来实现。
对于异步通知的场景可以使用mq,如zeroMQ。
zeroMq

但对于某些实时性较强且同步的应用场景,使用成熟的rpc框架来实现也是一种比较更好的选择。

开源的rpc框架有很多,其中跨语言的rpc框架以使用google公司采用protobuf协议的grpc框架,和facebook公司的thrift框架最为知名。
grpc
thrift

thrift与grpc对比

关于这两个框架详细信息的对比文章有许多,此处省略5000字……

这里仅从语言支持度来进行对比一下:

grpcthrift
C#、NET、C++、Dart、Go、Java、Kotlin、Node、Objective-C、PHP、Python、RubyC (glib)、C++、C#、Cocoa、Common LISP、D、Dart、.NET、Erlang、Haxe、Go、Java、JavaScript、Lua、Node.js、OCaml、Perl、PHP、Python、Ruby、Rust、Smalltalk、Swift

从支持的语言方面来看,thrift官方支持的语言类型则更丰富一些。

如需要C程序和其他语言进行通信,则可以更加倾向于使用thrift框架。(尽管grpc官方没有对c的支持,但实际使用中有对应的解决方案,网上相关的资料也较多。以go版本的onos为例,可以在它的onos-e2-sm项目中看到c与go程序的调用示例代码。)

本文中主要介绍c程序使用thrift的主要步骤。

thrift使用步骤

thrift的使用步骤一般分为以下3个步骤:

  1. 定义thrift接口描述文件
  2. 生成对应语言的接口代码
  3. 将生成的代码整合到项目中
    thrift-useage
    整体来看还是比较简单的,官方示例也比较多。

thrift-c程序环境安装

需要特殊说明的是,由于c程序和go、java程序相比由于没有包管理器,且处于系统的较底层,安装方式上看也稍微复杂一些。
使用前需要先将thrift的c依赖包在系统中进行安装,否则可能无法编译。
具体安装方式也可支持参考thrift官网的安装说明:
centos下安装thrift
ubuntu下安装thrift

这里以centos为例,主要的操作步骤如下:

基础依赖安装

yum install autoconf automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel

glib安装,以支持生成及编译thrift的c依赖库

yum install glib*

下载thrift源码

git clone --branch 0.18.1 https://github.com/apache/thrift.git

开始准备编译依赖库

#切换到thrift源码根目录
cd thrift
#生成配置文件
./bootstrap.sh
#执行配置
./configure --prefix=/usr/local/

./configure阶段会输出支持的thrift语言,片段如下:

thrift 0.18.1Building C (GLib) Library .... : yes
Building C++ Library ......... : no
Building Common Lisp Library.. : no
Building D Library ........... : no
Building Dart Library ........ : no
Building .NET Standard Library : no
Building Erlang Library ...... : no
Building Go Library .......... : yes
Building Haxe Library ........ : no
Building Java Library ........ : no
Building Kotlin Library ...... : no
Building Lua Library ......... : no
Building NodeJS Library ...... : no
Building Perl Library ........ : no
Building PHP Library ......... : no
Building Python Library ...... : yes
Building Py3 Library ......... : no
Building Ruby Library ........ : no
Building Rust Library ........ : no
Building Swift Library ....... : no

如果要编译的语言右边显示为no,则说明当前系统缺少对应的依赖项,将无法完成所选语言依赖库的安装。
以C (Glib)Library为例如果显示为no,则可能是缺少glib依赖,需要先在系统中安装好glib后再执行。

如果想要不安装某个语言的库,可以在configure后面跟上 –without-[语言] 屏蔽某语言库的安装。
如要屏蔽perl、nodejs、cpp的依赖库,则命令如下:

./configure --prefix=/usr/local/ --without-perl --without-nodejs --without-cpp

执行make编译thrift及依赖库

sudo make

thrift的编译过程较长,稍等个几分钟左右就能编译好了。

示例程序运行

在编译完thrift的源码后,如果没有报错会在thrift的 /tutorial/c_glib下将demo的client和server程序编译出来,生成tutorial_clienttutorial_server可执行文件。

可以先后执行tutorial_servertutorial_client进行验证:
tutorial_run
从图片上可以看到,demo示例程序通信成功啦~

常见错误解决办法

如果在编译成功后,运行程序时出现以下报错

thrift: error while loading shared libraries: libthriftc.so.0: cannot open shared object file: No such file or directory

可通过如命令解决,以确保 /etc/ld.so.conf文件中有 /usr/local/lib的配置

root@ubuntu:/home/phy/thrift# cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.confroot@ubuntu:/home/phy/thrift# echo "/usr/local/lib" >> /etc/ld.so.conf
root@ubuntu:/home/phy/thrift# cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf/usr/local/lib
root@ubuntu:/home/phy/thrift# ldconfig

http://www.ppmy.cn/news/69877.html

相关文章

JS 实现区块链分布式网络

JS 实现区块链网络 这里主要 JS 实现区块链 实现的部分继续下去,对 Blockchain 这个对象有一些修改,如果使用 TS 的话可能要修改对应的 interface,但是如果是 JS 的话就无所谓了。 需要安装的依赖有: express body-parser 现在…

Windows cmd命令行计划任务使用详解

哈喽,大家好,我是[有勇气的牛排](全网同名)🐮🐮🐮 有问题的小伙伴欢迎在文末[评论,点赞、收藏]是对我最大的支持!!!。 https://www.couragestea…

postman接口自动化测试

Postman除了前面介绍的一些功能,还有其他一些小功能在日常接口测试或许用得上。今天,我们就来盘点一下,如下所示: 1.数据驱动 想要批量执行接口用例,我们一般会将对应的接口用例放在同一个Collection中,然…

剑指 Offer 58 - II. 左旋转字符串(3种方法)

题目: 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。 请定义一个函数实现字符串左旋转操作的功能。 比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。 示例 1&…

pcap文件格式

在通过使用wireshark工具抓取主机不同网段的数据包时,把抓到的数据包保存起来会发现生成的文件是.pcap文件,此篇博客主要介绍pcap文件的格式,并利用C语言的结构体知识来初窥探数据包数据。 pcap文件格式 pcap文件数据结构如下图所示&#x…

Cordova webapp实战开发:(5)如何写一个Andorid下自动更新的插件?

在 《Cordova webapp实战开发:(4)Android环境搭建》中我们搭建好了开发环境,也给大家布置了调用插件的预习作业,做得如何了呢?今天我们来学一下如何自己从头建立一个Andorid下的cordova插件。 本次练习你能…

智能的本质人工智能与机器人领域的64个大问题阅读笔记(三)

目录 机器智能提高到人类的水平或者人类智能下降到机器的水平,都可以到达图灵点。 或许图灵测试是一个自我实现的预言:我们(声称)在打造“聪明”机器的同时,我们也在把人变笨。 不长脑的机器和不思考的人没什么两样&…

Kubernetes架构与组件详解

Kubernetes架构与组件详解 一、Kubernetes 简介1 什么是 Kubernetes2 Kubernetes 的优势3 Kubernetes 的应用场景 二、Kubernetes 架构1 Kubernetes 架构概述2 Kubernetes 架构组件介绍2.1 控制面板组件2.2 API Server2.3 etcd2.4 kubelet2.5 kube-proxy2.6 CNI 插件2.7 容器运…