Files
lingniu-vehicle-ingest/README.md
2026-07-01 07:37:50 +08:00

6.0 KiB
Raw Blame History

lingniu-vehicle-ingest

羚牛车辆数据接入平台 v2

设计目标

  • 协议接入统一抽象GB/T 32960、JT/T 808、Yutong MQTT 是默认生产接入JT/T 1078、JSATL12 作为显式 profile 的可选能力;信达 Push 仅保留为废弃兼容模块
  • 原子能力化:每个协议一个独立 Maven 模块 + 独立 AutoConfiguration + 独立配置开关
  • 业务 / 实时彻底解耦:本服务只负责 收 → 解析 → 校验 → 规整 → 投递 Kafka,不碰业务库
  • 高并发低延迟Netty + Disruptor + Java 25 虚拟线程;目标单节点 ≥ 5 万 msg/sP99 < 50 ms
  • 可观测、可回放、可灰度:统一 traceId、Envelope、幂等键、DLQ、原始报文冷存

技术栈

类别 选型
语言 Java 25
框架 Spring Boot 3.5.3
网络 Netty 4.2.9.Final
并发 Disruptor 4 + 虚拟线程 + StructuredTaskScope
消息队列 Kafkavin 分区,保证单车有序)
线上消息格式 Protobuf,调试走 JSON
MQTT 客户端 Eclipse Paho 1.2.5
会话缓存 Redis 生产索引 + Caffeine 内存降级
熔断/限流 Resilience4j 2
可观测 Micrometer + Prometheus + OpenTelemetry
冷存 S3 / OSS / 本地
构建 Maven + Spotless + ArchUnit

模块划分

lingniu-vehicle-ingest/
├── modules/
│   ├── core/
│   │   ├── ingest-api/              SPI + sealed 领域事件 + 注解
│   │   ├── ingest-codec-common/     公共编解码工具BCD/CRC/BCC/bit utils
│   │   ├── ingest-core/             Pipeline / Dispatcher / Disruptor / Session 桥
│   │   ├── session-core/            设备会话 + 鉴权 + Token + Redis/Memory SessionStore
│   │   ├── vehicle-identity/        跨协议车辆身份解析 + MySQL 外部标识绑定
│   │   └── observability/           metrics / tracing / health
│   ├── protocols/
│   │   ├── protocol-gb32960/        GB/T 32960
│   │   ├── protocol-jt808/          JT/T 808统一身份映射 + 事件 metadata 内部 VIN + 注册/鉴权/心跳/注销/位置/批量位置/参数/属性/媒体/透传/未知上行和坏帧兜底/断链清理会话/下行分包)
│   │   ├── protocol-jt1078/         JT/T 1078808 信令按需桥接 + 常用下行信令编码 + TCP/UDP RTP 媒体流分段归档 + 事件 metadata 内部 VIN + 坏 RTP 统一 RawArchive/Passthrough + 归档失败兜底 + SIM 身份映射)
│   │   └── protocol-jsatl12/        苏标主动安全报警附件optional-attachments profile
│   ├── inbound/
│   │   ├── inbound-mqtt/            MQTT 接入endpoint 生命周期 + profile 注册扩展 + 统一身份映射 + PEM 双向 TLS + 未知 profile/解析失败/profile异常/连接订阅失败兜底 + 统一 UNKNOWN 身份 metadata
│   │   └── inbound-xinda-push/      信达 Push 接入(废弃兼容模块,仅 -Plegacy-xinda 显式构建)
│   ├── sinks/
│   │   ├── sink-mq/                 Kafka producer + Protobuf Envelope
│   │   ├── sink-archive/            原始报文冷存
│   │   └── event-file-store/        可选兼容索引(旧 Parquet/DuckDB 路径)
│   ├── services/
│   │   ├── event-history-service/   Kafka 全字段事件消费 + 历史查询/导出
│   │   ├── vehicle-state-service/   Kafka 全字段事件消费 + Redis 热状态查询optional-latest-state profile
│   │   └── vehicle-stat-service/    Kafka 全字段事件消费 + 可配置日统计
│   └── apps/
│       ├── command-gateway/         HTTP → 设备下行命令808 位置/参数/属性/控制/区域删除/报警确认 + 1078 音视频控制)
│       ├── gb32960-ingest-app/      GB32960 TCP 接入 + Kafka 投递
│       ├── jt808-ingest-app/        JT808 TCP 接入 + Kafka 投递
│       ├── yutong-mqtt-app/         宇通 MQTT 接入 + Kafka 投递
│       ├── vehicle-history-app/     TDengine 历史查询 + RAW JSON
│       └── vehicle-analytics-app/   JT808 每日里程指标消费
├── docs/                           架构文档、模块图、实施计划
└── reference/                      参考资料

快速开始

# 要求JDK 25, Maven 3.9+
mvn -v
mvn clean install -DskipTests
mvn -pl :gb32960-ingest-app -am spring-boot:run
mvn -pl :jt808-ingest-app -am spring-boot:run

信达 Push 已废弃,不参与默认 Maven reactor、CI、Portainer 部署和历史消费链路;如需兼容排查,可显式使用 -Plegacy-xinda 构建。

JSATL12 附件上传不在默认 Maven reactor 中;需要时使用 -Poptional-attachments 构建。

Redis 最新状态查询不在默认 Maven reactor 中;需要时使用 -Poptional-latest-state 构建 vehicle-state-service

迁移说明

本项目是 lingniu-vehicle-data-reception 的 v2 重构,采用 strangler fig 渐进式迁移,旧项目保留只读参考。迁移路径与决策参见 ../REFRACTOR_PLAN.md

架构文档

  • 目标架构:docs/target-architecture.md
  • 内部字段模型:docs/vehicle-telemetry-internal-fields.md
  • 模块与数据流:docs/module-data-flow.html

核心原则

  1. 本服务不写业务库:历史、行程、在线检测、里程统计全部由 Kafka 下游消费者实现
  2. 协议即插拔:每个 protocol-* / inbound-* 都可独立开关(lingniu.ingest.<name>.enabled
  3. 顺序保证:同一 VIN 严格有序Disruptor hash + Kafka 分区 key
  4. 幂等消费Envelope 带 eventId,下游去重
  5. 原始可回放:协议接入会把 rawArchiveKey/rawArchiveUri 追加到事件 metadataKafka Envelope、TDengine raw_frames 和导出都使用 archive://... 逻辑 URI 追溯原始 bytes实际文件由 sink-archive 管理;event-file-store 仅作为旧 Parquet/DuckDB 查询索引兼容路径,不是默认生产历史库