Skip to content

Latest commit

 

History

History
298 lines (223 loc) · 9.08 KB

File metadata and controls

298 lines (223 loc) · 9.08 KB

AsyncSqlServer

高并发 SQL Server 日志查询服务器,使用 C++ 和 Lua 实现。

项目介绍

AsyncSqlServer 是一个基于 Windows IOCP(I/O Completion Ports) 的高性能日志查询服务器,提供 HTTP/JSON 接口供外部系统查询存储在 SQL Server 中的日志数据。

核心特性

特性 说明
🚀 高并发网络层 基于 Windows IOCP 的异步非阻塞 I/O,支持数千并发连接
🧵 线程池 C++17 线程池,充分利用多核 CPU
🗄️ 连接池 ODBC 数据库连接池,避免频繁建立数据库连接
📝 Lua 脚本 可配置的业务逻辑层,无需重新编译即可修改查询逻辑
🔒 参数安全 ODBC 参数绑定防止 SQL 注入

技术架构

┌─────────────────────────────────────────────────┐
│              HTTP 客户端 / 测试脚本               │
└────────────────────┬───────────────────────────┘
                     │ HTTP/JSON
┌────────────────────▼───────────────────────────┐
│           TCP Server(IOCP 异步 I/O)            │
│     Winsock2 + AcceptEx + WSARecv/WSASend        │
├─────────────────────────────────────────────────┤
│           HTTP Parser / HTTP Response            │
├───────────────┬────────────────┬────────────────┤
│   Thread Pool │ Connection Pool│   Lua Engine    │
│  (C++17 线程) │  (ODBC 连接池) │  (Lua 5.4 脚本) │
├───────────────┴────────────────┴────────────────┤
│              SQL Executor (ODBC)                 │
└─────────────────────┬───────────────────────────┘
                      │ ODBC
┌─────────────────────▼───────────────────────────┐
│            SQL Server (LogDB 数据库)              │
└─────────────────────────────────────────────────┘

项目结构

├── CMakeLists.txt          # CMake 构建配置
├── README.md               # 本文档
├── include/
│   ├── server/
│   │   ├── tcp_server.h    # TCP 服务器(IOCP)
│   │   ├── http_parser.h   # HTTP 请求解析
│   │   └── http_response.h # HTTP 响应构建
│   ├── pool/
│   │   ├── thread_pool.h   # 线程池
│   │   └── connection_pool.h # 数据库连接池
│   ├── db/
│   │   └── sql_executor.h  # SQL 执行器
│   ├── lua/
│   │   └── lua_engine.h    # Lua 引擎封装
│   └── common/
│       ├── config.h        # 配置管理
│       └── logger.h        # 日志工具
├── src/                    # C++ 源代码
├── scripts/                # Lua 脚本
│   ├── query_config.lua    # 查询配置(SQL 构建)
│   ├── formatter.lua       # 格式化输出
│   └── router.lua          # 路由与参数验证
├── config/
│   └── server.conf         # 服务器配置文件
├── sql/
│   └── init.sql            # 数据库初始化脚本
└── test/
    └── test_client.py      # Python 测试客户端

依赖安装(Windows)

1. 必要工具

  • Visual Studio 2019/2022(含 C++ 桌面开发工作负载)
  • CMake 3.16+下载
  • Git

2. Lua 5.4

LuaBinaries 下载 Windows 预编译包:

  1. 下载 lua-5.4.x_Win64_dll17_lib.zip(MSVC 2019 版本)
  2. 解压到 C:\lua54
  3. 目录结构应为:
    C:\lua54\
    ├── include\    # lua.h lualib.h lauxlib.h
    ├── lib\        # lua54.lib
    └── bin\        # lua54.dll
    

3. ODBC Driver for SQL Server

  1. 下载安装 ODBC Driver 17 for SQL Server
  2. 安装后可在"ODBC 数据源管理器"中验证驱动是否可用

4. SQL Server

编译与运行

1. 初始化数据库

在 SQL Server Management Studio 或 sqlcmd 中执行:

sqlcmd -S localhost -U sa -P YourPassword123! -i sql\init.sql

2. 修改配置文件

编辑 config/server.conf,填写实际的数据库连接信息:

[database]
server=localhost
port=1433
database=LogDB
username=sa
password=YourStrongPassword123!

3. 使用 CMake 编译

REM 创建构建目录
mkdir build
cd build

REM 配置(指定 Lua 路径)
cmake .. -DLUA_ROOT=C:\lua54 -G "Visual Studio 17 2022" -A x64

REM 编译(Release 模式)
cmake --build . --config Release

REM 可执行文件位于 build\Release\AsyncSqlServer.exe

4. 运行服务器

REM 进入输出目录
cd build\Release

REM 启动服务器(使用默认配置文件)
AsyncSqlServer.exe

REM 或指定配置文件路径
AsyncSqlServer.exe C:\path\to\server.conf

服务器启动后显示:

[INFO] 配置文件加载成功: ./config/server.conf
[INFO] 数据库连接池初始化成功,连接数: 20
[INFO] Lua 引擎初始化成功,脚本目录: ./scripts
[INFO] 服务器已就绪,等待连接...
[INFO] API 地址: http://localhost:8080/api/health

Ctrl+C 优雅停止服务器。

API 文档

通用响应格式

{
  "code": 0,
  "message": "success",
  "data": { ... }
}

code0 表示成功,非 0 表示错误。

接口列表

GET /api/health — 健康检查

curl http://localhost:8080/api/health

响应:

{"status": "ok", "version": "1.0.0"}

GET /api/logs — 查询日志列表

查询参数:

参数 类型 默认值 说明
page 整数 1 页码
page_size 整数 20 每页条数(最大 100)
level 字符串 - 日志级别(DEBUG/INFO/WARN/ERROR/FATAL)
keyword 字符串 - 消息关键词搜索
source 字符串 - 来源模块过滤
start_time 字符串 - 开始时间(YYYY-MM-DDYYYY-MM-DD HH:MM:SS
end_time 字符串 - 结束时间
format 字符串 json 输出格式(json/text/csv)
curl "http://localhost:8080/api/logs?level=ERROR&page=1&page_size=10"

GET /api/logs/{id} — 查询单条日志

curl http://localhost:8080/api/logs/42

GET /api/logs/stats — 查询日志统计

curl http://localhost:8080/api/logs/stats

响应示例:

{
  "code": 0,
  "message": "success",
  "data": [{
    "total_count": "150",
    "error_count": "12",
    "warn_count": "25",
    "info_count": "100",
    "debug_count": "13"
  }]
}

Lua 脚本配置说明

所有 Lua 脚本位于 scripts/ 目录,服务器启动时自动加载。修改脚本后需要重启服务器。

query_config.lua — 查询 SQL 构建

核心函数 build_query(params) 根据 HTTP 请求参数构建 SQL 语句。可自定义过滤条件、排序规则等。

formatter.lua — 输出格式化

核心函数 format_result(json_data, format) 处理查询结果格式化,支持 JSON、纯文本、CSV 三种输出格式。

router.lua — 路由与参数验证

  • route_request(path, method) — 路由匹配
  • validate_params(path, params) — 参数合法性验证(返回空字符串表示通过,返回错误消息表示失败)

测试

REM 确保服务器已启动
REM 运行所有测试
python test\test_client.py --host localhost --port 8080

REM 并发测试(100 并发请求)
python test\test_client.py --concurrency 100

REM 跳过并发测试
python test\test_client.py --skip-concurrent

性能调优建议

配置项 建议值 说明
threads CPU 核心数 × 2 IOCP 工作线程数
pool_size 20~50 数据库连接池大小
max_connections 1000~5000 最大并发 TCP 连接数

注意:Windows IOCP 是 Windows 平台最高效的 I/O 多路复用机制,与 Linux 的 epoll 等效,可支持数万并发连接。

许可证

MIT License