【负载均衡oj项目】01. 项目概述及准备工作
目录1. 项目概述2. 项目演示2.1 项目源代码2.2 测试操作3. 核心功能及代码框架4. 所用技术与开发环境5. 所需组件安装5.1 gcc升级1.CentOS 7 升级 GCC适配 devtoolset 方式2. Ubuntu 升级 GCC适配 apt 仓库方式5.2 安装jsoncpp1. CentOS 7 安装 jsoncpp仅 yum 方式2. Ubuntu 安装 jsoncpp仅 apt 方式5.3 安装cpp-httplib5.4 安装boost库1. CentOS 7 安装 Boost 库yum 方式2. Ubuntu 安装 Boost 库apt 方式5.5安装ctemplate1. CentOS 7 安装 ctemplateyum 方式2. Ubuntu 安装 ctemplateapt 方式5.6 Ace编辑器1. 项目概述该项目是一个负载均衡式在线评测系统Online Judge简称 OJ目标是实现类似 LeetCode 的在线编程平台。用户可以浏览题目、在线编写代码、提交运行并获取评测结果。系统采用C开发基于MVC 架构并实现了多机负载均衡以提高编译和运行服务的并发能力与稳定性。2. 项目演示2.1 项目源代码代码链接OnlineJudge-过云雨/项目 - 码云 - 开源中国2.2 测试操作开启虚拟器/云服务器打开四个终端三个运行./compile_server文件端口分别为8081、8082、8083。第四个终端运行./oj_server。./compile_server8081./compile_server8082./compile_server8083./oj_server打开浏览器输入你电脑的ip:port即可打开OJ平台的主界面点击开始编程进入题目列表。# 我的虚拟机ip是192.168.233.128192.168.233.128:8080选择任意一个题目进入题目内容界面此处我测试所以使用了多个同样的题目可以自定义修改题目内容界面有题目描述、代码框、提交代码按钮、编译运行结果。将代码完善之后点击提交代码。多次点击“提交代码”按钮查看虚拟机终端可见每次运行时寻找负载最低的后台来编译运行程序3. 核心功能及代码框架整个项目总共分三个文件夹存放comm、compile_server、oj_servercommutil.hpp常用公共功能获取时间戳、路径拼接、文件名拼接、文件内容读取与写入、字符串分割。log.hpp日志打印功能打印日志功能。httplib.hhttp协议http协议的C版本开源库。compile_servercompiler.hpp编译器用户代码编译。runner.hpp执行器用户代码运行与限制。compile_run.hpp编译执行流程编译运行流程、报错存放、中间文件删除。compile_server.cchttp协议编译执行调用http协议接收、执行编译运行流程。makefilemake指令make编译与清理。oj_serverMVCoj_model.hpp题目数据加载。oj_view.hpphttp界面渲染。oj_control.hpp主机控制、负载均衡、序列化处理、http协议发送与接收。oj_server.cc主逻辑运行。makefilemake指令make编译与清理。wwwroot文件夹网页主界面template_html文件夹题目目录和题目界面questions文件夹存放题目内容、代码框架等conf文件夹存放可用ipport项目宏观结构4. 所用技术与开发环境所用技术C STL 标准库Boost 准标准库字符串切割cpp-httplib 第三方开源网络库ctemplate 第三方开源前端网页渲染库jsoncpp 第三方开源序列化、反序列化库负载均衡设计多进程、多线程MySQL C connectAce 前端在线编辑器了解html/css/js/jquery/ajax了解开发环境Centos 7 系统 或者 ubuntu系统虚拟机或者云服务器均可vscodeMysql Workbench5. 所需组件安装5.1 gcc升级1.CentOS 7 升级 GCC适配 devtoolset 方式安装 SCL 仓库软件集管理工具SCLSoftware Collections是 CentOS 官方提供的工具用于在不替换系统默认 GCC 的前提下安装并使用高版本 GCC解决老编译器编译 cpp-httplib 报错问题。执行以下命令安装sudoyuminstall-ycentos-release-scl scl-utils-build安装指定版本的 GCC可选择 7/8/9 等版本推荐 9 以适配 cpp-httplib命令如下以 9 为例替换数字可装其他版本# 安装 GCC 9 及 C 编译器sudoyuminstall-ydevtoolset-9-gcc devtoolset-9-gcc-c安装完成后可通过ls /opt/rh/验证能看到devtoolset-9目录即表示安装成功。临时启用高版本 GCC当前会话有效系统默认仍使用老版本 GCC需手动启用新版本该操作仅对当前终端会话生效sclenabledevtoolset-9bash执行后输入gcc -v可看到版本已切换为 9.x而非系统默认的 4.8.5。永久启用高版本 GCC可选推荐若希望每次登录终端自动启用新版本需将启用命令写入~/.bash_profile编辑配置文件vi~/.bash_profile在文件末尾添加以下内容以 GCC 9 为例# 自动启用 devtoolset-9 版本的 GCCsclenabledevtoolset-9bash保存退出后执行source ~/.bash_profile使配置立即生效后续登录终端会自动切换到高版本 GCC。2. Ubuntu 升级 GCC适配 apt 仓库方式Ubuntu 无 devtoolset 工具需通过官方仓库 / PPA 升级流程如下更新系统软件源先更新本地软件索引确保能获取最新的 GCC 包sudoaptupdate查看可安装的 GCC 版本可选确认系统支持的高版本 GCCaptsearch gcc|grep^gcc-[0-9]安装指定版本的 GCC以 9 为例安装 GCC 9 及 C 编译器适配 cpp-httplibsudoaptinstall-ygcc-9 g-9设置默认 GCC 版本Ubuntu 安装后不会自动切换需手动配置默认版本先添加 GCC 候选版本sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 sudo update-alternatives --install /usr/bin/g g /usr/bin/g-9 90数字 90 是优先级数值越高越优先若需切换版本比如有多个 GCC 版本执行sudoupdate-alternatives--configgccsudoupdate-alternatives--configg按提示输入对应版本的序号即可。验证升级结果执行gcc -v和g -v确认输出版本为 9.x 即完成升级。5.2 安装jsoncpp1. CentOS 7 安装 jsoncpp仅 yum 方式先安装 EPEL 扩展源CentOS 7 官方源无 jsoncppsudoyuminstall-yepel-release安装 jsoncpp 及开发包包含头文件和库文件sudoyuminstall-yjsoncpp jsoncpp-devel2. Ubuntu 安装 jsoncpp仅 apt 方式更新软件源索引sudoaptupdate安装 jsoncpp 开发包包含头文件和库文件sudoaptinstall-ylibjsoncpp-dev5.3 安装cpp-httplib最新的cpp-httplib在使用的时候如果gcc不是特别新的话有可能会有运行时错误的问题建议cpp-httplib 0.7.15。下载zip安装包上传到服务器即可cpp-httplib gitee链接https://gitee.com/yuanfeng1897/cpp-httplib?_fromgitee_searchv0.7.15版本链接 https://gitee.com/yuanfeng1897/cpp-httplib/tree/v0.7.15# 安装指令gitclone https://gitee.com/yuanfeng1897/cpp-httplib.git5.4 安装boost库1. CentOS 7 安装 Boost 库yum 方式先安装 EPEL 扩展源CentOS 7 官方源的 Boost 版本较全需依赖 EPELsudo yum install -y epel-release安装 Boost 核心库及开发包包含头文件和编译依赖sudo yum install -y boost boost-devel注若需指定版本如 Boost 1.7xyum 源版本可能偏低需源码编译但日常开发用 yum 安装的版本已满足基础需求如字符串切割。2. Ubuntu 安装 Boost 库apt 方式更新软件源索引sudo apt update安装 Boost 开发包包含所有核心模块及头文件sudo apt install -y libboost-all-dev注libboost-all-dev会安装 Boost 全量模块若只需特定模块如仅字符串处理可替换为libboost-dev核心开发包 具体模块如libboost-string-dev但推荐直接装全量包避免依赖缺失。5.5安装ctemplate1. CentOS 7 安装 ctemplateyum 方式ctemplate 是轻量级的 C 前端渲染库CentOS 7 需先配置 EPEL 源才能通过 yum 安装安装 EPEL 扩展源sudoyuminstall-yepel-release安装 ctemplate 及开发包包含头文件和库文件sudoyuminstall-yctemplate ctemplate-devel2. Ubuntu 安装 ctemplateapt 方式Ubuntu 官方源直接提供 ctemplate 包无需额外配置源更新软件源索引sudoaptupdate安装 ctemplate 开发包包含头文件和库文件sudoaptinstall-ylibctemplate-dev5.6 Ace编辑器!DOCTYPE htmlhtml langzh-CNheadmeta charsetUTF-8titleAce Editor-C版本/titlestyle*{margin:0;padding:0;box-sizing:border-box;}body{padding:20px;font-family:Arial,sans-serif;}/* 编辑器容器必须设置宽高定位 */#editor{position:relative;width:100%;height:600px;border:1px solid #ddd;border-radius:4px;margin-top:10px;}.title{font-size:18px;font-weight:bold;color:#333;}/style/headbodydivclasstitleC代码编辑器/divdiv ideditor// C 示例代码#includeiostream#includestringusingnamespacestd;// 主函数intmain(){string nameAce Editor;coutHello, name!endl;// 循环示例for(inti0;i5;i){cout循环次数: iendl;}return0;}/div!--引入 Ace 核心库--script srchttps://cdnjs.cloudflare.com/ajax/libs/ace/1.33.1/ace.js/script!--引入自动补全扩展--script srchttps://cdnjs.cloudflare.com/ajax/libs/ace/1.33.1/ext-language_tools.js/scriptscript// 初始化编辑器consteditorace.edit(editor);// 核心配置editor.setTheme(ace/theme/monokai);// 暗黑主题最常用editor.session.setMode(ace/mode/c_cpp);// C 语法模式editor.setOptions({fontSize:14px,// 字体大小tabSize:4,// Tab 缩进宽度wrap:true,// 自动换行highlightActiveLine:true,// 高亮当前行showPrintMargin:false,// 隐藏打印边距线enableBasicAutocompletion:true,// 基础自动补全enableLiveAutocompletion:true,// 实时自动补全enableSnippets:true// 代码片段提示});// 监听内容变化可选editor.on(change,(){console.log(C 代码已修改\n,editor.getValue());});/script/body/html