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

目录
相关文章
|
2月前
|
网络协议 安全 Python
我们将使用Python的内置库`http.server`来创建一个简单的Web服务器。虽然这个示例相对简单,但我们可以围绕它展开许多讨论,包括HTTP协议、网络编程、异常处理、多线程等。
我们将使用Python的内置库`http.server`来创建一个简单的Web服务器。虽然这个示例相对简单,但我们可以围绕它展开许多讨论,包括HTTP协议、网络编程、异常处理、多线程等。
|
4月前
|
Java API Apache
ZooKeeper【基础 03】Java 客户端 Apache Curator 基础 API 使用举例(含源代码)
【4月更文挑战第11天】ZooKeeper【基础 03】Java 客户端 Apache Curator 基础 API 使用举例(含源代码)
61 11
|
4月前
|
SQL 存储 分布式计算
什么是Hive?请简要解释其作用和用途。
什么是Hive?请简要解释其作用和用途。
209 0
|
消息中间件 分布式计算 关系型数据库
流式读取热搜词汇并解析,urllib+Kafka+Spark
紧接上文,本次对于上次的优化是增加了kafka的插件,用简单消费者和生产者在本地window系统完成模拟,每五分钟爬取一次百度热搜,条数基本为145条,然后消费者来消费数据,写入到spark,下次的优化应该就是从sparksql转化为sparkstreaming,并直接整合kafka,而不是中间转row再写入。
99 0
|
消息中间件
thrift 实战 —— 一个简单的匹配系统(下)
thrift 实战 —— 一个简单的匹配系统(下)
252 0
thrift 实战 —— 一个简单的匹配系统(下)
|
编译器 Apache
Thrift架构与使用方法
Thrift架构与使用方法
243 0
Thrift架构与使用方法
|
缓存 自然语言处理 算法
Solr支持的需求“转化”方案小结
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。
114 0
借助regex包完成正则高级操作 | 带你学《Java语言高级特性》之二十六
大多数情况下我们可以直接通过String类完成字符串正则处理,但有时我们会碰到String不易解决的问题,此时我们需要使用本节提到的java.util.regex包来进行处理。
借助regex包完成正则高级操作 | 带你学《Java语言高级特性》之二十六
|
Apache C++ Java
Thrift之TProcess类体系原理及源码详细解析
我的新浪微博:http://weibo.com/freshairbrucewoo。 欢迎大家相互交流,共同提高技术。   之前对Thrift自动生成代码的实现细节做了详细的分析,下面进行处理层的实现做详细分析了!会利用到自动代码生成的知识。
857 0