Skip to content

About

交通违法行为处理全栈工程,基于 Spring Boot 与 Flutter,集成权限认证、Kafka/CDC、Elasticsearch、RAG、敏感数据保护及多架构实验。

Resources

Stars

3 stars

Watchers

1 watching

Forks

Latest commit

 

History

826 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

交通违法行为处理管理系统

CI License: Educational

面向交通违法处理、驾驶员服务和后台监管的全栈工程项目。项目最初来自毕业设计,当前已经按更工程化的方向持续演进:后端以 Spring Boot 单体为主线,同时保留 Spring Cloud、Go、Quarkus 等实现作为架构实验;前端以 Flutter Web 为主要联调入口。

当前主线关注点不再只是 CRUD 展示,而是围绕真实业务链路补齐权限、幂等、消息、检索、RAG、敏感数据保护和本地一键启动能力。

快速导航

入口 说明
一键启动 启动 Docker 依赖、后端、Flutter Web 和本地 AI 环境
后端包结构 Spring Boot 主后端的分层、领域包和命名规则
数据库设计 MySQL 表、角色、业务关联、敏感字段和 RAG 表设计
压测报告 2026-09-21 四后端 k6(Spring / Cloud / Go / Quarkus);历史 Spring 基线见 2026-06-01
脚本说明 启动、Debezium、AI 链路测试等脚本参数

当前主线

模块 路径 状态
Spring Boot 主后端 finalAssignmentBackend 主线实现,承载认证、业务、审计、AI、RAG、CDC、ES
Flutter 前端 final_assignment_front 当前主要目检与联调入口,管理员端和驾驶员端共用
React 前端 final_assignment_front_react 保留的管理端实现
Spring Cloud 版本 finalAssignmentCloud 微服务拆分实验
Go 版本 final_assignment_backend_go Go 后端实验
Quarkus 版本 final_assignment_backend_quarkus Quarkus 后端实验

角色入口

角色 前端入口 主要职责
驾驶员 Flutter Web 驾驶员端 查看个人资料、违法详情、缴费、申诉、车辆登记、进度消息和地图
普通管理员 ADMIN Flutter Web 管理端 处理驾驶员、车辆、违法、罚款、扣分、申诉等业务
超级管理员 SUPER_ADMIN Flutter Web 管理端的技术治理入口 审查操作日志/登录日志、管理 RAG 资料、执行索引/回填等高风险操作

核心业务

  • 管理员端:驾驶员、车辆、违法行为、罚款、扣分、申诉、日志、系统配置管理
  • 驾驶员端:个人资料、违法详情、罚款缴纳、用户申诉、车辆登记、进度消息、地图入口
  • 超级管理员端:操作日志审查、RAG 资料录入、知识库索引与回填管理
  • AI 助手:驾驶员常见问题、管理员业务辅助、RAG 检索增强问答、前端页面跳转/填单能力探索
  • 实时链路:WebSocket/SSE、Kafka 异步消息、死信监听、业务进度推送

工程化能力

  • Spring Security + JWT + BCrypt 认证授权
  • ADMIN 与 SUPER_ADMIN 角色边界,普通管理员负责业务处理,超级管理员负责日志与 RAG 管理
  • MyBatis Plus + MySQL 核心数据访问
  • Redis + Caffeine 多级缓存
  • Kafka / Redpanda 异步事件、审计与幂等处理
  • Debezium + Kafka Connect 捕获 MySQL binlog,异步同步到 Elasticsearch
  • Elasticsearch 作为搜索读模型,避免将敏感明文直接写入搜索索引
  • Ollama + Spring AI / LangChain4j + GraalPy 支持本地 AI、联网搜索和 Python 脚本能力
  • RAG 支持手工录入、文档上传、表格上传、PDF 文本解析、分块、索引任务和检索
  • 敏感字段支持 AES-GCM 密文列与 HMAC blind-index 查询列
  • 统一 Kafka Listener 幂等处理器,减少重复反序列化、重复请求判断、成功/失败历史标记代码

架构速览

Flutter Web
  -> Spring Security + JWT
  -> Spring Boot 业务 API
  -> MyBatis Plus + MySQL
  -> Redis / Caffeine
  -> Redpanda(Kafka API) + Debezium
  -> Elasticsearch 搜索读模型
  -> Ollama / GraalPy / RAG

主线后端按“领域归属优先、框架分层其次”的方式组织:认证、业务、审计、管理、AI/RAG、CDC、搜索和共享基础设施各自收口。详细包结构见 finalAssignmentBackend/PACKAGE_LAYOUT.md。

压测与性能基线

全栈容器化与监控

compose.app.yml 在 docker-compose.yml(基础设施)之上加入应用与监控层,一条命令从零拉起完整系统:

cp compose.env.example .env   # 填入本地凭据(仅本地开发用)
docker compose -f compose.app.yml up -d --build
  • Spring 主后端(多阶段 Dockerfile,9080)与 Go 后端(18080)随 MySQL/Redis/ES/Kafka 一起启动
  • Prometheus(9091)按 observability/prometheus.yml 抓取两个后端的 /actuator/prometheus
  • Grafana(3301)自动装载 observability/grafana/dashboards/ 中的 SLO 看板与告警规则(observability/alerts.yml),指标口径与 docs/reliability/slo.md 对齐

CI(.github/workflows/ci.yml)覆盖四后端构建与测试、React typecheck+build、Flutter analyze+test,以及两个应用镜像的构建验证。

仓库中出现的所有密码/密钥(docker-compose.yml、k6 配置等)均为本地开发默认值,可通过 .env / PERF_* 环境变量覆盖,请勿在任何真实环境复用。

一键启动

推荐从仓库根目录使用脚本启动。

Windows:

scripts\start-all.bat

Linux / macOS:

sh scripts/start-all.sh

默认会尝试启动:

  1. Docker Desktop / Docker 服务
  2. scripts/dev-compose.yml 中的本地依赖
  3. Ollama
  4. Spring Boot 后端
  5. 交互选择的前端;Flutter Web 默认访问 http://127.0.0.1:3000,React Vite 默认访问 http://127.0.0.1:5173

如只启动前后端,可跳过 Docker/Ollama:

set START_LOCAL_SERVICES=false
scripts\start-all.bat

更多启动参数见 scripts/README.md。启动失败时脚本会打印最近日志、端口占用和 Docker Compose 状态;按 Ctrl-C 会停止前后端,并默认停止本项目 Docker Compose 依赖和本次脚本启动的 Ollama;完整日志位于 artifacts/startup/<timestamp>/。

React 前端通过 start-all -f react 启动时会自动把 VITE_API_BASE_URL 和 VITE_WS_BASE_URL 指向所选后端的对外地址;Spring Boot / Quarkus / Go / Spring Cloud 默认都走 8080(REST + WebSocket),Spring/Quarkus 的内部 REST 仍在 9080。脚本同时会把后端允许的 FRONTEND_URL 默认设置为所选前端 origin。

Go 后端默认使用 BACKEND_PORT=8080;如果 Windows 报告 8080 没有监听进程但不可绑定,脚本会自动回退到 18080、18081、18082,并同步 React / Flutter 的 API/WebSocket 目标。显式设置 BACKEND_PORT 时不会自动回退,候选端口可通过 GO_BACKEND_FALLBACK_PORTS 调整。Go runner 会默认把 GOCACHE 放到 artifacts/go-build-cache,并先构建到本次 artifacts/startup/<timestamp>/go-backend.exe 后再运行,避免系统 build cache 权限或旧 go run 残留进程影响一键启动。

Windows 下 start-dev.ps1 会在启动 Flutter 前清理仍占用 Web 端口(默认 3000)的残留 flutter run -d web-server 进程,避免上一次未停干净的开发服务器导致本次 Flutter 端口绑定失败;只会按命令行特征识别 Flutter 残留,其它占用端口的进程只会被提示、不会被误杀。前端就绪后默认会在浏览器中打开,可用环境变量 OPEN_BROWSER=false 关闭。

本地依赖

主线开发建议准备:

  • JDK 23 或 25
  • Maven 3.9+
  • Flutter 3+
  • Docker Desktop
  • 本地 MySQL 8.0+
  • Ollama

scripts/dev-compose.yml 提供:

  • Redis
  • Redpanda
  • Elasticsearch 9.4.1
  • Debezium Connect

Redpanda Kafka 默认暴露到本机 9092。Windows 的 Hyper-V/WSL 可能会保留该端口段,导致 Docker 报 ports are not available;start-all / start-env 会在 9092 不可绑定时自动回退到 19092,并同步后端 Kafka bootstrap 变量。手动运行 docker compose 时可显式设置 REDPANDA_KAFKA_HOST_PORT=19092,或用 REDPANDA_KAFKA_FALLBACK_PORTS 调整候选端口。

Elasticsearch 默认使用 Elastic 官方 GA 9.4.1。后端 Java client 由 Spring Boot 4.0.1 管理为 elasticsearch-java 9.2.2,可连接同主版本更高 minor 的服务端;如果需要调用 9.4 专属强类型 API,再单独升级客户端依赖。需要验证其他版本时,可用 ELASTICSEARCH_IMAGE=docker.elastic.co/elasticsearch/elasticsearch:<version> 覆盖本地镜像。

MySQL 默认按本机服务使用,连接库名为 traffic。密码、JWT、AI、加密密钥等通过环境变量注入。

关键环境变量

后端常用配置:

DB_USERNAME=root
DB_PASSWORD=your_password
BACKEND_URL=http://localhost:8080
JWT_SECRET=replace_with_a_real_secret

AI/RAG:

OLLAMA_ENABLED=true
OLLAMA_URL=http://localhost:11434
OLLAMA_MODEL=llama3.2
RAG_ENABLED=true
RAG_INDEXING_ENABLED=true
RAG_EMBEDDING_ENABLED=true
RAG_EMBEDDING_PROVIDER=ollama
RAG_EMBEDDING_MODEL=nomic-embed-text
RAG_EMBEDDING_DIMENSIONS=768
RAG_RETRIEVAL_ENABLED=true

敏感字段加密与 blind-index:

SENSITIVE_DATA_ENCRYPTION_ENABLED=true
SENSITIVE_DATA_ENCRYPTION_KEY=<base64-32-byte-key-or-strong-secret>
SENSITIVE_DATA_BLIND_INDEX_KEY=<separate-base64-32-byte-key-or-strong-secret>

后量子认证(可选,默认 HS256,不影响既有行为):

# 切 ML-DSA-65 启用后量子 JWT 签名;留空则仍为 HS256
JWT_ALGORITHM=ML-DSA-65
# ML-DSA 密钥(PEM,PKCS#8 私钥 / SPKI 公钥)。留空则启动生成临时密钥(重启失效,仅演示)
JWT_ML_DSA_PRIVATE_KEY=
JWT_ML_DSA_PUBLIC_KEY=
# 仅单体后端:refresh token 静态加密用的 ML-KEM-768 密钥(PEM)。留空则启动生成临时密钥
JWT_ML_KEM_PRIVATE_KEY=
JWT_ML_KEM_PUBLIC_KEY=

说明:JDK 25 自带 SunEC 不提供 ML-KEM/ML-DSA,已引入 Bouncy Castle。ML-DSA 签 JWT 因 jjwt 暂不支持,走自建 signing input + BC Signature;refresh token 由 ML-KEM 信封 + AES-256-GCM 静态加密存储。切换算法后既有 refresh token 失效,用户需重新登录;refresh_tokens.token 列已扩为 TEXT(见 finalAssignmentBackend/src/main/resources/db/refresh_tokens_alter_token_text.sql)。

CDC 到 Elasticsearch:

CDC_ELASTICSEARCH_ENABLED=true
CDC_ELASTICSEARCH_TOPIC_PATTERN=traffic\.traffic\.(driver_information|vehicle_information|sys_user)

MySQL CDC 到 Elasticsearch

当前搜索同步链路:

MySQL binlog
  -> Debezium Connect
  -> Redpanda(Kafka API)
  -> Spring Boot CDC Consumer
  -> Elasticsearch

本地 MySQL 需要开启 row-based binlog:

[mysqld]
server-id=223344
log-bin=mysql-bin
binlog_format=ROW
binlog_row_image=FULL

CDC 账号示例:

CREATE USER 'debezium'@'%' IDENTIFIED BY 'change_this_password';
GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'debezium'@'%';
FLUSH PRIVILEGES;

启动依赖并注册连接器:

docker compose -f scripts\dev-compose.yml up -d redpanda elasticsearch debezium-connect
$env:MYSQL_CDC_PASSWORD='change_this_password'
powershell -ExecutionPolicy Bypass -File scripts\debezium\register-mysql-cdc.ps1

敏感数据治理

身份证号、手机号、银行卡号等敏感数据采用三层处理:

  • MySQL 原业务列保留兼容旧逻辑
  • 新增 *_ciphertext 列保存密文
  • 新增 *_blind_index 列用于精确查询

后端启动时会通过 SensitiveDataSchemaMigration 检查并补齐密文字段、blind-index 字段和索引,然后对历史明文数据回填密文与 blind-index。查询层优先使用 blind-index 精确匹配,避免继续依赖明文等值查询。

Elasticsearch 文档只写入脱敏展示值或低风险字段,不写入完整身份证号、手机号和银行卡号。

RAG 资料录入

超级管理员可以通过 RAG 管理接口录入资料:

  • 手工文本
  • Markdown / TXT
  • CSV / TSV / JSON
  • DOCX
  • XLSX
  • PDF 文本型文件

当前 PDF 解析基于 PDFBox,只支持可提取文本的 PDF;扫描版图片 PDF 需要先 OCR。

资料入库后会写入 rag_document 和 rag_chunk,同时为每个 chunk 创建 rag_embedding_task。默认 embedding provider 为 Ollama nomic-embed-text,后台定时任务会把待处理 chunk 转为向量并写入 Elasticsearch rag_chunk_current alias,MySQL 侧只记录 embedding_model、embedding_hash 和处理状态。首次使用前需要先准备模型:

ollama pull nomic-embed-text

如需手动触发一批向量化任务,可由超级管理员调用:

POST /api/rag/admin/embedding/run?limit=25

RAG 数据表定义见:

  • finalAssignmentBackend/src/main/resources/rag/rag_schema.sql

后端包结构

后端已经从单纯的平铺包逐步拆成按领域归属组织的结构。详细说明见:

数据库设计

数据库设计文档已按当前业务域重新整理:

重点关系:

  • sys_user 统一承载驾驶员用户、普通管理员、超级管理员账号
  • 驾驶员账号通过 driver_information.user_id 关联司机档案
  • 车辆通过 driver_vehicle 与驾驶员建立多对多绑定
  • 违法、罚款、扣分、申诉围绕 offense_record 串联
  • RAG 使用独立的 rag_document、rag_chunk、rag_embedding_task,向量写入 Elasticsearch rag_chunk_current

Spring Cloud 微服务版本

finalAssignmentCloud 是基于 Spring Cloud 的微服务拆分实验版本,将单体应用按业务域和技术职责拆分为 9 个独立服务。该版本保持与主线相同的业务能力,同时演示了云原生架构下的服务治理、分布式链路、配置中心和性能优化实践。

架构概览

Flutter Web / React
  ↓
API Gateway (Spring Cloud Gateway)
  ↓
├─ Auth Service (认证授权 JWT)
├─ User Service (用户角色权限)
├─ Traffic Service (违章罚款扣分申诉 + ShardingSphere 分库分表)
├─ Audit Service (审计日志)
├─ System Service (系统配置)
├─ RAG Service (文档检索问答)
└─ Search Service (全文搜索)
  ↓
Common Library (共享基础设施)
  ↓
Nacos (服务注册与配置中心)
MySQL / Redis / Elasticsearch / Kafka

服务列表

服务 端口 职责 状态
Gateway 8080 API 网关、路由、限流、认证前置 ✅ 生产就绪
Auth 8081 JWT 签发、刷新、用户认证 ✅ 生产就绪
User 8082 用户管理、角色权限、驾驶员档案 ✅ 生产就绪
Traffic 8083 违章、罚款、扣分、申诉、车辆(含分库分表) ✅ 生产就绪
Audit 8084 操作日志、登录日志、审计查询 ✅ 生产就绪
System 8085 系统配置、字典管理 ✅ 生产就绪
Common - 共享库:安全、缓存、消息、工具 ✅ 生产就绪
RAG via Gateway 文档上传、分块、向量化、语义检索 ✅ 生产就绪
Search via Gateway Elasticsearch 全文搜索 ✅ 生产就绪

技术栈

Spring Cloud 生态

  • Spring Cloud Gateway - API 网关
  • Nacos Discovery - 服务注册与发现
  • Nacos Config - 分布式配置中心
  • OpenFeign - 声明式服务调用
  • Spring Cloud LoadBalancer - 客户端负载均衡

数据访问与存储

  • MyBatis Plus - ORM 框架
  • ShardingSphere JDBC 5.5.1 - 分库分表中间件(Traffic 服务)
  • MySQL 8.0 - 关系型数据库
  • Redis 7 - 分布式缓存
  • Elasticsearch 8.11 - 搜索引擎

消息与事件

  • Kafka / Redpanda - 异步消息队列
  • Debezium - CDC 数据变更捕获

安全与认证

  • Spring Security - 安全框架
  • JWT - 无状态认证
  • BCrypt - 密码加密

AI 与 RAG

  • Spring AI - AI 应用框架
  • Ollama - 本地 LLM 推理
  • Vector Embeddings - 语义向量化

分库分表设计

Traffic 服务使用 ShardingSphere JDBC 对高频表实现水平分片:

分片策略

  • offense_record - 按 record_id 哈希分 4 表
  • fine_record - 按 fine_id 哈希分 4 表
  • offense_payment - 按 payment_id 哈希分 4 表
  • appeal_acceptance - 按 acceptance_id 哈希分 4 表

优势

  • 单表数据量降低 75%,查询性能提升
  • 支持水平扩展到多个数据库实例
  • 业务代码无感知,完全由 ShardingSphere 路由

服务间通信

同步调用

  • OpenFeign - 声明式 REST 客户端
  • 服务发现 - 通过 Nacos 自动路由
  • 负载均衡 - 客户端负载均衡策略
  • 熔断降级 - 可选集成 Sentinel

异步消息

  • Kafka Topic - 按业务域拆分
  • 事件驱动 - 审计日志、状态变更、通知推送
  • 幂等处理 - 统一消息去重机制

配置中心

所有服务通过 Nacos Config 集中管理配置:

# 服务发现
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: ${NACOS_NAMESPACE:}
        group: ${NACOS_GROUP:DEFAULT_GROUP}
      config:
        server-addr: localhost:8848
        file-extension: yaml

配置优先级

  1. Nacos 动态配置(最高优先级,支持热更新)
  2. 本地 application.yml
  3. 环境变量覆盖

一键启动

方式 1:Docker Compose(推荐)

启动所有基础设施:

cd finalAssignmentCloud
docker compose up -d

包含服务:

  • MySQL 8.0 (3306)
  • Redis 7 (6379)
  • Elasticsearch 8.11 (9200)
  • Kafka + Zookeeper (9092)
  • Nacos 2.3 (8848)

等待所有服务健康检查通过(约 2-3 分钟):

docker compose ps

方式 2:IDEA 多服务启动

  1. 在 IntelliJ IDEA 中打开 finalAssignmentCloud 模块

  2. 按顺序启动(推荐启动顺序):

    • Common(无需启动,作为依赖)
    • Gateway
    • Auth
    • User
    • Traffic
    • Audit
    • System
    • RAG(可选)
    • Search(可选)
  3. 验证服务注册:访问 http://localhost:8848/nacos(用户名/密码:nacos/nacos)

方式 3:Maven 命令行启动

# 编译所有模块
mvn clean install -DskipTests -f finalAssignmentCloud/pom.xml

# 启动各服务(每个命令在独立终端)
cd finalAssignmentCloud/finalassignmentcloud-gateway && mvn spring-boot:run
cd finalAssignmentCloud/finalassignmentcloud-auth && mvn spring-boot:run
cd finalAssignmentCloud/finalassignmentcloud-user && mvn spring-boot:run
cd finalAssignmentCloud/finalassignmentcloud-traffic && mvn spring-boot:run
cd finalAssignmentCloud/finalassignmentcloud-audit && mvn spring-boot:run
cd finalAssignmentCloud/finalassignmentcloud-system && mvn spring-boot:run

性能测试

Spring Cloud 版本提供完整的 k6 性能测试套件,覆盖所有 9 个微服务的 25+ 个端点。

快速验证

cd k6-tests

# 烟雾测试(30秒,验证所有端点可用)
k6 run 01-smoke-test.js

# 负载测试(9分钟,50-100 并发用户)
k6 run 02-load-test.js

# 压力测试(15分钟,100-300 并发用户)
k6 run 03-stress-test.js

完整测试套件

cd k6-tests
./run-tests.sh

包含测试:

  • 烟雾测试 - 验证所有服务健康状态
  • 负载测试 - 模拟正常运营负载
  • 压力测试 - 测试系统极限
  • 关键流程测试 - 端到端业务流程
  • RAG 专项测试 - 文档检索性能
  • 分库分表测试 - ShardingSphere 性能验证

性能目标

指标 目标 可接受
P95 响应时间 < 500ms < 1s
P99 响应时间 < 1s < 2s
错误率 < 0.1% < 1%
吞吐量 > 500 req/s > 200 req/s

详细测试指南见 k6-tests/README.md。

环境变量

Spring Cloud 版本的关键配置:

# Nacos 服务发现与配置
NACOS_SERVER=localhost:8848
NACOS_NAMESPACE=
NACOS_GROUP=DEFAULT_GROUP
NACOS_USERNAME=
NACOS_PASSWORD=

# 数据库(各服务独立数据库)
DB_URL=jdbc:mysql://localhost:3306/traffic?useSSL=false&serverTimezone=Asia/Shanghai
DB_USERNAME=root
DB_PASSWORD=your_password

# Redis
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=

# Elasticsearch
ELASTICSEARCH_URIS=http://localhost:9200

# Kafka
KAFKA_BOOTSTRAP_SERVERS=localhost:9092

# JWT
JWT_SECRET=replace_with_a_real_secret
JWT_EXPIRATION=3600000

# 内部服务间鉴权(auth 与 user 服务必填,启动时 fail-fast 校验非空/非弱值)
# auth 经 feign 调用 user 的 /api/users/internal/** 端点时带 X-Internal-Service-Token 头
INTERNAL_SERVICE_TOKEN=replace_with_a_strong_internal_token

# 后量子 JWT 签名(可选,默认 HS256)
# 切 ML-DSA-65 时,auth 与所有下游服务需配置同一 ML-DSA 公钥以验签
JWT_ALGORITHM=HS256
JWT_ML_DSA_PUBLIC_KEY=

# RAG(可选)
RAG_ENABLED=true
RAG_DB_URL=jdbc:mysql://localhost:3309/rag?useSSL=false
OLLAMA_URL=http://localhost:11434

监控与运维

所有服务默认启用 Spring Boot Actuator:

# 健康检查
curl http://localhost:8080/actuator/health

# 服务信息
curl http://localhost:8080/actuator/info

# 查看注册的服务
curl http://localhost:8848/nacos/v1/ns/instance/list?serviceName=gateway-service

Docker 部署

完整的 Docker Compose 配置见 DOCKER_GUIDE.md,包含:

  • 所有基础设施服务的配置
  • 健康检查与依赖管理
  • 网络配置与端口映射
  • 数据卷管理
  • 故障排查指南

与单体版本对比

维度 Spring Boot 单体 Spring Cloud 微服务
架构 单一应用,所有功能在一个进程 9 个独立服务,按业务域拆分
部署 单个 JAR,简单直接 需要编排多个服务,复杂度高
扩展性 垂直扩展(加机器配置) 水平扩展(按服务独立扩展)
开发调试 简单,本地启动一个应用 需要启动多个服务,依赖复杂
技术栈 Spring Boot Spring Cloud + Nacos + ShardingSphere
分库分表 无 Traffic 服务实现 4 表分片
适用场景 中小型项目,快速迭代 大型项目,团队协作,高可用
性能 单进程调用,延迟低 跨服务调用,有网络开销
运维成本 低 高(需要服务编排、监控、配置管理)

项目状态

代码质量:     A+ (Perfect)
编译成功率:   100% (9/9 模块)
测试覆盖:     25+ 端点
测试代码:     1,350+ 行
部署配置:     Docker Compose 就绪
文档完整性:   100%
生产就绪:     是

技术文档

注意事项

  • Spring Cloud 版本适合学习微服务架构和分布式系统设计
  • 生产环境建议增加 Sentinel 熔断降级、Skywalking 链路追踪
  • 分库分表需要根据实际数据量和访问模式调整分片策略
  • RAG 服务依赖独立的 MySQL 数据库(端口 3309)
  • 所有服务需要正确配置 Nacos 地址才能完成服务注册

Go 高性能后端版本

final_assignment_backend_go 是基于 Go + Gin + go-zero 的高性能后端实验版本,保持与主线相同的业务能力,同时演示了 Go 生态下的高并发处理、AI 聊天流式响应、RAG 检索增强和轻量级微服务架构。

架构概览

Flutter Web / React
  ↓
Gin HTTP Router + JWT + Redis
  ↓
├─ 业务 API (Gin handlers)
│  ├─ 用户管理
│  ├─ 违法处理
│  ├─ 罚款扣分
│  ├─ 申诉审核
│  └─ 审计日志
├─ AI Chat 流式响应 (Server-Sent Events)
├─ WebSocket Ticket 认证
└─ RAG 语义检索 (go-zero RAG runtime)
  ↓
GORM + MySQL
Redis 多级缓存
Kafka 异步消息
Elasticsearch 向量检索
Ollama / OpenAI AI 提供商

技术栈

核心框架

  • Gin - 高性能 HTTP 框架
  • go-zero - 微服务工具包(配置、RAG runtime)
  • GORM - ORM 框架
  • Go 1.23+

数据访问与存储

  • MySQL 8.0 - 关系型数据库
  • Redis 7 - 分布式缓存与会话
  • Elasticsearch 9.4 - 向量检索与全文搜索

消息与容器

  • Kafka / Redpanda - 异步消息队列
  • Testcontainers - 集成测试容器编排
  • Docker - 本地依赖管理

AI 与 RAG

  • Ollama - 本地 LLM 推理
  • OpenAI API - 云端 AI 提供商
  • Elasticsearch Vector Search - 混合检索(BM25 + 向量 + 重排序)
  • gocolly - 网页爬取增强

安全与认证

  • JWT - 无状态认证
  • BCrypt - 密码加密
  • WebSocket Ticket - 一次性连接凭证

核心特性

1. AI 聊天流式响应

支持 Server-Sent Events (SSE) 流式输出,实时推送 AI 生成内容:

// POST /api/ai/chat/stream
{
  "message": "什么是闯红灯?",
  "role": "driver",
  "conversationId": "conv-123",
  "enableRag": true
}

// 响应流
data: {"type":"chunk","content":"闯红灯"}
data: {"type":"chunk","content":"是指"}
data: {"type":"done"}

特性:

  • 支持角色上下文(driver/admin/super_admin)
  • RAG 检索增强问答
  • 会话历史管理
  • 多 AI 提供商切换(Ollama/OpenAI)
  • 心跳保活机制

2. WebSocket 票据认证

一次性票据机制,用于 WebSocket 连接的安全认证:

// 1. 申请票据
POST /api/ws-ticket
Authorization: Bearer <jwt-token>
→ {"ticket": "wst_xxxxx", "expiresIn": 30}

// 2. 使用票据连接 WebSocket
ws://localhost:8080/eventbus?ticket=wst_xxxxx

特性:

  • 30 秒过期时间
  • 一次性使用
  • 票据状态追踪
  • 防重放攻击

3. RAG 检索增强

基于 go-zero RAG runtime 的混合检索:

// POST /api/rag/query
{
  "query": "如何缴纳罚款",
  "topK": 5,
  "minScore": 0.3
}

// 响应
{
  "results": [
    {
      "content": "罚款缴纳流程...",
      "score": 0.85,
      "source": "driver_manual.pdf"
    }
  ]
}

检索策略:

  • BM25 关键词匹配
  • 向量语义检索
  • 重排序优化
  • 多源融合(手工录入/文档上传/网页爬取)

4. 容器化依赖管理

使用 Testcontainers 自动管理本地依赖:

runner := docker.NewRunDocker()
runner.Init()  // 启动 Redis, Kafka, Elasticsearch
defer runner.StopContainers()

优势:

  • 无需手动安装依赖
  • 开发环境一致性
  • 集成测试隔离
  • 优雅启停管理

性能测试

Go 版本提供完整的 k6 性能测试套件,覆盖业务 API 和 AI/RAG 专项测试。

快速验证

cd final_assignment_backend_go/k6

# 基础测试(60秒,验证核心端点)
k6 run basic-test.js

# 负载测试(5分钟,模拟 10-50 并发用户)
k6 run load-test.js

# 压力测试(10分钟,100-300 并发)
k6 run stress-test.js

# 尖峰测试(验证突发流量)
k6 run spike-test.js

性能基线

指标 业务 API AI Chat 流式 RAG 检索
P95 响应时间 < 50ms < 2s < 500ms
P99 响应时间 < 100ms < 3s < 800ms
吞吐量 > 1000 req/s > 50 req/s > 200 req/s
错误率 < 0.1% < 1% < 0.5%

一键启动

方式 1:直接运行(自动启动容器)

cd final_assignment_backend_go
go run project/cmd/app/main.go

应用会自动:

  1. 启动 Docker 容器(Redis, Kafka, Elasticsearch)
  2. 初始化数据库连接
  3. 加载 AI 配置(Ollama/OpenAI)
  4. 启动 HTTP 服务(默认端口 8080)
  5. 优雅关闭时自动停止容器

方式 2:独立容器启动

# 仅启动依赖容器
cd final_assignment_backend_go
go test -v -run TestDockerInit ./project/configs/docker/...

# 然后启动应用
go run project/cmd/app/main.go

环境变量

Go 版本的关键配置:

# 数据库
DB_HOST=localhost
DB_PORT=3306
DB_NAME=traffic
DB_USERNAME=root
DB_PASSWORD=your_password

# Redis(容器自动管理,无需手动配置)
REDIS_HOST=localhost
REDIS_PORT=6379

# Kafka(容器自动管理)
KAFKA_BOOTSTRAP_SERVERS=localhost:9092

# Elasticsearch(容器自动管理)
ELASTICSEARCH_URL=http://localhost:9200

# JWT
JWT_SECRET=replace_with_a_real_secret

# AI Provider(二选一)
AI_PROVIDER_TYPE=ollama  # 或 openai
AI_PROVIDER_URL=http://localhost:11434
AI_PROVIDER_MODEL=llama3.2

# OpenAI 配置(如果使用)
AI_PROVIDER_API_KEY=sk-xxxxx
AI_PROVIDER_MODEL=gpt-4

# RAG
RAG_ENABLED=true
RAG_EMBEDDING_MODEL=nomic-embed-text
RAG_EMBEDDING_DIMENSIONS=768
RAG_TOKEN_BUDGET=4000

# 流式响应
STREAM_KEEPALIVE_INTERVAL=15s

项目结构

final_assignment_backend_go/
├── project/
│   ├── cmd/app/          # 应用入口
│   ├── configs/          # 配置管理
│   │   ├── docker/       # Testcontainers 编排
│   │   ├── redis/        # Redis 配置
│   │   └── auth/         # JWT 认证
│   ├── internal/
│   │   ├── ai/           # AI 聊天管道
│   │   │   ├── chat_pipeline.go
│   │   │   ├── prompt_assembler.go
│   │   │   ├── role_resolver.go
│   │   │   └── web_search_service.go
│   │   ├── auth/         # WebSocket 票据
│   │   ├── config/       # AI 配置加载
│   │   ├── provider/     # AI 提供商工厂
│   │   ├── handler/      # HTTP 处理器
│   │   ├── service/      # 业务服务
│   │   ├── repo/         # 数据访问
│   │   ├── domain/       # 领域模型
│   │   ├── idempotency/  # 幂等处理
│   │   ├── middleware/   # 中间件
│   │   └── gozero/       # go-zero 集成
│   │       ├── config/   # go-zero 配置
│   │       ├── rag/      # RAG runtime
│   │       └── routes/   # go-zero 路由
│   ├── etc/              # 配置文件
│   │   └── gozero-api.yaml
│   └── deploy/rag/       # RAG 部署配置
├── k6/                   # k6 性能测试
├── database/             # 数据库迁移
├── constraints/          # 角色约束文档
└── go.mod

测试覆盖

# 单元测试
go test ./...

# 集成测试(自动启动容器)
go test -v ./project/internal/handler/...

# 测试覆盖率
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out

当前测试覆盖:

  • AI 聊天管道测试
  • WebSocket 票据服务测试
  • RAG 检索测试
  • HTTP 处理器测试
  • 幂等执行器测试

与 Spring Boot / Spring Cloud 对比

维度 Spring Boot 单体 Spring Cloud 微服务 Go 高性能版本
启动时间 ~15-20s ~30s(单服务) ~2-3s
内存占用 ~500MB ~300MB/服务 ~50-100MB
并发性能 中(线程池) 中(分布式) 高(goroutine)
AI 流式响应 WebFlux WebFlux SSE 原生支持
部署复杂度 低 高 低
开发调试 简单 复杂 简单
生态成熟度 高 高 中
类型安全 中(反射) 中 高(编译时检查)
适用场景 全功能业务 大规模分布式 高并发、实时通信

项目状态

代码质量:     A (Good)
编译成功率:   100%
测试覆盖:     核心模块已覆盖
容器编排:     Testcontainers 就绪
文档完整性:   90%
生产就绪:     实验阶段

技术文档

注意事项

  • Go 版本适合学习 Go 生态和高并发编程
  • AI 提供商需要预先配置(Ollama 或 OpenAI)
  • Testcontainers 需要 Docker Desktop 运行
  • RAG 功能依赖 Elasticsearch 9.4+ 和向量化模型
  • 优雅关闭会自动停止由应用启动的容器
  • 生产环境建议使用独立的 Docker Compose 管理依赖

验证命令

后端编译:

cd finalAssignmentBackend
mvn -q -DskipTests test

后端测试默认使用本地 MySQL traffic_test,可通过 TEST_DB_URL、TEST_DB_USERNAME、TEST_DB_PASSWORD 覆盖连接信息:

cd finalAssignmentBackend
mvn -q test

Flutter 静态检查:

cd final_assignment_front
$env:DART_SUPPRESS_ANALYTICS='true'
C:\Users\tutic\Flutter\flutter\bin\flutter.bat analyze

Flutter Web 构建:

cd final_assignment_front
$env:DART_SUPPRESS_ANALYTICS='true'
C:\Users\tutic\Flutter\flutter\bin\flutter.bat build web

AI 链路冒烟测试:

powershell -ExecutionPolicy Bypass -File scripts\test-ai-chain.ps1

Go 后端编译与测试:

cd final_assignment_backend_go
go build ./...
go test ./...

Go 后端性能测试:

cd final_assignment_backend_go\k6
k6 run basic-test.js

当前工程状态

  • 主展示链路:finalAssignmentBackend + final_assignment_front
  • 普通管理员与驾驶员端 UI 已统一暗色/亮色主题、侧边栏、AI 助手入口和业务页面样式
  • 司机档案、用户账户、车辆、违法、罚款、扣分、申诉的多表关联已经补齐主线查询
  • Kafka Listener 幂等样板已集中到公共处理器
  • 复杂治理监听器保留原业务审计语义后完成收口
  • RAG 已支持手工录入、多格式文件解析、chunk 向量化和 Elasticsearch 混合检索
  • 敏感字段密文列、blind-index 字段、查询改造和历史回填已经落地
  • Spring Cloud 微服务版本已完成 9 个服务拆分,支持 ShardingSphere 分库分表
  • Go 高性能版本已集成 AI 聊天流式响应、WebSocket 票据认证和 RAG 检索增强,支持 Testcontainers 自动容器管理

注意事项

  • 不要提交真实数据库密码、JWT 密钥、AI API Key 或加密密钥
  • 本地开发可用弱密钥,演示或生产必须使用独立强密钥
  • PDF RAG 当前不支持加密 PDF 和纯图片扫描 PDF
  • CDC 同步依赖 MySQL binlog 配置,未开启时不会有增量同步

About

交通违法行为处理全栈工程,基于 Spring Boot 与 Flutter,集成权限认证、Kafka/CDC、Elasticsearch、RAG、敏感数据保护及多架构实验。

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages