当前位置: 首页 > news >正文

SkeyeVSS国标信令中心服务中HTTP服务架构设计

本文说明core/app/sev/vss信令服务中REST/JSON HTTP API的分层结构:Gin 引擎、全局中间件、/api路由组、泛型 Handler 与业务 Logic 契约,以及与SIP、流媒体(MS)、设备 RPC的协作关系。


源代码 点击直达

一、在整体进程中的位置

项目说明
启动main.gogo server.NewHttpSev(svcCtx).Start(),与SIP(TCP/UDP)SSEWebSocket并行运行。
监听":" + Config.Http.Port(仅端口,绑定0.0.0.0由 Gin 默认行为决定)。
框架Gingin.New(),默认ReleaseMode)。
API 前缀业务接口统一挂在/api下(见internal/server/http.go)。

二、分层结构总览

internal/logic/http/*

internal/handler/http

HttpSev.Start

gin.New()

全局: CORS + OPTIONS

Group /api

HttpHeader + Timeout

RegisterApiHandlers

newHandler / newHandlerWithParams

httpx.Parse -> Req

Context: IP + IsInternalReq

toResp(HttpResponse)

base / video / ms / gbs / onvif / notify

层级路径职责
Serverinternal/server/http.go创建 Engine、挂中间件、注册/api、监听端口。
Handlerinternal/handler/http/handler.gorouters.go解析请求、注入Context、调用 Logic、统一写出 JSON。
Logicinternal/logic/http/{base,video,ms,gbs,onvif,notify}具体业务;实现Path()+New()+DO()契约。
Interceptorinternal/interceptor/http.go/api组内:超时(及预留 Header Hooks)。
类型与上下文internal/types/types.gointernal/svc/service_context.goHttpResponseHttpRHandleLogic/HttpEHandleLogicServiceContext

三、Server 层:中间件与路由组

3.1 全局中间件(所有路径)

router.Use中:

  • CORSAccess-Control-Allow-Origin: *、Methods/Headers*、预检缓存Max-Age等。
  • JSON 倾向c.Set("content-type", "application/json")
  • OPTIONS:直接204 No ContentAbort,便于浏览器跨域预检。

当前未默认启用gin.Logger(),生产日志依赖项目统一logx/ 业务日志。

3.2/api

varaipGroup=router.Group("/api")aipGroup.Use(interceptor.HttpHeader(),interceptor.Timeout(time.Duration(Config.Timeout)*time.Millisecond))httpHandler.RegisterApiHandlers(svcCtx,aipGroup)
  • HttpHeader():现为透传Next(),可扩展为统一鉴权/Trace 等。
  • Timeout(Config.Timeout):对每个请求启 goroutine 执行c.Next(),超时则AbortWithStatusJSON(408, {"error":"request timeout"})
    • Config.Timeout来自VssSevConfig.Timeoutcore/tps/conf/config.go,字段与 YAML 一致,在代码中与time.Millisecond相乘,以实际配置文件为准,常见为毫秒量级整型)。
    • 注意:与「单接口长时间阻塞」(如设备录像轮询)需结合业务评估是否应调大超时或拆异步。

3.3 路由注册表

所有 HTTP 业务路由集中在internal/handler/http/routers.goRegisterApiHandlers,按领域分组:

分组包路径典型能力
baselogic/http/base/status/device-videos/ws-token
videologic/http/video取流地址、停流、流信息
mslogic/http/ms流组、按名查录像、MS 配置、reload
gbslogic/http/gbsCatalog、Invite、StopStream、回放控制、订阅
onviflogic/http/onvif发现、设备信息、Profile
notifylogic/http/notify流媒体回调:推/拉流、订阅、统计、HLS、帧信息等

完整路径以各 Logic 的Path()为准(例如GET /api/statusPOST /api/video/stream等)。


四、Handler 层:泛型适配与统一响应

4.1 两种入口

定义于internal/handler/http/handler.go

  1. newHandlerWithParams[Req, Logic]

    • 使用httpx.Parse将 Query / Path / JSON Body 绑定到Req
    • 调用logic.New(ctx, c, svcCtx).DO(req)
  2. newHandler[Logic](无请求体)

    • 直接logic.New(...).DO(),适用于纯GET或参数仅从 Path/Query 由 Logic 自行读取的场景(若仍用httpx.Parse需在 Logic 内处理,当前部分接口为无参DO())。

4.2 Context 注入

在调用New之前向context.Context写入:

Key含义
constants.HEADER_IPc.ClientIP(),便于下游直接获取。
constants.CTX_VSS_IS_INTERNAL_REQ是否「内部请求」:根据Referer的 host 是否为127.0.0.1/::1/localhostConfig.InternalIp判定。

业务可通过contextx.GetIsInternalReq(ctx)读取(例如internal/pkg/ms/api.go中按内外网区分行为)。

4.3 统一响应toResp

Logic 返回types.HttpResponse

typeHttpResponsestruct{Datainterface{}Err*response.HttpErr}
  • Err != nilresponse.New().RequestError(...),携带统一错误语义与localization
  • Data != nilSuccess写出业务数据。
  • 两者皆无 /resp == nil:成功但 body 为nil

Handler 顶层有recover, panic 时打栈日志,避免进程崩溃(与 Gin 默认行为叠加,以实际为准)。


五、Logic 层契约(接口驱动)

定义于internal/types/types.go

typeHttpHandleLogicBase[Logic any]interface{Path()stringNew(ctx context.Context,c*gin.Context,svcCtx*ServiceContext)Logic}typeHttpRHandleLogic[Logic,Req any]interface{HttpHandleLogicBase[Logic]DO(req Req)*HttpResponse}typeHttpEHandleLogic[Logic any]interface{HttpHandleLogicBase[Logic]DO()*HttpResponse}

约定习惯

  • 每个接口一个单例指针(如StatusLogicVVideosLogic),在routers.go中传给newHandler/newHandlerWithParams
  • New注入ctxgin.ContextServiceContext,便于读 Header、访问RPC/Redis/配置
  • DO只做业务,不直接操作c.JSON,保持可测响应格式统一

编译期检查:Logic 文件内常见:

var_types.HttpEHandleLogic[*statusLogic]=(*statusLogic)(nil)

六、导航代码

6.1video:播放与流信息

对接 VSS 内部能力与 MS/VSS 协作,如StreamPlayLogic生成播放相关能力、StreamStopLogic停止会话等(具体见各文件DO)。

6.2gbs:国标信令侧 HTTP 触发

将 HTTP 转为channel 消息SIP 发送(如 Catalog、Invite、StopStream、订阅、回放控制),与internal/logic/gbs_proc协程配合。

6.3ms:流媒体运维与查询

HTTP 代理调用MS 的 HTTP APIinternal/pkg/ms),如 all_groups、query_by_names、reload 等;部分逻辑结合contextx.GetIsInternalReq

6.4notify:流媒体事件回调

MS/边缘服务向 VSSPOST各类事件;公共逻辑在notify/common.go(如setStreamState:解析stream_name、校验通道存在、更新状态/保活)。与stream.New().Parse设备 RPC强相关。

6.5onvif:探测与元数据

设备发现、Profile 等,配置依赖Config.Onvif

6.6base:状态与辅助

  • /status:返回绑定地址、HTTP/SIP 端口、部分 SIP 参数(便于探活与运维)。
  • /device-videos:设备录像查询(SIP RecordInfo 聚合,见专项文档)。
  • /ws-token:签发 WebSocket 子协议用 Token。

七、与 WebSocket / SSE 的关系

通道端口说明
HTTP APIConfig.Http.Port本文主体,/api/...
WebSocketConfig.WS.Port独立net/http,见《VSS-WebSocket架构设计》
SSEConfig.SSE.Port独立服务,运维状态推送等

HTTP 中的/ws-token为 WebSocket 握手提供 Token,形成HTTP 辅助 + WS 长连接的组合。


八、扩展新接口的步骤建议

  1. internal/types(或现有 types 文件)增加请求/响应结构体(若需要)。
  2. internal/logic/http/<domain>新增xxxLogic,实现HttpRHandleLogicHttpEHandleLogic,实现Path()DO
  3. internal/handler/http/routers.gorouter.GET/POST(..., newHandler...)注册。
  4. 若需全链路超时,确认Config.Timeout是否足够;超长任务考虑异步化或单独调大(并评估Timeout中间件对 goroutine 的影响)。
  5. 若依赖内部调用方Referer,注意网关/反向代理是否改写Referer,以免影响GetIsInternalReq

九、设计要点小结

  1. 前缀统一:对外 JSON API 集中在/api,与端口、文档、网关规则一致。
  2. 契约清晰Path+New+DO+HttpResponse,Handler 处理器、Logic 业务逻辑。
  3. 解析统一:有 body 的接口优先httpx.Parse,减少手写ShouldBind
  4. 横切能力:CORS、OPTIONS、超时、(可扩展)Header 中间件;Context 注入 IP 与内部请求标记。
  5. 领域分包gbs/video/ms/notify/onvif/base边界清楚,notify与 MS 生命周期绑定紧密。

十、相关源码索引

说明路径
HTTP 服务启动core/app/sev/vss/internal/server/http.go
泛型 Handler / toRespcore/app/sev/vss/internal/handler/http/handler.go
路由注册core/app/sev/vss/internal/handler/http/routers.go
超时与 Header 中间件core/app/sev/vss/internal/interceptor/http.go
HTTP 契约类型core/app/sev/vss/internal/types/types.goHttpResponseHttpRHandleLogic等)
进程入口core/app/sev/vss/main.go
VSS 配置结构core/tps/conf/config.goVssSevConfig

可与《SkeyeVSS中WebSocket代码架构设计》对照阅读:二者共享ServiceContext,但监听端口与协议模型不同。

http://www.jsqmd.com/news/536769/

相关文章:

  • 中文大模型琅琊榜:MiniMax、GLM、Kimi如何领跑技术革新?
  • Pywinauto Recorder:3个差异化价值助力Web界面自动化测试
  • 告别卡顿!用SwiftFormer在iPhone上跑Transformer模型,实测延迟仅0.8ms
  • OpenClaw隐私保护:百川2-13B本地化部署下的数据全生命周期管理
  • 普林斯顿数学指南:从基础概念到前沿问题的全景解析
  • Java 反射:从“动态魔法”到生产实战的避坑指南
  • 4维突破:让Windows设备无缝融合Android生态的跨系统解决方案
  • 2025终极指南:快速移除Windows Defender的完整解决方案
  • OpenClaw云端体验:通过星图平台快速试用GLM-4.7-Flash
  • OpenClaw隐私保护:GLM-4.7-Flash本地数据处理方案
  • 企业网络改造不求人:手把手教你深信服防火墙旁挂部署(含NQA配置避坑指南)
  • Windows下OpenClaw安装指南:一键对接GLM-4.7-Flash模型服务
  • ClickHouse 3节点集群配置与分布式表实战指南
  • 50天学习FPGA第28天-时序设计案例分析
  • 克拉管厂家哪家好?双高筋缠绕管哪家好?2026克拉管生产厂家+克拉管厂家推荐实力榜单 - 栗子测评
  • 基于Matlab的最佳维纳滤波器盲解卷积算法探索
  • 探索永磁直驱风力发电系统模型
  • 如何用Spec Kit快速构建高质量软件:终极规范驱动开发指南
  • 告别纯视觉模型!用ChangeCLIP玩转遥感变化检测:手把手教你集成文本语义(附代码)
  • OpenClaw内存优化:Qwen3-32B在24G显存下的多任务调度
  • 2026年靠谱的演唱会专网技术维护品牌推荐 - 品牌宣传支持者
  • 基于eNSP的小型企业网络毕业设计:效率提升的拓扑优化与自动化配置实践
  • s2-pro多场景落地:跨境电商多语言产品介绍语音自动生成
  • Navicat连接MySQL报1227错误?3步搞定PROCESS权限配置(附截图)
  • OpenClaw对接QQ机器人全流程:基于nanobot镜像的轻量化方案
  • 阿里云OSS迁移AWS S3数据实战:从配置到监控的完整避坑指南
  • OpenClaw操作录制功能:百川2-13B模型学习人工工作流
  • OpenClaw监控方案:百川2-13B任务执行日志收集与分析
  • 探索GPT-3:Few-Shot Learning如何重塑语言模型的潜力边界
  • OpenClaw内存优化:百川2-13B-4bits模型在8GB内存设备上的运行方案