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,骨架已经搭好,下篇我们继续😎

目录
打赏
0
0
0
0
7
分享
相关文章
什么是Hive?请简要解释其作用和用途。
什么是Hive?请简要解释其作用和用途。
353 0
Flink中的流式SQL是什么?请解释其作用和用途。
Flink中的流式SQL是什么?请解释其作用和用途。
172 0
789.【技术】当可选http接口和sql造数据,你会选用哪种方式呢?
789.【技术】当可选http接口和sql造数据,你会选用哪种方式呢?
176 0
Thrift结构分析及增加取客户端IP功能实现
Thrift结构分析及增加取客户端IP功能实现.pdf 目录 目录 1 1. 前言 1 2. 示例Service 1 3.
1892 0
查询IP的PHP程序开源
我是 XLJ ,就读在河南省水利水电职业高中学校,读的是计算机专业,读的是中专,我比较喜欢计算机编程,所以并不是因为读了计算机专业的学校而喜欢,而是本来就喜欢编程,这篇文章带来的是原创开发的一个PHP程序,因为是学生资金并不是很充裕所以在百度搜索的时候发现了这个活动飞天加速计划,发现可以免费使用服务器就参加了活动
查询IP的PHP程序开源
thrift 实战 —— 一个简单的匹配系统(下)
thrift 实战 —— 一个简单的匹配系统(下)
280 0
thrift 实战 —— 一个简单的匹配系统(下)
借助regex包完成正则高级操作 | 带你学《Java语言高级特性》之二十六
大多数情况下我们可以直接通过String类完成字符串正则处理,但有时我们会碰到String不易解决的问题,此时我们需要使用本节提到的java.util.regex包来进行处理。
借助regex包完成正则高级操作 | 带你学《Java语言高级特性》之二十六
八大案例,带你参透SQL Server优化
在本文中,石沫针对用户遇到的各种实际问题,从实例层次到架构,通过8个SQL Server优化案例,分享了如何用最简单快捷的方式解决用户使用SQL Server数据库过程中的典型问题,使SQL Server能够稳定地提供持续服务。
13888 0
最全Java面试266题:算法+缓存+TCP+JVM+搜索+分布式+数据库
JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节。 String类能被继承吗,为什么。 String,Stringbuffer,StringBuilder的区别。
2892 0
Thrift之TProcess类体系原理及源码详细解析
我的新浪微博:http://weibo.com/freshairbrucewoo。 欢迎大家相互交流,共同提高技术。   之前对Thrift自动生成代码的实现细节做了详细的分析,下面进行处理层的实现做详细分析了!会利用到自动代码生成的知识。
889 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等