一、项目功能及描述
实现了一个负载均衡式的在线OJ平台,用户可以在浏览器查看所有题目列表并可以访问各个题目,用户可在编辑区编写代码提交。后端接收用户代码并将用户代码和测试用例组合,然后选择负载最低的主机,主机服务器把用户提交请求中的代码,写进一个XXX.CPP文件当中,子进程针对这个XXX.CPP进行编译,得到XXX.exe运行文件,如果编译出错,则把错误信息写入一个_stderr_fd文件当中。子进程针对XXX.exe文件进行执行,把标准输出和标准错误写进_stdout_fd、和_stderr_fd两个文件中,服务器读取_stdout_fd、和_stderr_fd获取运行结果并返回
二、项目演示
进入首页:
获取题目列表:
选择题目,进入编辑页面
用户提交代码
三、技术栈与开发环境
所用技术
C++ STL 标准库
Boost 准标准库(字符串切割)
cpp-httplib 第三方开源网络库
ctemplate 第三方开源前端网页渲染库
jsoncpp 第三方开源序列化、反序列化库
负载均衡设计
多进程、多线程
Ace前端在线编辑器(简单使用)
html/css/js/jquery/ajax (简单使用)
开发环境:
Centos 7 云服务器
vscode
vim/gcc(g++)
四、主要模块
公共模块:
提供一些时间戳获取,文件路径拼接,文件操作,字符串处理,网络请求,日志等项目里常用的功能。
编译与运行模块:
根据用户提交的代码与测试用例拼接后在服务器上进行编译,运行,得到结果返回给用户。
请求题目列表:
请求题目列表或一个具体题目,且具体题目有编辑区 ;提交判题请求。采用MVC的设计模式,使用负载均衡,访问文件,调用编译模块,以及把题目列表和编辑界面展示给用户。
四、具体运行过程
运行服务器:
构建题目信息:对题目信息运用unordered_map构建一个题号和题目的对应关系;
负载均衡模块:加载配置文件,解析出编译服务所有的主机信息(IP+端口号),保存所以主机的信息,并且记录在线主机的id。
前后端交互:
获取题目列表(GET):不需要参数,返回每个题目信息的json数组(题号、题目名、题目难易程度)
1、获取全部题目内容,题目内容放在vector中
2、按照题号排序
3、获取题目信息成功,将所有题目数据构建成网页(用ctemplate库渲染)1、形成路径
2、形成数字典
3、获取渲染的html
4、开始完成渲染功能
获取指定题目的详细信息(GET):参数是题目id,返回是指定题目的json信息(题号、题名、题目内容等)
根据题号获取单个题目内容,进行渲染,并且返回新的html内容
编译运行(POST):参数是题目id和用户编写的代码(拼接好的),返回是编译运行的输出结果
1、根据题目编号,直接拿到对应的题目编号
2、in_json进行反序列化,得到题目的id,得到用户提交源代码,input
3、重新拼接用户代码+测试用例,形成新的代码
4、选择负载最低的主机(差错处理)
5、然后发起http请求,得到结果
6、将结果赋值给out_json
后端编译模块:
1、服务器把用户提交请求中的代码,写进一个XXX.CPP文件当中
2、子进程针对这个XXX.CPP进行编译,得到XXX.exe运行文件
3、如果编译出错,则把错误信息写入一个XXX.compile_error文件当中。
4、子进程针对XXX.exe文件进行执行,把标准输出和标准错误写进_stdout_fd、和_stderr_fd两个文件中
5、服务器读取_stdout_fd、和_stderr_fd获取运行结果并返回