thrift 实战 —— 一个简单的匹配系统(上)

简介: thrift 实战 —— 一个简单的匹配系统(上)

前言


上文,我们实现了一个基本的接口 match.thrift


namespace cpp match_service
struct User {
  1: i32 id,
  2: string name,
  3: i32 score
}
service Match {
  i32 add_user(1: User user, 2: string info),
  i32 remove_user(1: User user, 2: string info),
}
复制代码


基于这个接口我们可以实现一个如图的简单匹配系统:


image.png


用 python 作为客户端远程调用进行用户的添加或者删除,cpp 作为服务端进行用户的匹配,虽然省略了数据存储,但也算是一个最小的匹配系统的实现。


生成


通过 match.thrift 分别生成 python 和 cpp 代码:


thrift -r --gen cpp match.thrift
thrift -r --gen py match.thrift
复制代码


生成的代码分别放置在 gen-cpp 以及 gen-py 文件夹下, 我们重新梳理一下文件结构:


mv gen-cpp match_server
mv gen-py match_client
cd match_server
mv Match_server.skeleton.cpp main.cpp
cd ../match_client/match
rm Match-remote


image.png


基本功能


上篇文章 一样,我们先测试跑通:


// match_server/main.cpp
...
#include <iostream>
...
class MatchHandler : virtual public MatchIf {
 public:
  ...
  int32_t add_user(const User& user, const std::string& info) {
    printf("add_user\n");
    // 添加了 return 0
    return 0;
  }
  int32_t remove_user(const User& user, const std::string& info) {
    printf("remove_user\n");
    // 添加了 return 0
    return 0;
  }
};
int main(int argc, char **argv) {
  ...
  TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
  // 输出测试
  std::cout << "Start match server 😎" << std::endl;
  server.serve();
  return 0;
}
复制代码


测试,看到输出证明成功:


# 编译,连接,运行
g++ -c *.cpp
g++ *.o -o main -lthrift
./main
复制代码


然后是客户端代码,新建 client.py,参考官方示例


from match import Match
from match.ttypes import User
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
def main():
    # Make socket
    transport = TSocket.TSocket('localhost', 9090)
    # 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 = Match.Client(protocol)
    # Connect!
    transport.open()
    # 测试
    user = User(1, "mancuoj", 1500)
    client.add_user(user, "")
    # Close!
    transport.close()
if __name__=="__main__":
    main()
复制代码


开启服务端,然后运行 client.py,你会看到如图的输出:

image.png

具体代码可以查看github,骨架已经搭好,下篇我们继续😎

目录
相关文章
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的控制文件与归档日志文件
本文介绍了Oracle数据库中的控制文件和归档日志文件。控制文件记录了数据库的物理结构信息,如数据库名、数据文件和联机日志文件的位置等。为了保护数据库,通常会进行控制文件的多路复用。归档日志文件是联机重做日志文件的副本,用于记录数据库的变更历史。文章还提供了相关SQL语句,帮助查看和设置数据库的日志模式。
285 1
【赵渝强老师】Oracle的控制文件与归档日志文件
|
弹性计算 Serverless 应用服务中间件
Serverless 应用引擎操作报错合集之集成sls时出现报错,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
194 0
|
Java Shell Python
【经验分享】Typora 设置代码块的默认语言并设置为开机启动
在Typora中设置代码块默认语言为Java(或其他语言)的自动化方法。通过下载AHK(AutoHotkey)软件,创建一个.ahk脚本,设定`Ctrl+Shift+K`快捷键触发代码块并输入指定语言。将脚本改名为.ahk扩展名并运行,确保图标出现在任务栏。要实现开机启动,使用Win+R打开&quot;运行&quot;,输入shell:startup并粘贴.ahk文件到启动文件夹。
887 2
|
SQL 关系型数据库 MySQL
linux 上源码编译安装 PolarDB-X
linux 上源码编译安装 PolarDB-X
848 6
linux 上源码编译安装 PolarDB-X
|
消息中间件 存储 负载均衡
RocketMQ消费者消费消息核心原理(含长轮询机制)
这篇文章深入探讨了Apache RocketMQ消息队列中消费者消费消息的核心原理,特别是长轮询机制。文章从消费者和Broker的交互流程出发,详细分析了Push和Pull两种消费模式的内部实现,以及它们是如何通过长轮询机制来优化消息消费的效率。文章还对RocketMQ的消费者启动流程、消息拉取请求的发起、Broker端处理消息拉取请求的流程进行了深入的源码分析,并总结了RocketMQ在设计上的优点,如单一职责化和线程池的使用等。
RocketMQ消费者消费消息核心原理(含长轮询机制)
|
开发框架 自然语言处理 Java
跨平台服务开发的利器——深入解析Thrift Compiler的工作机制与内部实现细节!
【8月更文挑战第18天】在现代软件开发中,代码生成器日益重要,能根据特定输入自动生成源代码,提高效率与可维护性。Thrift作为跨平台多语言框架,通过IDL文件定义数据和服务接口,并据此生成多语言代码,涵盖序列化、方法调用等。以示例IDL定义为例,Thrift Compiler生成服务端骨架与客户端代码框架,便于开发者添加业务逻辑。深入源码,“compiler/cpp/src/thriftl”目录下的组件负责词法、语法分析及代码生成,映射IDL至特定语言,体现编译原理与跨语言设计精髓。
298 0
|
XML JSON Java
RPC框架之Thrift—实现Go和Java远程过程调用
RPC框架之Thrift—实现Go和Java远程过程调用
349 1
|
存储 缓存 IDE
嵌入式中一篇搞定Cmake使用教程
嵌入式中一篇搞定Cmake使用教程
941 1
|
机器学习/深度学习 自然语言处理 语音技术
语音识别技术的原理与应用
语音识别技术的原理与应用
|
JavaScript
js让滚动条滚到底部
js让滚动条滚到底部
412 0