V语言编码规范
本文引用的文件
- README.md
- main.v
- server.v
- config.v
- runtime_config.v
- v2_config.v
- kernel.v
- pipeline.v
- context.v
- types.v
- registry.v
- worker_protocol.v
目录
引言
本规范面向VHTTPD项目的V语言开发,统一命名约定、文件组织、注释风格、格式化要求与代码审查流程。规范基于仓库现有实现与模块边界提炼,确保新增或修改代码与既有风格一致,提升可维护性与协作效率。
项目结构
- 顶层以功能域划分模块目录(如 src/admin、src/config、src/dispatch、src/executor、src/upstream、src/ws 等),每个目录内按职责进一步拆分文件。
- 入口与服务器生命周期位于 src/main.v 与 src/server.v;配置解析集中在 src/config/;调度内核在 src/dispatch/;执行器模型在 src/executor/;上游协议与帧定义在 src/upstream/transport/。
- 测试文件与业务文件同目录放置,便于定位与维护。
graph TB
A["src/main.v<br/>应用上下文与路由转发"] --> B["src/server.v<br/>进程启动/信号处理/多监听"]
B --> C["src/config/*.v<br/>配置加载/合并/校验"]
B --> D["src/dispatch/*.v<br/>调度内核/管道/上下文"]
D --> E["src/executor/*.v<br/>执行器注册/类型/选择"]
D --> F["src/upstream/transport/*.v<br/>Worker协议帧/编解码"]
E --> G["外部执行器<br/>php-worker / vjsx 宿主"]
F --> G
图示来源 - main.v:1-117 - server.v:1-372 - config.v:1-800 - kernel.v:1-151 - types.v:1-449 - worker_protocol.v:1-277
章节来源 - README.md:1-800 - main.v:1-117 - server.v:1-372
核心组件
- 应用与上下文
- App 组合了中间件、静态资源处理器与数据面运行时,并暴露控制面运行时。
- Context 扩展了请求上下文与请求ID上下文,贯穿整个请求链路。
- 服务器与生命周期
- 负责参数解析、时区配置、单/多监听模式、信号处理与优雅关停。
- 配置系统
- 支持 TOML 配置、变量展开、站点级覆盖、默认值合并与运行时校验。
- 调度内核
- 将不同协议(HTTP/Stream/MCP/WebSocket)统一为内核分发信封,构造 DispatchContext 并交由执行器处理。
- 执行器模型
- 内置执行器(none/php/php-cgi/vjsx)通过工厂与生命周期抽象接入,提供统一的运行期选择与能力描述。
- 上游协议
- Worker 协议定义了 HTTP/流式/MCP/WebSocket 的帧结构与错误分类,作为主进程与外部 worker 的契约。
章节来源 - main.v:10-23 - server.v:137-372 - config.v:394-424 - kernel.v:1-151 - types.v:65-127 - worker_protocol.v:4-112
架构总览
下图展示了从客户端到执行器的整体调用路径,以及管理面与观测面的关键节点。
sequenceDiagram
participant Client as "客户端"
participant Main as "App(路由)"
participant Ingress as "HttpIngressRuntime"
participant Kernel as "调度内核"
participant Exec as "执行器"
participant Worker as "外部Worker/宿主"
Client->>Main : HTTP/WS/Stream 请求
Main->>Ingress : 路由到对应方法
Ingress->>Kernel : 构建分发信封/上下文
Kernel->>Exec : 选择执行器并派发
Exec->>Worker : 通过Worker协议帧通信
Worker-->>Exec : 响应/流式帧
Exec-->>Ingress : 结果/状态
Ingress-->>Client : 返回响应/流
图示来源 - main.v:83-116 - kernel.v:30-121 - worker_protocol.v:4-112
详细组件分析
命名约定
- 包名与模块名
- 使用小写英文单词,必要时用下划线分隔复合词(例如 upstream、websocket)。
- 模块声明与文件名保持一致,避免大小写混用。
- 类型与结构体
- 采用帕斯卡命名(PascalCase),如 ServerConfig、WorkerConfig、DispatchContext、AdminRuntimeStats。
- 对外暴露的类型与方法一律大写开头,内部辅助类型可小写开头但需保持语义清晰。
- 函数与方法
- 公共函数与方法使用帕斯卡命名(如 load_vhttpd_config、merge、build_executor)。
- 私有函数使用小驼峰(如 decode_paths_config_map、escape_regex_literal)。
- 常量与枚举
- 常量使用全大写下划线(如 known_long_flags、vhttpd_version)。
- 枚举成员使用小驼峰(如 response、stream、upstream_plan)。
- 变量与字段
- 局部变量使用短小精悍的小驼峰(如 cfg、err、parts)。
- 结构体字段使用小驼峰,并通过 toml/json 标签映射外部键名(如 read_timeout_ms、app_entry)。
- 接口与回调
- 接口名以行为动词结尾(如 PipelineDispatcher),方法名表达动作(dispatch、id)。
- 回调类型使用 Fn 后缀(如 PluginStreamFrameFn)。
章节来源 - config.v:6-112 - v2_config.v:3-118 - types.v:9-35 - pipeline.v:114-118 - worker_protocol.v:4-112
文件组织结构规范
- 模块划分
- 按领域分目录:admin、config、dispatch、executor、upstream、ws、provider、relay 等。
- 每个目录包含该领域的核心类型、运行时、测试与工具文件。
- 文件命名
- .v 源文件使用小写加下划线(如 runtime_config.v、worker_protocol.v)。
- 测试文件与业务文件同名 + _test.v(如 store_test.v、agent_state_test.v)。
- 入口与装配
- 应用入口 main.v 仅做最小装配与路由转发,复杂逻辑下沉至子模块。
- server.v 集中进程级生命周期与信号处理。
- 配置分层
- config.v 定义基础结构体与加载;runtime_config.v 提供 merge/with_site 等运行时合并策略;v2_config.v 定义新版计划型配置结构。
章节来源 - main.v:1-23 - server.v:1-136 - config.v:448-482 - runtime_config.v:540-605 - v2_config.v:1-118
代码注释格式
- 单行注释
- 使用 // 进行简短说明,置于语句上方或行尾,保持简洁明确。
- 多行注释
- 用于段落性说明或复杂逻辑前置解释,建议放在函数/结构体顶部。
- 文档注释
- 对公共 API 添加目的、参数与返回值说明,便于自动生成文档与 IDE 提示。
- 锁序与并发约定
- 在关键文件中以注释形式声明锁层级与获取顺序,避免死锁。
- 变更与TODO
- 使用 TODO/FIXME 标注待办事项,附带责任人或问题编号。
章节来源 - server.v:3-24
代码格式化要求
- 缩进与空格
- 使用空格缩进,禁止使用制表符;每层缩进固定宽度。
- 换行与对齐
- 长表达式与参数列表合理换行,保持可读性;结构体字段对齐以提升扫描效率。
- 导入分组
- 标准库、第三方库、本地模块分组导入,组间空一行。
- 错误处理
- 优先使用 ? 传播错误,并在上层统一处理;避免吞掉错误。
- 日志与追踪
- 关键路径输出结构化日志,携带 request_id/trace_id 以便跨层追踪。
[本节为通用规范说明,不直接分析具体文件]
代码审查检查清单
- 正确性
- 是否遵循锁序与 defer 释放?是否存在潜在死锁风险?
- 错误分支是否完备?是否遗漏必要清理?
- 一致性
- 命名是否符合本规范?是否引入不一致的旧风格?
- 配置文件字段是否与结构体标签一致?
- 可维护性
- 是否将复杂逻辑拆分为独立函数/模块?
- 是否补充必要的注释与文档注释?
- 性能与安全
- 是否存在不必要的拷贝与大对象传递?
- 是否对用户输入进行校验与限制?
- 测试与可观测性
- 是否补充单元测试/集成测试?
- 是否增加关键指标与事件日志?
[本节为通用规范说明,不直接分析具体文件]
依赖关系分析
- 模块耦合
- main.v 依赖 server.v 与 dispatch 子系统;server.v 依赖 config、executor、upstream.transport。
- dispatch 子系统依赖 executor 与 transport 协议;executor 依赖 config 与运行时选择。
- 外部依赖
- 通过 veb/http/urllib 复用底层 HTTP 栈;与外部 php-worker/vjsx 宿主通过 Unix Socket 与 Worker 协议交互。
- 循环依赖规避
- 通过 ExecutorFactory 函数指针打破 main 与 executor 的循环依赖。
graph LR
M["main.v"] --> S["server.v"]
S --> C["config/*.v"]
S --> D["dispatch/*.v"]
D --> X["executor/*.v"]
D --> T["upstream/transport/*.v"]
X --> C
T --> X
图示来源 - main.v:1-23 - server.v:25-31 - registry.v:263-278
章节来源 - registry.v:263-278 - server.v:25-31
性能与并发注意事项
- 锁粒度与顺序
- 严格遵循已声明的锁层级,先高后低,defer 释放,避免长时间持有全局锁。
- 零拷贝与缓冲
- 尽量复用 map/slice,减少重复分配;大数据传输使用流式帧与 base64 字段按需启用。
- 超时与背压
- 队列容量与超时参数应结合负载调优;对上游连接设置合理的重试与退避策略。
- 资源清理
- 所有打开的连接/文件句柄必须保证关闭;进程退出时清理临时文件与套接字。
章节来源 - server.v:3-24 - worker_protocol.v:12-29
代码审查检查清单
- 命名与风格
- 类型/函数/变量/常量命名符合规范;无遗留的不一致风格。
- 结构与组织
- 新代码放入合适模块目录;测试文件与源码并列。
- 配置与契约
- 新增配置项同步更新结构体与标签;对外协议帧字段完整且稳定。
- 并发与资源
- 锁序正确;defer 释放;无内存泄漏与僵尸进程。
- 可观测性
- 关键路径有日志/事件;request_id/trace_id 贯穿。
- 测试覆盖
- 新增/修改逻辑具备相应测试用例;回归测试通过。
[本节为通用规范说明,不直接分析具体文件]
结论
本规范从命名、组织、注释、格式与审查五个维度统一 VHTTPD 的 V 语言实践。配合仓库现有的模块化设计与清晰的协议边界,有助于降低协作成本、提升稳定性与可演进性。建议在 PR 中显式对照本清单逐项自检。
[本节为总结性内容,不直接分析具体文件]
附录:命名与格式示例对照
- 变量名
- 推荐:cfg、err、parts、req_id
- 避免:C、E、P、RID
- 函数名
- 推荐:load_vhttpd_config、merge、build_executor
- 避免:LoadCfg、MergeCfg、BuildExe
- 类型名
- 推荐:ServerConfig、DispatchContext、WorkerResponse
- 避免:server_config、dispatch_context、worker_response
- 常量名
- 推荐:known_long_flags、vhttpd_version
- 避免:KnownLongFlags、Version
- 文件组织
- 推荐:src/config/runtime_config.v、src/executor/registry.v
- 避免:Src/Config/RuntimeConfig.V、src/EXECUTOR/Registry.V
[本节为示例对照,不直接分析具体文件]