【负载均衡oj项目】01. 项目概述及准备工作

目录

  • [1. 项目概述](#1. 项目概述)
  • [2. 项目演示](#2. 项目演示)
    • [2.1 项目源代码](#2.1 项目源代码)
    • [2.2 测试操作](#2.2 测试操作)
  • [3. 核心功能及代码框架](#3. 核心功能及代码框架)
  • [4. 所用技术与开发环境](#4. 所用技术与开发环境)
  • [5. 所需组件安装](#5. 所需组件安装)
    • [5.1 gcc升级](#5.1 gcc升级)
      • [1.CentOS 7 升级 GCC(适配 devtoolset 方式)](#1.CentOS 7 升级 GCC(适配 devtoolset 方式))
      • [2. Ubuntu 升级 GCC(适配 apt 仓库方式)](#2. Ubuntu 升级 GCC(适配 apt 仓库方式))
    • [5.2 安装jsoncpp](#5.2 安装jsoncpp)
      • [1. CentOS 7 安装 jsoncpp(仅 yum 方式)](#1. CentOS 7 安装 jsoncpp(仅 yum 方式))
      • [2. Ubuntu 安装 jsoncpp(仅 apt 方式)](#2. Ubuntu 安装 jsoncpp(仅 apt 方式))
    • [5.3 安装cpp-httplib](#5.3 安装cpp-httplib)
    • [5.4 安装boost库](#5.4 安装boost库)
      • [1. CentOS 7 安装 Boost 库(yum 方式)](#1. CentOS 7 安装 Boost 库(yum 方式))
      • [2. Ubuntu 安装 Boost 库(apt 方式)](#2. Ubuntu 安装 Boost 库(apt 方式))
    • 5.5安装ctemplate
      • [1. CentOS 7 安装 ctemplate(yum 方式)](#1. CentOS 7 安装 ctemplate(yum 方式))
      • [2. Ubuntu 安装 ctemplate(apt 方式)](#2. Ubuntu 安装 ctemplate(apt 方式))
    • [5.6 Ace编辑器](#5.6 Ace编辑器)

1. 项目概述

该项目是一个负载均衡式在线评测系统(Online Judge,简称 OJ) ,目标是实现类似 LeetCode 的在线编程平台。用户可以浏览题目、在线编写代码、提交运行并获取评测结果。系统采用C++ 开发,基于MVC 架构 ,并实现了多机负载均衡,以提高编译和运行服务的并发能力与稳定性。

2. 项目演示

2.1 项目源代码

代码链接:OnlineJudge-过云雨/项目 - 码云 - 开源中国

2.2 测试操作

  1. 开启虚拟器/云服务器,打开四个终端,三个运行./compile_server文件,端口分别为8081、8082、8083。第四个终端运行./oj_server
bash 复制代码
./compile_server 8081
./compile_server 8082
./compile_server 8083

./oj_server


  1. 打开浏览器,输入你电脑的 ip:port,即可打开OJ平台的主界面,点击开始编程进入题目列表。
bash 复制代码
# 我的虚拟机ip是192.168.233.128
192.168.233.128:8080
  1. 选择任意一个题目进入题目内容界面(此处我测试所以使用了多个同样的题目,可以自定义修改)
  1. 题目内容界面,有题目描述、代码框、提交代码按钮、编译运行结果。将代码完善之后,点击提交代码。
  1. 多次点击"提交代码"按钮,查看虚拟机终端,可见每次运行时寻找负载最低的后台来编译运行程序

3. 核心功能及代码框架

整个项目总共分三个文件夹存放:comm、compile_server、oj_server

comm:

  1. util.hpp(常用公共功能):获取时间戳、路径拼接、文件名拼接、文件内容读取与写入、字符串分割。
  2. log.hpp(日志打印功能):打印日志功能。
  3. httplib.h(http协议):http协议的C++版本开源库。

compile_server:

  1. compiler.hpp(编译器):用户代码编译。
  2. runner.hpp(执行器):用户代码运行与限制。
  3. compile_run.hpp(编译执行流程):编译运行流程、报错存放、中间文件删除。
  4. compile_server.cc(http协议+编译执行调用):http协议接收、执行编译运行流程。
  5. makefile(make指令):make编译与清理。

oj_server:MVC

  1. oj_model.hpp:题目数据加载。
  2. oj_view.hpp:http界面渲染。
  3. oj_control.hpp:主机控制、负载均衡、序列化处理、http协议发送与接收。
  4. oj_server.cc:主逻辑运行。
  5. makefile(make指令):make编译与清理。
  • wwwroot文件夹:网页主界面
  • template_html文件夹:题目目录和题目界面
  • questions文件夹:存放题目内容、代码框架等
  • conf文件夹:存放可用ip+port

项目宏观结构:

4. 所用技术与开发环境

所用技术:

  • C++ STL 标准库
  • Boost 准标准库(字符串切割)
  • cpp-httplib 第三方开源网络库
  • ctemplate 第三方开源前端网页渲染库
  • jsoncpp 第三方开源序列化、反序列化库
  • 负载均衡设计
  • 多进程、多线程
  • MySQL C connect
  • Ace 前端在线编辑器(了解)
  • html/css/js/jquery/ajax(了解)

开发环境

  • Centos 7 系统 或者 ubuntu系统(虚拟机或者云服务器均可)
  • vscode
  • Mysql Workbench

5. 所需组件安装

5.1 gcc升级

1.CentOS 7 升级 GCC(适配 devtoolset 方式)

  1. 安装 SCL 仓库(软件集管理工具)

    SCL(Software Collections)是 CentOS 官方提供的工具,用于在不替换系统默认 GCC 的前提下,安装并使用高版本 GCC(解决老编译器编译 cpp-httplib 报错问题)。执行以下命令安装:

    bash 复制代码
    sudo yum install -y centos-release-scl scl-utils-build
  2. 安装指定版本的 GCC

    可选择 7/8/9 等版本(推荐 9 以适配 cpp-httplib),命令如下(以 9 为例,替换数字可装其他版本):

    bash 复制代码
    # 安装 GCC 9 及 C++ 编译器
    sudo yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++

    安装完成后,可通过 ls /opt/rh/ 验证,能看到 devtoolset-9 目录即表示安装成功。

  3. 临时启用高版本 GCC(当前会话有效)

    系统默认仍使用老版本 GCC,需手动启用新版本,该操作仅对当前终端会话生效:

    bash 复制代码
    scl enable devtoolset-9 bash

    执行后输入 gcc -v,可看到版本已切换为 9.x(而非系统默认的 4.8.5)。

  4. 永久启用高版本 GCC(可选,推荐)

    若希望每次登录终端自动启用新版本,需将启用命令写入 ~/.bash_profile

    • 编辑配置文件:

      bash 复制代码
      vi ~/.bash_profile
    • 在文件末尾添加以下内容(以 GCC 9 为例):

      bash 复制代码
      # 自动启用 devtoolset-9 版本的 GCC
      scl enable devtoolset-9 bash
    • 保存退出后,执行 source ~/.bash_profile 使配置立即生效,后续登录终端会自动切换到高版本 GCC。


2. Ubuntu 升级 GCC(适配 apt 仓库方式)

Ubuntu 无 devtoolset 工具,需通过官方仓库 / PPA 升级,流程如下:

  1. 更新系统软件源

    先更新本地软件索引,确保能获取最新的 GCC 包:

    bash 复制代码
    sudo apt update
  2. 查看可安装的 GCC 版本(可选)

    确认系统支持的高版本 GCC:

    bash 复制代码
    apt search gcc | grep "^gcc-[0-9]"
  3. 安装指定版本的 GCC(以 9 为例)

    安装 GCC 9 及 C++ 编译器(适配 cpp-httplib):

    bash 复制代码
    sudo apt install -y gcc-9 g++-9
  4. 设置默认 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 版本),执行:

      bash 复制代码
      sudo update-alternatives --config gcc
      sudo update-alternatives --config g++

      按提示输入对应版本的序号即可。

  5. 验证升级结果

    执行 gcc -vg++ -v,确认输出版本为 9.x 即完成升级。

5.2 安装jsoncpp

1. CentOS 7 安装 jsoncpp(仅 yum 方式)

  1. 先安装 EPEL 扩展源(CentOS 7 官方源无 jsoncpp):

    bash 复制代码
    sudo yum install -y epel-release
  2. 安装 jsoncpp 及开发包(包含头文件和库文件):

    bash 复制代码
    sudo yum install -y jsoncpp jsoncpp-devel

2. Ubuntu 安装 jsoncpp(仅 apt 方式)

  1. 更新软件源索引:

    bash 复制代码
    sudo apt update
  2. 安装 jsoncpp 开发包(包含头文件和库文件):

    bash 复制代码
    sudo apt install -y libjsoncpp-dev

5.3 安装cpp-httplib

最新的cpp-httplib在使用的时候,如果gcc不是特别新的话有可能会有运行时错误的问题

建议:cpp-httplib 0.7.15。下载zip安装包,上传到服务器即可

cpp-httplib gitee链接:https://gitee.com/yuanfeng1897/cpp-httplib?_from=gitee_search

v0.7.15版本链接: https://gitee.com/yuanfeng1897/cpp-httplib/tree/v0.7.15

bash 复制代码
# 安装指令
git clone https://gitee.com/yuanfeng1897/cpp-httplib.git

5.4 安装boost库

1. CentOS 7 安装 Boost 库(yum 方式)

  1. 先安装 EPEL 扩展源(CentOS 7 官方源的 Boost 版本较全,需依赖 EPEL):

    复制代码
    sudo yum install -y epel-release
  2. 安装 Boost 核心库及开发包(包含头文件和编译依赖):

    复制代码
    sudo yum install -y boost boost-devel

    注:若需指定版本(如 Boost 1.7x+),yum 源版本可能偏低,需源码编译,但日常开发用 yum 安装的版本已满足基础需求(如字符串切割)。

2. Ubuntu 安装 Boost 库(apt 方式)

  1. 更新软件源索引:

    复制代码
    sudo apt update
  2. 安装 Boost 开发包(包含所有核心模块及头文件):

    复制代码
    sudo apt install -y libboost-all-dev

    注:

    复制代码
    libboost-all-dev

    会安装 Boost 全量模块,若只需特定模块(如仅字符串处理),可替换为 libboost-dev(核心开发包)+ 具体模块(如 libboost-string-dev),但推荐直接装全量包避免依赖缺失。

5.5安装ctemplate

1. CentOS 7 安装 ctemplate(yum 方式)

ctemplate 是轻量级的 C++ 前端渲染库,CentOS 7 需先配置 EPEL 源才能通过 yum 安装:

  1. 安装 EPEL 扩展源:

    bash 复制代码
    sudo yum install -y epel-release
  2. 安装 ctemplate 及开发包(包含头文件和库文件):

    bash 复制代码
    sudo yum install -y ctemplate ctemplate-devel

2. Ubuntu 安装 ctemplate(apt 方式)

Ubuntu 官方源直接提供 ctemplate 包,无需额外配置源:

  1. 更新软件源索引:

    bash 复制代码
    sudo apt update
  2. 安装 ctemplate 开发包(包含头文件和库文件):

    bash 复制代码
    sudo apt install -y libctemplate-dev

5.6 Ace编辑器

cpp 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>Ace Editor - C++ 版本</title>
  <style>
    * {
      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>
</head>
<body>
  <div class="title">C++ 代码编辑器</div>
  <div id="editor">// C++ 示例代码
#include <iostream>
#include <string>
using namespace std;

// 主函数
int main() {
    string name = "Ace Editor";
    cout << "Hello, " << name << "!" << endl;
    
    // 循环示例
    for (int i = 0; i < 5; i++) {
        cout << "循环次数: " << i << endl;
    }
    return 0;
}
</div>

<!-- 引入 Ace 核心库 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.33.1/ace.js"></script>
<!-- 引入自动补全扩展 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.33.1/ext-language_tools.js"></script>

<script>
  // 初始化编辑器
  const editor = ace.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>
相关推荐
kyriewen2 小时前
Flexbox 完全指南:从此告别浮动,拥抱一维战神
前端·css·html
yuuki2332332 小时前
【C++ 智能指针全解析】从内存泄漏痛点到 RAII + unique/shared/weak_ptr 手撕实现
开发语言·c++
报错小能手2 小时前
如何手撕集群聊天室项目?
linux·服务器
闻缺陷则喜何志丹2 小时前
【构造 前缀和】P8902 [USACO22DEC] Range Reconstruction S|普及+
c++·算法·前缀和·洛谷·构造
小生不才yz2 小时前
【Makefile 专家之路 | 基础篇】01. 万物起源:编译链接原理与 Makefile 的核心价值
linux
老四啊laosi2 小时前
[C++进阶] 16. 继承
c++·继承
实心儿儿2 小时前
C++ —— 继承
开发语言·c++
PenguinLetsGo2 小时前
代码段的消失:页表异常清零引发的 ILL_ILLOPC 溯源
android·linux
AMoon丶2 小时前
C++基础-类、对象
java·linux·服务器·c语言·开发语言·jvm·c++