C++ 高性能Http服务器 - HelloWorld(一)

2023-11-20

本文使用 newobj 跨平台开发框架实现 Web 服务的搭建及业务处理,最终实现个人博客网站的Demo,其中使用Mysql、Redis数据库。该框架实测可处理 6w+并发的请求并进行数据库处理。

非常适合工作或学习中需要了解或应用C++开发web服务的同学构建使用。

newobj跨平台开发框架:https://github.com/Liuccysdgg/newobj

一、 HelloWorld

部分代码预览

演示效果

1、 环境搭建

操作系统:Ubuntu22.04

# 进入用户目录
cd ~
# 创建目录 lib
mkdir lib
# 进入目录
cd lib
# 执行构建脚本
wget file.newobj.org/build.sh
# 赋予执行权限
chmod 777 build.sh
# 执行脚本,因为需要安装相关依赖包,需要执行root权限注意根据提示输入密码
./build.sh

该脚本克隆多个github库,请确认已配置相关网络环境,否则可能出现克隆失败等问题。

pwd
# 我的路径
/home/ubuntu/lib

目录结构:

----build.sh

----include

----lib

----newobj

----thirdparty

2、 构建项目

返回上级目录创建项目文件夹

cd ..
mkdir project
cd project
mkdir webserver
cd webserver
# 创建源代码目录
mkdir src
# 创建配置文件目录
mkdir res
# 创建CMakeLists
touch CMakeLists.txt
# 创建源文件 main.cpp
touch src/main.cpp
# 创建配置文件
touch res/config.json

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(kernel LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(${PROJECT_NAME}
    src/main.cpp
)

install(TARGETS kernel
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})





if(CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Debug"))
    set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
elseif(CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Release"))

endif()

include_directories(~/lib/newobj/project/)
include_directories(~/lib/newobj/module/)
include_directories(~/lib/newobj/src/)
include_directories(~/lib/newobj/thirdparty/)
include_directories(~/lib/newobj/include/)
include_directories(~/lib/include/clickhouse/clickhouse)
include_directories(~/lib/include/clickhouse)
include_directories(~/lib/include)
include_directories(${PROJECT_SOURCE_DIR}/src)

add_definitions(-DNEWOBJ_STATIC -std=c++17)

link_directories(/usr/local/lib)
# add_subdirectory(/home/nianhua/lib/bin/)

target_link_libraries(${PROJECT_NAME} PUBLIC
    ~/lib/lib/libmodule_network_debug.a
    ~/lib/lib/libthirdparty_mysql_debug.a
    ~/lib/lib/libthirdparty_redis_debug.a
    ~/lib/lib/libthirdparty_clickhouse_debug.a
    ~/lib/lib/libnewobj_debug.a
    ~/lib/lib/libhpsocket.so
    ~/lib/lib/liblog4cplus.so
    libmysqlcppconn.so
    libmysqlclient.so
    libssl.a
    libcrypto.a
    libhiredis.a
    libclickhouse-cpp-lib.a
    ~/lib/lib/libabsl_int128.a
    ~/lib/lib/libcityhash.a
    ~/lib/lib/liblz4.a
    libpthread.so
)

config.json

{
    "website":[
        {
            "host":[
                {
                    "host":"0.0.0.0:6699",
                    "ssl":false
                }
            ],
            "router":{
                "threadpool":{
                    "queuemax":10000,
                    "size":5
                }
            }

        }
    ]
}

host:绑定域名,没有域名可以输入IP+端口

ssl:是否支持SSL

router

---- threadpool

--------queuemax:请求最大队列数

--------size:线程池线程数

main.cpp

#include <iostream>
#include <regex>
#include "public/environment.h"
#include "util/system.h"
#include "util/time.h"
#include "network/http/http_client_plus.h"
#include "network/http/http_center.h"
#include "network/http/http_request.h"
#include "network/http/http_response.h"
#include "network/http/http_reqpack.h"
#include "network/http/http_router.h"
#include "network/http/http_interceptor.h"
#include "network/http/http_website.h"
int main()
{

    // 配置文件
    newobj::json config;
    config.parse_file("./res/config.json");

    // 创建控制中心
    auto center = new network::http::center;
    center->create(config);

    // 通过域名获取 website 站点对象指针
    auto website = center->website("0.0.0.0");

    /************************ 添加控制器\拦截器\静态文件处理  **********************************/

    // 获取路由
    auto router = website->router();
    // 获取拦截器
    auto interceptor = router->interceptor();

    // 增加请求处理 (lamaba 方式)
    router->subscribe("/hello",network::http::GET,[](network::http::request* request,network::http::response* response){
        // 发送 文本
        response->send((nstring)"<h1>Hello!,This is newobj Web Server</h1>");
    });

    // 启动控制中心
    if (center->start() == false)
    {
        newobj::log->fatal(center->last_error());
        return 0;
    }

    newobj::log->info("start success");


    
    while (true)
    {
        system::sleep_msec(1000);
    }
    return 0;
}



3、 编译运行

cmake .
make
./kernel


ubuntu@VM-4-3-ubuntu:~/webserver$ ./kernel 
2023-02-15 19:11:21.610 [INFO ] [router] -  [subscribe][func] express:/hello method:GET 
2023-02-15 19:11:21.610 [INFO ] [router] -  [subscribe][ctl] express:/user/get_info method:GET 
2023-02-15 19:11:21.610 [INFO ] [router] -  [subscribe][ctl] express:/user/set_info method:POST 
2023-02-15 19:11:21.610 [INFO ] [router] -  [subscribe][ctl] express:/user/outlogin method:GET 
2023-02-15 19:11:21.613 [INFO ] [ALL] -  start success 
2023-02-15 19:11:25.720 [INFO ] [router] -  [1 ms] controller url:/hello ip:183.146.4.134 

4、 注意事项

① centos 及其它版本未测试,建议使用ubuntu20+版本

② 如果出现运行脚本github克隆超时等问题,请科学上网或手动下载编译。

③ 对VIM不熟悉推荐使用桌面版Ubuntu,并安装最新版本QtCreator,可直接打开CMakeLists.txt 进行编译调试

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 高性能Http服务器 - HelloWorld(一) 的相关文章

  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 无法在 mysql-apt-config [Ubuntu 14.04] 中选择“确定”

    我使用的是 Ubuntu 14 04 sudo apt get update总是给我这个选项来配置 mysql apt config 我尝试选择版本 按 tab gt 在 确定 上突出显示的键 按 Enter 但没有任何反应 它再次返回并突
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • 手写 git hooks 脚本

    我们的 Git 仓库中包含了编译后的代码 所以每次修改了源码 都需要运行一下编译命令 然后把源码和编译后的代码一起提交到 Git 仓库 这个流程没什么问题 但是 人脑不是电脑 总会有疏忽的时候 经常会出现这样一种情况 修改了源码 却忘记了运
  • sql判断字段是否为null,是否为空串

    问题现象 今天在项目中思考了一个问题 如何在sql中判断一个字段是否为 null值 是否为 空串 呢 问题分析 需要注意的是 null值 和 空串 并不是同一个概念 null值 就是这个字段没有赋值 也就是java中常说的 null 而 空
  • 权重实现随机抽奖

    一般抽奖是怎么实现的 在实习期间学会了一种通用的写法 在这里记录一下 最近在学Golang语法基础 这里就用Golang来写 package main import fmt time math rand func main r rand N
  • 模态对话框与非模态对话的几种销毁方法与区别

    前几天发现自己的程序中使用非模态对话框 Debug版本有警告提示如下 Warning calling DestroyWindow in CWnd CWnd OnDestroy or PostNcDestroy in derived clas
  • 关于高并发与多线程中的线程池

    关于高并发与多线程中的线程池 定义 线程是稀缺资源 它的创建与销毁是一个相对偏重且耗资源的操作 而Java线程依赖于内核线程 创建线程需要进行操作系统状态切换 为避免资源过度消耗需要设法重用线程执行多个任务 线程池就是一个线程缓存 负责对线
  • Qt webengine 显示web页面、前后端通信以及下载详解

    概述 官方文档 https doc qt io archives qt 5 11 qtwebengine overview html 翻译文档 Qt5 9 WebEngine 概述 一花一世界 一叶一乾坤 博客园 从Qt5 5开始 Qt W
  • libuv 原理_[Nodejs原理] 核心库Libuv入门(Hello World篇)

    Libuv是什么 1 简介Libuv是一个高性能的 事件驱动的异步I O库 它本身是由C语言编写的 具有很高的可移植性 libuv封装了不同平台底层对于异步IO模型的实现 所以它还本身具备着Windows Linux都可使用的跨平台能力 L
  • 数据密集型应用系统设计(2)

    文章目录 数据模型与查询语言 NoSQL 数据库历史 关系数据库与文档数据库现状 数据查询语言 图状数据模型 小结 数据模型与查询语言 大多数应用程序是通过一层层叠加数据模型来构建的 例如 应用程序开发人员观测现实世界 通过对象或者数据结构
  • Vue 和 jQuery 两者之间的区别是什么?

    1 jQuery 介绍 jQuery 曾经也是现在依然最流行的 web 前端 js 库 可是现在无论是国内还是国外他的使 用率正在渐渐被其他的 js 库所代替 随着浏览器厂商对 HTML5 规范统一遵循以及 ECMA6 在浏 览器端的实现
  • NGINX配置PHP网站

    NGINX配置PHP网站 NGINX配置PHP网站 源码安装NGINX 安装PHP 修改PHP参数 重启PHP 修改nginx配置文件 重启NGINX 测试 解决报错问题 NGINX配置PHP网站 源码安装NGINX 脚本一键安装 安装路径
  • springboot 整合EHcache 实现分页缓存

    一 简要概述 Cacheable 对当前的对象做缓存处理 Cacheable 作用 把方法的返回值添加到 Ehcache 中做缓存 Cacheable value xxx key xxxx Value 属性 指定一个 Ehcache 配置文
  • 小米造车?年轻人的第一辆电动车?

    素来有着价格屠夫称号的 小米 终于要对电动车出手了 事件简讯 昨天下午 据 晚点LatePost 爆料 小米 已确定造车 并视其为战略级决策 不过具体形式和路径还未确定 或许仍有变数 一位知情人士称 小米造车或将由小米集团创始人雷军亲自带队
  • 软件质量保障之代码走查

    目的 代码走查有几个目的 第一个是让新同学快速熟悉代码并了解系统 第二个是做咨询防控的事前检查 避免引发线上故障 第三个是通过一起讨论和审查 加强团队代码阅读和编写能力 让大家编写出优秀的代码 代码走查的优点非常多 但是最核心的还是提前发现
  • 模2除法——用非常直观的例子解释

    前言 差错检测中有名唤CRC之方法 但很多学习者难以理解其运行原理 特别是模2除法 故博主将其原理以示例方式记录下来 以便同道稍作借鉴 因博主水平有限 难免会出现错误 希各位能多多包涵和给予建议 注意 本博客假设各位已理解CRC原理但对模2
  • javascript几个知识点

    本文总结一下javascript几个比较重要的知识点 包括scope chain this 和函数的一些高级特性 scope chain scope chain是javascript函数调用里最核心的概念 尤其是要理解闭包的概念的话 必须先
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • 时序预测

    时序预测 MATLAB实现趋势外推时间序列预测 含移动平均 指数平滑对比 目录 时序预测 MATLAB实现趋势外推时间序列预测 含移动平均 指数平滑对比 基本介绍 程序设计 学习总结 参考资料 基本介绍 MATLAB实现趋势外推时间序列预测
  • 《银行法律法规》一、经济金融基础知识——4、银行体系

    第四章 银行体系 第一节 银行起源和发展 考点1 商业银行产生与发展 概念 商业银行指能够吸收公众存款 发放贷款 办理结算等多种业务 以盈利为主要经营目标 经营货币的金融企业 在银行体系中占有重要地位 信用活动中起着主导作用 产生途径 现代
  • mount通过NFS挂载

    文章目录 mount通过NFS挂载 1 NFS介绍 2 安装 1 ubuntu服务器安装命令 2 客户端linux5 4安装指令 3 建立NFS共享文件目录 4 配置NFS共享配置文件 1 第一段的目录需要替换成自己的共享文件目录 2 第二
  • C++ 高性能Http服务器 - HelloWorld(一)

    本文使用 newobj 跨平台开发框架实现 Web 服务的搭建及业务处理 最终实现个人博客网站的Demo 其中使用Mysql Redis数据库 该框架实测可处理 6w 并发的请求并进行数据库处理 非常适合工作或学习中需要了解或应用C 开发w