|
C++ 高性能Http服务器 - HelloWorld(一)
本文使用 newobj 跨平台开发框架实现 Web 服务的搭建及业务处理,最终实现个人博客网站的Demo,其中使用Mysql、Redis数据库。该框架实测可处理 6w+并发的请求并进行数据库处理。
非常适合工作或学习中需要了解或应用C++开发web服务的同学构建使用。
newobj跨平台开发框架:https://github.com/Liuccysdgg/newobj
一、HelloWorld
部分代码预览

演示效果

环境搭建
操作系统: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 &#34;public/environment.h&#34;
#include &#34;util/system.h&#34;
#include &#34;util/time.h&#34;
#include &#34;network/http/http_client_plus.h&#34;
#include &#34;network/http/http_center.h&#34;
#include &#34;network/http/http_request.h&#34;
#include &#34;network/http/http_response.h&#34;
#include &#34;network/http/http_reqpack.h&#34;
#include &#34;network/http/http_router.h&#34;
#include &#34;network/http/http_interceptor.h&#34;
#include &#34;network/http/http_website.h&#34;
int main()
{
// 配置文件
newobj::json config;
config.parse_file(&#34;./res/config.json&#34;);
// 创建控制中心
auto center = new network::http::center;
center->create(config);
// 通过域名获取 website 站点对象指针
auto website = center->website(&#34;0.0.0.0&#34;);
/************************ 添加控制器\拦截器\静态文件处理 **********************************/
// 获取路由
auto router = website->router();
// 获取拦截器
auto interceptor = router->interceptor();
// 增加请求处理 (lamaba 方式)
router->subscribe(&#34;/hello&#34;,network::http::GET,[](network::http::request* request,network::http::response* response){
// 发送 文本
response->send((nstring)&#34;<h1>Hello!,This is newobj Web Server</h1>&#34;);
});
// 启动控制中心
if (center->start() == false)
{
newobj::log->fatal(center->last_error());
return 0;
}
newobj::log->info(&#34;start success&#34;);
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 进行编译调试 |
|