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

本文使用 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 进行编译调试

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值