RPC远程过程调用--Thrift

RPC远程过程调用–Thrift

简介

  • Thrift是一个由Facebook开发的轻量级、跨语言的远程服务调用框架,后进入Apache开源项目。支持通过自身接口定义语言IDL定义RPC接口和数据类型,然后通过编译器生成不同语言代码,用于构建抽象易用、可互操作的RPC客户端和服务器。
  • Thrift软件栈分层从下向上分别为:传输层(Transport Layer)、协议层(Protocol Layer)、处理层(Processor Layer)和服务层(Server Layer)。
  • 具有开发速度快、易维护、高效、跨语言(C++、 Java、Python、PHP、Ruby、C#、、JavaScript、Node.js、等)优点
  • 应用广泛:hadFacebook和

安装(源码编译安装)

  • 下载源码
    https://github.com/apache/thrift

  • 安装编译工具和依赖项

sudo apt install build-essential automake bison flex libtool pkg-config
  • 解压后配置和编译
./bootstrap.sh
./configure
make
  • 安装
sudo make instal
  • 配置环境变量和映射库
echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
  • 更新库缓存
    sudo ldconfig

  • 查看安装结果

thrift --version
Thrift version 0.21.0

远程过程调用服务器客户端Demo

  • 编写Thrift IDL 文件<calculator.thrift>定义服务或数据类型
namespace cpp tutorialservice Calculator {i32 add(1:i32 num1, 2:i32 num2)
}
  • 使用thrift编译器生成C++代码
thrift --gen cpp test.thrift

在这里插入图片描述- 编写服务器和客户端应用代码

/* Server.cpp */
#include <iostream>
#include <thrift/server/TSimpleServer.h>
#include <thrift/transport/TServerSocket.h>
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/transport/TBufferTransports.h>
#include "gen-cpp/Calculator.h" // 根据实际生成的目录结构包含正确的头文件using namespace apache::thrift;
using namespace apache::thrift::server;
using namespace apache::thrift::transport;
using namespace apache::thrift::protocol;
using namespace tutorial;class CalculatorHandler : public CalculatorIf
{
public:CalculatorHandler() {}int32_t add(const int32_t num1, const int32_t num2) override{std::cout << "Adding " << num1 << " and " << num2 << std::endl;return num1 + num2;}
};int main()
{int port = 9090;std::shared_ptr<CalculatorHandler> handler = std::make_shared<CalculatorHandler>();std::shared_ptr<TProcessor> processor = std::make_shared<CalculatorProcessor>(handler);std::shared_ptr<TServerTransport> serverTransport = std::make_shared<TServerSocket>(port);std::shared_ptr<TTransportFactory> transportFactory = std::make_shared<TBufferedTransportFactory>();std::shared_ptr<TProtocolFactory> protocolFactory = std::make_shared<TBinaryProtocolFactory>();TSimpleServer server(processor,serverTransport,transportFactory,protocolFactory);std::cout << "Starting the server..." << std::endl;server.serve();std::cout << "Server stopped" << std::endl;return 0;
}
/* Client.cpp */
#include <iostream>
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/transport/TSocket.h>
#include <thrift/transport/TTransportUtils.h>
#include "gen-cpp/Calculator.h" // 根据实际生成的目录结构包含正确的头文件using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using namespace tutorial;int main()
{// 连接到 Thrift 服务器std::shared_ptr<TTransport> socket = std::make_shared<TSocket>("localhost", 9090);std::shared_ptr<TTransport> transport = std::make_shared<TBufferedTransport>(socket);std::shared_ptr<TProtocol> protocol = std::make_shared<TBinaryProtocol>(transport);CalculatorClient client(protocol);try{// 打开连接transport->open();// 调用远程方法int num1 = 10;int num2 = 5;int result = client.add(num1, num2);std::cout << "Result of adding " << num1 << " and " << num2 << " is: " << result << std::endl;// 关闭连接transport->close();}catch (const TException &tx){std::cerr << "Thrift exception: " << tx.what() << std::endl;}return 0;
}
  • 编译
g++ -o Server Server.cpp gen-cpp/Calculator.cpp -I/usr/local/include/thrift -lthrift
g++ -o Client Client.cpp gen-cpp/Calculator.cpp -I/usr/local/include/thrift -lthrift
  • 执行
./Server 
Starting the server...Adding 10 and 5
./Client 
Result of adding 10 and 5 is: 15

附件

  • 文档
    https://thrift.apache.org/tutorial/
  • 源码
    https://github.com/apache/thrift

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38258.shtml

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

相关文章

黄子韬揭秘徐艺洋与EXO的不解之缘

黄子韬揭秘&#xff1a;徐艺洋与EXO的不解之缘在娱乐圈的繁华与喧嚣中&#xff0c;总有一些不为人知的故事&#xff0c;它们或温馨、或励志&#xff0c;或是感叹命运的奇妙。近日&#xff0c;黄子韬在一档热门综艺节目中意外爆料&#xff0c;揭开了徐艺洋与EXO之间鲜为人知的秘…

ffmpeg使用bmp编码器把bgr24编码为bmp图像

version #define LIBAVCODEC_VERSION_MAJOR 60 #define LIBAVCODEC_VERSION_MINOR 15 #define LIBAVCODEC_VERSION_MICRO 100 note 不使用AVOutputFormat code void CFfmpegOps::EncodeBGR24ToBMP(const char* infile, const char* width_str, const char* height_str…

IT之家最新科技热点

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

使用Java连接数据库并且执行数据库操作和创建用户登录图形化界面(3)专栏里有上两步的源代码

创建用户登录程序&#xff0c;验证用户账号和密码信息是否在数据库student中的用户表tb_account中存在。用户登录界面如下图所示&#xff1a; 当单击“登录”按钮时&#xff0c;处理以下几种情况&#xff1a; &#xff08;1&#xff09;用户名未输入&#xff0c;提示用户名不能…

业务模型扩展字段存储

构建业务模型时&#xff0c;通常模型会设置扩展信息&#xff0c;存储上一般使用JSON格式存储到db中。JSON虽然有较好的扩展性&#xff0c;但并没有结构化存储的类型和非空等约束&#xff0c;且强依赖代码中写入/读取时进行序列化/反序列化操作&#xff0c; 当扩展信息结构简单且…

代码随想录第37天|动态规划

01背包理论基础 参考 01背包: 每个物品只有一个, 只要选或不选两个选项 暴力解法: 回溯法枚举 dp[i][j]: i 表示 0 ~ i 的物品, j 表示容量, 数值表示当前的最大价值递推公式: max(dp[i-1][j], dp[i-1][j-weight[i]] value[i])初始化: j 0 时, 无法放任何有价值的物品, d…

ASP.Net.WebAPI和工具PostMan

1.WebAPI概述 1.1 WebAPI WebAPI 是一种传统的方式&#xff0c;用于构建和暴露 RESTUI风格的Web服务。它提供了丰富的功能和灵活性&#xff0c;可以处理各种HTTP请求&#xff0c;并支持各种数据格式&#xff0c;如JSON、XML等。 WebAPI使用控制器(Controllers)和动作方法(Ac…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验10 IPv4地址 — 构造超网(无分类编址)

一、实验目的 1.加深对构造超网的理解&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.根据各网络所指定的地址块完成以下工作&#…

携手亚马逊云科技,维塑科技推出运动健康领域首个AI大模型

导读&#xff1a;生成式AI运动健康&#xff0c;将如何改变我们的生活&#xff1f; 人工智能技术正不断重塑着我们的工作、生活方式。那么&#xff0c;AI能否改善我们的健康状况呢&#xff1f;AI大模型在运动健康领域的探索为我们带来新的想象。 2023年&#xff0c;全球领先的AI…

java之命令执行审计思路

1 漏洞原理 因用户输入未过滤或净化不完全&#xff0c;导致Web应用程序接收用户输入&#xff0c;拼接到要执行的系统命令中执行。一旦攻击者可以在目标服务器中执行任意系统命令&#xff0c;就意味着服务器已被非法控制。 2 审计中常用函数 一旦攻击者可以在目标服务器中执行…

Redis发布、订阅模式(Pub/Sub)详解

Redis发布、订阅模式&#xff08;PUB-SUB&#xff09;详解 Redis的发布订阅&#xff08;Pub/Sub&#xff09;机制是一种消息通信模式&#xff0c;用于消息的广播。它允许多个客户端订阅&#xff08;Subscribe&#xff09;特定的频道&#xff08;Channel&#xff09;&#xff0c…

Docker镜像拉去不了解决方案

原理&工具 使用海外的服务器拉去镜像&#xff0c;压缩为tar包&#xff0c;传输到本地在本地运行 服务器&#xff1a;这里我使用的是AWS的服务器&#xff0c;新用户注册免费使用1年&#xff08;流量超了就不免费了&#xff0c;一般用不完&#xff0c;还有使用 Cloudflare …

【ARM CoreLink 系列 7.2 -- TZC-400 错误状态寄存器使用详细介绍】

文章目录 TZC-400 错误信息使用Fail address low registerFail address high registerFail control registerFail ID registerTZC-400 错误信息使用 Fail address low register 在 ARM TZC-400 设备中,每个过滤单元都有一个 fail_address_low_<x> 寄存器,其中 <x&g…

5.How Fast Should You Be When Learning?(你应该用多快的速度学习? (二))

Are you failing to reach an ideal or you dont know what the ideal is? 你是否没有达到理想状态&#xff0c;或者不知道理想状态是什么? A lot of learing involves having a mental representation of what the ideal performance ought to be, a method or approach t…

【计算机图形学 | 基于MFC三维图形开发】期末考试知识点汇总(下)

文章目录 视频教程第四章 二维变换与裁剪矩阵基础回顾二维几何变换之 平移二维几何变换之 比例二维几何变换之 旋转二维几何变换之 反射复合变换直线裁剪&#xff1a;Cohen-Sutherland 算法直线裁剪&#xff1a;中点分割算法直线裁剪&#xff1a;Liang-Barsky 算法多边形裁剪&a…

github主页这样优化,让人眼前一亮

我的主页&#xff08;一之十六&#xff09; 1. 创建与账户ID同名的仓库 注意&#xff1a;记得勾选Add a README file 2. markdown语法自定义README.md 3. 辅助工具 优秀profile&#xff1a;https://zzetao.github.io/awesome-github-profile/动态文字&#xff1a;https://r…

构建高效业财一体化管理体系

构建高效业财一体化管理体系 业财一体化战略意义 提升决策质量 强化数据支撑&#xff1a;通过整合业务与财务数据&#xff0c;为决策提供准确、实时的信息基础&#xff0c;确保分析的深度与广度。促进业务与财务协同&#xff1a;打破信息孤岛&#xff0c;实现业务流程与财务管…

python 压缩数据

requests 是 Python 中一个非常流行的 HTTP 库&#xff0c;用于发送各种 HTTP 请求。下面是一个使用 requests 库发送简单 GET 请求和 POST 请求的示例&#xff1a; 首先&#xff0c;确保你已经安装了 requests 库。如果还没有安装&#xff0c;可以使用 pip 进行安装&#xff…

WEB攻防【4】——JavaWeb项目/JWT身份攻击/组件安全/访问控制

一、知识点 1、Javaweb常见安全及代码逻辑 Javaweb的架构&#xff1a; 如何通过包查找到文件&#xff0c;通过URL对应源码的文件&#xff0c;或者通过源码文件对应URL地址。 2、目录遍历&身份验证&逻辑&JWT Javaweb里面有身份认证的JWT的技术&#xff0c;pyth…

基于web的产品管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于web的产品管理系统,java项目。 ecli…