# Go Vehicle Gateway 验证手册 本文档用于验证 Go 重构运行面: - `go-vehicle-gateway`:GB32960 TCP、JT808 TCP、宇通 MQTT 接入。 - `go-history-writer`:Kafka RAW 写 TDengine。 - `go-stat-writer`:Kafka RAW 写 MySQL 每日指标。 - `go-realtime-api`:Kafka unified event 写 Redis,并提供实时查询 API。 ## 本地构建验证 ```bash cd go/vehicle-gateway go test ./... go build ./cmd/gateway go build ./cmd/history-writer go build ./cmd/stat-writer go build ./cmd/realtime-api ``` ## 镜像构建 ```bash cd go/vehicle-gateway docker build -t vehicle-gateway-go:local . ``` 同一个镜像包含四个二进制: - `/app/gateway` - `/app/history-writer` - `/app/stat-writer` - `/app/realtime-api` ## Portainer 部署 Go 旁路 stack 文件: ```bash deploy/portainer/docker-compose-go.yml ``` 必填变量: ```bash LINGNIU_GO_IMAGE_VERSION= KAFKA_BROKERS=172.17.111.56:9092 TDENGINE_DSN=root:@ws(172.17.111.57:6041)/lingniu_vehicle_ts MYSQL_DSN=lingniu_vehicle:@tcp(rm-bp179zbv481rnw3e2.mysql.rds.aliyuncs.com:3306)/lingniu_vehicle_data?parseTime=true&charset=utf8mb4,utf8&loc=Asia%2FShanghai IDENTITY_MYSQL_DSN=${MYSQL_DSN} VEHICLE_IDENTITY_TABLE=vehicle_identity_binding REDIS_ADDR=r-bp1u741kij7e51i481.redis.rds.aliyuncs.com:6379 REDIS_PASSWORD= REDIS_DB=50 ``` 宇通 MQTT 开启时再配置: ```bash YUTONG_MQTT_ENABLED=true YUTONG_MQTT_URI= YUTONG_MQTT_TOPICS=/ytforward/shln/+ YUTONG_MQTT_CLIENT_ID=lingniu-go-yutong-mqtt YUTONG_MQTT_USERNAME= YUTONG_MQTT_PASSWORD= ``` ## ECS 进程检查 ```bash docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' \ | egrep 'go-vehicle-gateway|go-history-writer|go-stat-writer|go-realtime-api|NAMES' ss -lntp | egrep ':(808|32960|20210)\b' ``` ## Kafka 验证 优先使用 smoke 脚本做可重复检查: ```bash python3 tools/go_kafka_prod_smoke.py --host 114.55.58.251 --user root --max-lag 100 ``` 脚本会检查 `vehicle.raw.go.gb32960.v1`、`vehicle.raw.go.jt808.v1`、`vehicle.raw.go.yutong-mqtt.v1`、`vehicle.event.go.unified.v1` 是否存在,并汇总 `go-history-writer`、`go-stat-writer`、`go-realtime-api` 的消费 lag。运行环境需要 SSH 免密或已建立可用的 SSH 认证方式。 手工核对命令: ```bash kafka-console-consumer --bootstrap-server 172.17.111.56:9092 \ --topic vehicle.raw.go.jt808.v1 --max-messages 1 --timeout-ms 10000 kafka-console-consumer --bootstrap-server 172.17.111.56:9092 \ --topic vehicle.raw.go.gb32960.v1 --max-messages 1 --timeout-ms 10000 kafka-console-consumer --bootstrap-server 172.17.111.56:9092 \ --topic vehicle.raw.go.yutong-mqtt.v1 --max-messages 1 --timeout-ms 10000 kafka-console-consumer --bootstrap-server 172.17.111.56:9092 \ --topic vehicle.event.go.unified.v1 --max-messages 1 --timeout-ms 10000 kafka-consumer-groups --bootstrap-server 172.17.111.56:9092 \ --describe --group go-history-writer kafka-consumer-groups --bootstrap-server 172.17.111.56:9092 \ --describe --group go-stat-writer kafka-consumer-groups --bootstrap-server 172.17.111.56:9092 \ --describe --group go-realtime-api ``` ## TDengine 验证 ```sql USE lingniu_vehicle_ts; SHOW STABLES; SELECT COUNT(*) FROM raw_frames; SELECT COUNT(*) FROM vehicle_locations; SELECT COUNT(*) FROM vehicle_mileage_points; ``` ## MySQL 验证 ```sql SELECT protocol, metric_key, COUNT(*) FROM vehicle_daily_metric GROUP BY protocol, metric_key; SELECT * FROM vehicle_daily_metric WHERE metric_key IN ('daily_mileage_km', 'daily_total_mileage_km') ORDER BY updated_at DESC LIMIT 20; ``` ## Redis 实时查询 ```bash curl -sS 'http://115.29.187.205:20210/api/realtime/vehicles/' curl -sS 'http://115.29.187.205:20210/api/realtime/vehicles//online' curl -sS 'http://115.29.187.205:20210/api/realtime/vehicles//protocols/JT808' ``` ## 验收证据 正式切换前至少记录: - 一个真实 GB32960 VIN 的 RAW、location、mileage point、Redis snapshot。 - 一个真实 JT808 VIN/phone 的 RAW、location、mileage point、daily metric、Redis snapshot。 - 一个真实宇通 MQTT VIN 或 device_id 的 RAW、Redis snapshot。 - `go-history-writer` 和 `go-stat-writer` 重启后 Kafka offset 能继续推进。