Thrift

官网:Apache Thrift - Home

tutorial:Apache Thrift - Index of tutorial/

游戏匹配服务

  • 服务分为三部分:分别是game,match_system,save_server
  • game为match_client端,通过match.thrift接口向match_system完成添加用户和删除用户的操作
  • match_system由两部分组成,分别为match_server端和save_client端。match_server端负责接收match_client端的操作,将用户添加进匹配池,并且在匹配结束之后通过save.thrift接口将用户数据上传至另一个服务器
  • save_server用于接收match_system上传的匹配成功的用户信息

 

 

游戏匹配服务项目流程

  • 构建match.thrift接口
  • 通过match.thrift接口构建服务端和客户端
  • 先将服务端和客户端跑通,能完成基本的连接通信
  • 完成match.thrift的客户端需求
  • 构建save.thrift接口
  • 通过save.thrift接口构建服务端和客户端
  • 将客户端业务添加到match_system当中,将save.thrift服务端完成(本项目save.thrift服务端已经完成)
  • 根据业务需求完善match_system

项目完成过程

  1. 在gitlab上创建项目,在teminal中创建thrift文件并将当前文件初始化为仓库
  2. 根据项目需求创建文件夹本项目中一共分为三个模块gamematch_systemthrift
  3. 在thrift文件夹中创建match.thrift文件,登录thrift官方网站查看tutorial.thrift官方文档根据项目需求完成match.thrift,本项目需要定义三个部分
  • 命名空间(cpp)
  • 接口传入的用户信息(int 用户id,string 用户名,int 分数)
  • match.thrift接口服务内容(添加用户,删除用户)
  1. 由thrift接口生成服务端,进入match_system文件夹中(最好多创建一个src文件夹)在src文件夹下执行thrift官方文档中thrift -r --gen <language> <Thrift filename>直接生成服务端,生成的文件为gen.cpp将其改名为match_server,进入match_server文件夹查看Match_server.skeleton.cpp为服务端代码,将其copy到src目录下并重命名为main.cpp
  2. 打开main.cpp,先在函数后面加上返回值,并编译文件(在工程中一般先将文件编译成功再加具体的逻辑),cpp文件编译包括两步,编译和链接
  • 编译g++ -c <filename>.cpp
  • 链接g++ *.o -o main -lthrift
  • ./main运行文件
  1. 由thrift接口生成客户端,在game文件夹中创建src文件夹,执行thrift -r --gen py tutorial.thrift生成gen.py将其改名为match_client,查看文件中有服务器端文件Match-remote将其删除,因为目前只需要生成客户端(注意:在cpp中生成客户端此文件必须删除,因为cpp编译文件中只能有一个main函数)
  2. 在src目录下创建client.py,将官方文档中的client端代码复制到client.py中,注意修改头文件,执行python3 <filename>看看编译成功。如果编译成功则在代码中加上用户信息并调用服务端的函数,先启动服务端的main.cpp,再运行client.py看看服务端和客户端是否连接成功。修改代码使其能够读取终端中输入用户,编译运行如成功运行则match客户端完成
  3. 修改服务端,具体修改逻辑参考match_system/src/main.cpp · master · congrui yang / thrift · GitLab
  4. 在thrift文件夹目录下新建save.thrift,在y总目录中将内容复制过来,在src目录下同样执行thrift -r --gen py tutorial.thrift生成gen.cpp文件将其改名为save.client,进入文件夹将里面的.skeleton.cpp删除
  5. main.cpp中实现save_client的功能,查看thrift官方文档,具体修改逻辑参考match_system/src/main.cpp · master · congrui yang / thrift · GitLab
  6. 实现具体业务需求
  • 将消费者模型升级为多线程4.0bd7a35d8
  • 将匹配机制完善5.0,等待时间越长,阈值越大bd2ae34a

 

知识点总结(根据git仓库history总结)

构建match.thrift接口(match.thrift版本)
  • 查询thrift官方文档https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift根据项目需求按照thrift文档语法要求定义命名空间,用户信息,接口服务内容
通过match.thrift接口生成服务端(match_server:1.0版本)
  • 查询thrift官方文档Apache Thrift - C++根据项目需求生成服务端代码
  • 端口:端口是一个16位的二进制数,其范围从0~65535。同一个端口只能由一个进程监听,当在一个端口号启动了一个服务,另一个进程将无法访问这个端口号。服务端的端口号和客户端的端口号要相同才能够连接
通过match.thrift接口生成客户端(match_client:1.0版本)
  • 查询thrift官方文档Apache Thrift - Python根据项目需求生成客户端代码,调用服务端函数尝试能否连接
完成match.thrift客户端(match_client:2.0 finish版本)
  • python 从终端接收输入:from sys import stdin
改进match.thrift服务端(match_server:2.0版本)
  • 多线程thread:一个程序是一个进程,一个进程中至少有一个线程。如果只有一个线程,则第二个任务必须等到第一个任务结束后才能进行,如果使用多线程则在主线程执行任务的同时可以执行其他任务,而不需要等待。创建线程代价较小,但能有效提升cpu利用率。在本次项目中,我们需要输入用户信息和用户匹配是同时进行的,而不是输入用户信息结束才开始匹配,或匹配结束才能输入用户信息,所以我们需要开多线程编程。
  • 生产者消费者模型:假如有两个线程A和B,A线程生产数据(类似本项目终端输入用户信息)并将信息加入缓冲区,B线程从缓冲区中取出数据进行操作(类似本项目中取出用户信息匹配),则A为生产者B为消费者。在多线程开发中,如果生产者生产数据的速度很快,而消费者消费数据的速度很慢,那么生产者就必须等待消费者消费完数据才能够继续生产数据,因为生产过多的数据可能会导致存储不足;同理如果消费者的速度大于生产者那么消费者就会经常处理等待状态,所以为了达到生产者和消费者生产数据和消费数据之间的平衡,那么就需要一个缓冲区用来存储生产者生产的数据,所以就引入了生产者-消费者模型。当缓冲区满的时候,生产者会进入休眠状态,当下次消费者开始消耗缓冲区的数据时,生产者才会被唤醒,开始往缓冲区中添加数据;当缓冲区空的时候,消费者也会进入休眠状态,直到生产者往缓冲区中添加数据时才会被唤醒
    -- 在本项目头文件中加入#include <thread>引入多线程
  • 消息队列message_queue:在生产者消费者模型中我们提到了缓冲区,缓冲区的实现就是由队列来实现,当生产者生产数据后将信息入队,消费者获取信息后信息出队。消息队列提供了异步通信协议,也就是说,消息的发送者和接收者不需要同时与消息队列交互,消息会保存在队列中,直到接收者使用它
    -- 在本项目中手动实现消息队列,在头文件中加入#include <queue>,定义一个结构体将互斥锁mutex,队列queue和条件变量condition加入结构体即可
  • 互斥锁mutex:保证共享数据操作的完整性,保证在任一时刻只能有一个线程访问对象。锁有两个操作。一个P操作(上锁),一个V操作(解锁)。P和V都是原子操作,就是在执行P和V操作时,不会被插队。锁一般使用信号量来实现的,mutex其实就是信号量=1。互斥量就是同一时间能够分给一个人,即S=1。S=10表示可以将信号量分给10个人来用。如果一共有20个人那么只能有10个人用,剩下10个人需要等待。
    -- 在本项目中有两个操作添加用户和删除用户,信息都是存在消息队列当中,如果不上锁,这两个操作同时执行可能导致在消息队列当中信息错乱。在本项目头文件中加入#include <mutex>引入互斥锁
  • 条件变量condition_variable:条件变量一般和互斥锁搭配使用,条件变量用于在多线程环境中等待特定事件发生。
    -- 在本项目中如果消息队列为空则等待,如果有添加用户和删除用户的操作则将消息队列唤醒
完成save.thrift服务端(implement save_client版本)
  • 上传数据到服务器需要输入服务端的用户名和密码,密码可以用md5值加密
  • 求一个字符串的md5值:终端输入命令md5sum,输入原密码回车然后Ctrl+d

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT如何修改项目名称

#打开项目 这里以项目start1为例 修改start1为hds 首先删除这个文件 之后打开CmakeLists.txt文件修改里面的项目名称把里面含有start1的全部写成hds。一般是3个地方 重新打开hds文件 configure Project一下 可以看到跑出来是一样的。到此项目的名称就改过来了。

spring-boot项目启动类错误: 找不到或无法加载主类 com.**Application

问题&#xff1a;Springboot项目启动报错&#xff1a;错误: 找不到或无法加载主类 com.**Application 解决步骤&#xff1a; 1.File–>Project Structure 2.Modules–>选中你的项目–点击“-”移除 3.重新导入&#xff1a;点击“”号&#xff0c;选择Import Module&…

linux-6.0 内核存储栈全景图

linux 存储栈原图地址&#xff1a;https://www.thomas-krenn.com/en/wiki/Linux_Storage_Stack_Diagram

Linux下配置静态ip地址

问题&#xff1a;虚拟机重启后ip地址动态更新&#xff0c;导致连shell十分麻烦 解决&#xff1a; 1. 进入配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 2.1 修改配置 BOOTPROTOstatic ONBOOTyes2.2 新增配置 #ip地址(自定义) IPADDR192.168.149.131 #子网掩码 …

苹果怎么录制屏幕?这个技能你值得拥有!

苹果设备广受欢迎&#xff0c;而其中一个强大的功能就是屏幕录制。无论是记录游戏过程、演示操作步骤&#xff0c;还是创作教学视频&#xff0c;苹果都提供了多种方式来满足用户的屏幕录制需求。可是您知道苹果怎么录制屏幕吗&#xff1f;本文将深入介绍两种在苹果设备上进行屏…

Simpy简介:python仿真模拟库-02/5

一、说明 关于python下的仿真库&#xff0c;本篇为第二部分&#xff0c;是更进一步的物理模型讲解&#xff0c;由于这部分内容强依赖于第一部分的符号介绍&#xff0c;因此&#xff0c;有以下建议&#xff1a; 此文为第二部分&#xff0c;若看第一部分。建议查看本系列的第一部…

群晖Synology Drive同步文件时过滤指定文件夹“dist“, “node_modules“

群晖Synology Drive同步文件时过滤指定文件夹"dist", “node_modules” mac用户 安装Synology Drive创建同步任务修改Synology Drive配置 打开/Users/[用户名]/Library/Application Support/SynologyDrive/data/session/[同步任务序号&#xff0c;第一个同步任务就…

在docker上运行LCM

目录 1.加载镜像并进入容器 2.安装依赖 3.在docker外部git-clone lcm 4.将get-clone的lcm复制到容器中 5.编译库 6.将可执行文件复制到容器中 7.进入可执行文件 8.编译可执行文件 9.再开一个终端运行程序 10.将以上容器打成镜像并导出 1.加载镜像并进入容器 sudo do…

云卷云舒:【实战篇】对象存储迁移

云卷云舒&#xff1a;【实战篇】MySQL迁移-CSDN博客 1. 简介 对象存储与块存储、文件存储并列为云计算三大存储模型。提供海量存储空间服务&#xff0c;具备快速的数据存取性能、高可靠和数据安全性&#xff0c;通过标准的RESTful API接口和丰富的SDK包来提供服务&#xff0c…

红日靶场 4

靶场配置 ​ 733 x 668899 x 819 ​ ​ 733 x 6161466 x 1232 ​ ​ 733 x 6261449 x 1237 ​ ​ 733 x 6301450 x 1247 ​ IP 地址分配&#xff1a; Win7: 192.168.183.133(内网)Ubuntu: 192.168.183.134(内网) 192.168.120.137(外网)DC: 192.168.183.130(内网)Kali…

springboot+ipage分页频繁请求会报错 自动添加多一个limit

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near LIMIT 500 at line 3 这个原因是因为springboot配置mysql的连接池太…

Xshell连接Ubuntu失败

错误&#xff1a; Xshell连接Ubuntu失败。 Connecting to 192.168.xx.xxx:22…Could not connect to 192.168.xx.xxx’ (port 22): Connection failed. 解决方案&#xff1a;边解决&#xff0c;边测试Xshell是否可以连接 1、SSH 服务未启动&#xff1a; 确保 Ubuntu 上的 S…

多线程执行后台任务,提供效率

场景&#xff1a; 大批量复制物料描述到新的物料上&#xff0c;多线程同时执行已提高效率 REPORT zmm316. INCLUDE zmm316_top. INCLUDE zmm316_f01. *----------------------------------------------------------------------- I N I T I A L I Z A T I O N *------------…

【STM32】STM32学习笔记-USART串口外设(26)

00. 目录 文章目录 00. 目录01. 串口简介02. 串口协议03. USART简介04. USART框图05. USART基本结构06. 数据帧07. 起始位侦测08. 数据采样09. 波特率发生器10. 附录 01. 串口简介 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式&#xff0c;因为它简单便…

Redis内存策略:「过期Key删除策略」+ 「内存淘汰策略」

Redis之所以性能强&#xff0c;最主要的原因就是基于内存存储&#xff0c;然而单节点的Redis其内存大小不宜过大&#xff0c;否则会影响持久化或主从同步的性能。 Redis内存满了&#xff0c;会发生什么&#xff1f; 在Redis的运行内存达到了某个阈值&#xff0c;就会触发内存…

java基础之set集合练习(HashSet,LinkedHashSet,TreeSet)

1&#xff1a;完成以下填空&#xff1a; Collection 接口的特点是 存放list与set共性内容 没有直接实现类 没有明确的存储特点要求 ; 2&#xff1a;List 接口的特点是元素 有 &#xff08;有|无&#xff09;顺序&#xff0c; 可 &#xff08;可以|不可以&#…

九、HTML头部<head>

一、HTML头部<head> 1、<title>- 定义了HTML文档的标题 使用 <title> 标签定义HTML文档的标题 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>我的 HTML 的第一页</title> </head><b…

MySQL8.0安装(Linux - centos)

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 其他…

STM32F103GPIO工作模式及原理

目录 GPIO简介GPIO工作模式输入模式输出模式输出速度 GPIO框图和电路解析电路标识电路元件 GPIO工作模式电路解析浮空输入上拉输入下拉输入模拟输入开漏输出推挽输出推挽式复用功能开漏式复用功能 IO工作模式的选取输入模式输出模式 GPIO简介 GPIO&#xff0c;全称为通用输入输…

isaacgym(legged_gym)学习 (二)—— 设置环境地形

isaacgym(legged_gym)学习 &#xff08;二&#xff09;—— 设置环境地形 文章目录 isaacgym(legged_gym)学习 &#xff08;二&#xff09;—— 设置环境地形前言一、了解isaacgym中地形如何构成的二、自定义修改1.代码2.查看script/play.py 总结 前言 如何设置isaacgym中的环…