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

news2024/11/28 4:33:27

前言

为了实现不同语言的程序跨进程、跨主机通信,一般可以采用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.1

Building 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/*.conf

root@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.coloradmin.cn/o/537793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL---游标,异常处理,循环构建表

1. 游标 游标(cursor)是用来存储查询结果集的数据类型 , 在存储过程和函数中可以使用光标对结果集进行 循环的处理。光标的使用包括光标的声明、OPEN、FETCH 和 CLOSE. -- 声明语法 declare cursor_name cursor for select_statement -- 打开语法 open cursor_name -- 取值语…

由浅入深Netty基础知识NIO三大组件原理实战

目录 1 三大组件1.1 Channel & Buffer1.2 Selector1.3 多线程版设计1.4 多线程版缺点1.5 线程池版设计1.6 线程池版缺点1.7 selector 版设计 2 ByteBuffer2.1 ByteBuffer 正确使用姿势2.2 ByteBuffer 结构2.3 调试工具类2.4 ByteBuffer 常见方法2.4.1 分配空间2.4.2 向 buf…

chatgpt赋能Python-numpy查找

Numpy查找 - 了解numpy中的查找功能 什么是Numpy? Numpy是Python语言中的一种开源的数学计算库,允许开发者轻松高效地进行数学运算。它提供了一整套矩阵运算方式,支持各种各样的数学函数和数据类型,并且可以与其他Python库良好地…

chatgpt赋能Python-macbook怎么用python

使用MacBook进行Python编程的完全指南 如果您是一名Python编程工程师,那么您需要一台性能良好的电脑来进行编程工作。今天,我们将探讨如何使用MacBook来编写Python代码,以及如何使您的Mac运行最佳状态。 安装Python 在开始使用Python之前&…

还在老一套?STM32使用新KEIL5的IDE,全新开发模式RTE介绍及使用

Keil新版本出来了,推出了一种全新开发模式RTE框架( Run-Time Environment),更好用了。然而网上的教程资料竟还都是把Keil5当成Keil4来用,直接不使用这个功能。当前正点原子或野火的教程提供的例程虽有提到Keil5,但也是基本上当Kei…

Qt Quick系列(1)—开发界面以及相关文件介绍

作者:CCAccept 专栏:Qt Quick 文章目录 开发界面相关文件介绍.pro文件.pri文件(这个一般要稍微大一点的Qt项目才会用到)main.cppmain.qml 开发界面 如何具体的写代码实现Qt Quick的UI界面,首先我们需要新建一个空的…

Java面向对象程序设计实验报告(实验三 继承的练习)

✨作者:命运之光 ✨ 专栏:Java面向对象程序设计实验报告 ​ 目录 ✨一、需求设计 ✨二、概要设计 ✨三、详细设计 ✨四、调试结果 ✨五、测试结果 ✨附录:源程序代码(带注释) demo3类 Person类 Student类 …

[架构之路-201]-《软考-系统分析师》- 关键技术 - 结构化分析方法与面向对象分析(分析与设计的区别)

目录 前言: 一、分析与设计的区别 二、结构化分析方法 2.1 实体关系图:E - R 图 (名词) 2.2. 数据流图(数据的流动) (1) 顶层图。 (2) 逐层分解。 2.3. 状态转换图(动作) …

电压比较器

电压比较器&#xff1a; 应用一&#xff1a;过压&#xff0c;低压检测&#xff08;over and undervoltage detectors&#xff09; 如果Vin<Vs&#xff0c;则VoutVpullup。 如果Vin>Vs&#xff0c;则Vout0V。 应用二&#xff1a;窗口比较器&#xff08;window comparat…

Zadoff-Chu序列

ZC序列的定义 ZC序列有两个重要的参数&#xff1a; 根索引&#xff08;root index&#xff09; q 1 , 2 , ⋯ , N z c − 1 q1,2,\cdots,N_{zc}-1 q1,2,⋯,Nzc​−1ZC序列的长度 N z c N_{zc} Nzc​&#xff0c;一定得是奇数&#xff08;常常是质数&#xff09; 给定上述两…

网络:网络分层与协议/OSI七层模型/(TCP/IP模型)

一、简单理解 OSI模型(Open System Interconnection)&#xff1a; 七层模型&#xff0c;亦称OSI&#xff08;Open System Interconnection&#xff09;。参考模型是国际标准化组织&#xff08;ISO&#xff09;制定的一个用于计算机或通信系统间互联的标准体系&#xff0c;一般…

数据结构——带头双向循环链表实现

目录 前言 一、结构介绍 二、增删查改的实现 1.在某一位置前插入数据 2.头插 3.尾插 4.删除某一位置的节点 5.头删 6.尾删 7.查找 8.打印 9.销毁 三、完整项目代码 1.头文件(List.h) 2.函数文件(List.c) 3.主函数测试文件(test.c) 前言 在学习数据结构过程中&…

HQL语法

HQL基础语法 Hive中的语句叫做HQL语句,是一种类似SQL的语句,基本上和SQL相同但是某些地方也是有很大的区别. 数据库操作 创建数据库 1.创建一个数据库,数据库在HDFS上的默认存储路径是/hive/warehouse/*.db。 create database hive01; 避免要创建的数据库已经存在错误&…

【零基础学机器学习 3】机器学习类型简介:监督学习 - 无监督学习 - 强化学习

机器学习是人工智能的一种应用,从大量数据中学习并解决特定问题。它使用计算机算法,通过经验自动提高效率。 机器学习主要有三种类型:监督、无监督和强化学习。 监督学习 概述 监督学习是一种使用标记数据来训练机器学习模型的机器学习类型。在标记数据中,输出已经是已知…

javascript-基础知识点总结

目录 &#xff08;一&#xff09;基础语法 1、javaScript引入方式 2、变量与常量 3、数据类型 typeof操作符 4、运算符 5、输出函数 6、类型转化 7、转移字符 8、注释 &#xff08;二&#xff09;流程控制 1、选择结构 switch 2、循环结构 for &#xff08;三&…

简单网络管理协议 SNMP

文章目录 1 概述1.1 结构1.2 操作 2 SNMP2.1 报文格式2.2 五大报文类型 3 扩展3.1 网工软考真题 1 概述 #mermaid-svg-95KMV1m3prKJgwv1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-95KMV1m3prKJgwv1 .error-ico…

【云原生】K8sYaml文件详细

K8sYaml文件详细 一、Kubernetes支持的文件格式1、yaml和json的主要区别2、yaml语言格式 二、YAML操作1、查看API资源版本标签2、编写资源配置清单3、创建资源对象4、查看创建的pod5、创建service服务对外提供访问并测试6、创建资源对象7、测试访问 三、Kubernetes中的Port四、…

chatgpt赋能Python-new_init_python

新版Python中的__new__和__init__方法 Python作为一种高级编程语言&#xff0c;具有简单易学、代码可读性高和编写效率高等特点&#xff0c;因此越来越受到程序员们的青睐。其中&#xff0c;__new__和__init__方法是Python中的两个非常重要的方法&#xff0c;它们在实例化一个…

chatgpt赋能Python-matplotlib绘制雷达图

Matplotlib 绘制雷达图 在数据分析和可视化领域&#xff0c;雷达图是一种常用的图表类型。Matplotlib 是一个用于绘制 2D 图形的 Python 库&#xff0c;也可以用于绘制雷达图。本文将介绍如何使用 Matplotlib 绘制雷达图&#xff0c;包括数据准备、绘图方式和样式设置。 数据…

改进YOLOv5 | 在 C3 模块中添加【SE】【CBAM】【 ECA 】【CA】注意力机制 | 附详细结构图

文章目录 1. SE 注意力模块1.1 原理1.2 C3_SE 代码2. CBAM 注意力模块2.1 原理2.2 C3_CBAM 代码3. CA 注意力模块3.1 原理3.2 C3_CA 代码4. ECA 注意力模块4.1 原理4.2 C3_ECA 代码5. 添加方式💡6. C3_Attention 结构图 🍀7. 相关推荐🍀