技术架构与选型
07 - 技术架构与技术选型
1. 架构原则
- 单体起步、模块化、预留拆分:业务边界清晰(DDD),后期可平滑拆微服务
- 数据隔离优先:多租户 + 多分站行级隔离贯穿全系统
- 可观测:日志、指标、链路追踪三位一体
- 可扩展:核心抽象(打印、支付、地图、短信)使用适配器模式
2. 技术栈总览
┌─────────────────────────────────────────────────────────┐
│ 客户端 │
│ ├── PC 后台 (Vue 3 + Vite + Element Plus) │
│ └── uni-app (Vue 3, 多角色分包,H5/小程序/App) │
├─────────────────────────────────────────────────────────┤
│ 接入层 (Nginx + WAF) │
├─────────────────────────────────────────────────────────┤
│ 应用层 (Spring Boot 3.2 多模块单体) │
│ ├── 网关/限流/鉴权 (Spring Security + JWT) │
│ ├── 业务模块 (auth/tenant/user/vehicle/cargo/order/ │
│ │ dispatch/track/finance/print/notify) │
│ └── Open API (供 ERP/TMS 对接) │
├─────────────────────────────────────────────────────────┤
│ 中间件 │
│ ├── MySQL 8 (主从) │
│ ├── Redis 7 (哨兵) │
│ ├── RabbitMQ (异步/广播) │
│ ├── MinIO (对象存储) │
│ └── Elasticsearch (订单搜索, 二期) │
├─────────────────────────────────────────────────────────┤
│ 第三方 │
│ ├── 高德地图 / 短信 / 微信支付 / 支付宝 / 发票 │
│ └── 车辆核验、OCR、活体认证 │
├─────────────────────────────────────────────────────────┤
│ 可观测 │
│ └── Prometheus + Grafana + Loki + Tempo │
└─────────────────────────────────────────────────────────┘
3. 模块划分(DDD 边界)
| 模块 | 职责 | 主要聚合根 |
|---|---|---|
logistics-common |
工具、统一响应、异常、BaseEntity | - |
logistics-auth |
认证、JWT、RBAC、权限拦截器 | User, Role, Permission |
logistics-tenant |
多租户、多分站 | Tenant, Branch |
logistics-user |
货主、车主、企业员工 | Shipper, Driver, Staff |
logistics-vehicle |
自有车队、个人车辆审核 | Vehicle, Fleet |
logistics-cargo |
货源 | Cargo |
logistics-order |
订单、抢单/派单、跨分站中转 | Order, Transfer |
logistics-dispatch |
调度、发车单 | Dispatch |
logistics-track |
轨迹、签收 | Track, Sign |
logistics-finance |
结算、对账、发票、支付 | Settle, Invoice |
logistics-print |
模板、打印日志、单据快照 | PrintTemplate, PrintLog |
logistics-notify |
站内信、短信、推送 | Message |
logistics-admin |
平台后台聚合 | - |
logistics-app |
启动模块 | - |
logistics-gateway |
预留:网关 | - |
4. 关键技术决策
| 决策 | 选择 | 理由 |
|---|---|---|
| 单体 vs 微服务 | 单体起步 | 1-2 人团队,运维简单;模块化后可拆 |
| ORM | MyBatis Plus | 灵活、可读 SQL、便于自定义拦截器 |
| 鉴权 | Spring Security + JWT | 标准;RBAC 自研拦截器 |
| 多租户隔离 | 共享库行级隔离 | 实现简单,性能可接受;规模化后再分库 |
| 异步 | RabbitMQ | 成熟、Spring 集成好 |
| 文件 | MinIO | S3 协议,私有化友好 |
| 缓存 | Redis 7(哨兵) | 抢单 Lua、会话、热数据 |
| 实时推送 | WebSocket | 派单/状态变更 |
| 移动跨端 | uni-app | 一码三端,蓝牙打印生态成熟 |
| PC 框架 | Vue 3 + Vite + Element Plus | 团队熟悉、社区活跃 |
| PC 打印 | Lodop / C-Lodop | 行业标准、支持多种打印机 |
| 移动打印 | uni-app 蓝牙 + ESC/POS 指令 | 兼容性广 |
| 部署 | Docker Compose | 起步简单;规模化迁 K8s |
| CI/CD | GitHub Actions / GitLab CI | 主流 |
| 监控 | Prometheus + Grafana + Loki | 开源、自托管 |
5. 单体 → 微服务演进路径
当出现下列信号时考虑拆分: - 单模块代码 > 5 万行 - 团队规模 > 10 人 - 某模块(如打印、调度)需独立扩缩容 - 单体启动 > 60s、内存 > 4G
拆分顺序建议:
1. 先拆 print 服务(IO 密集,独立扩容)
2. 再拆 track(高频写入,可独立 DB)
3. 再拆 notify(异步消费)
4. 最后拆 order / dispatch / finance
拆分时引入: - Spring Cloud Gateway - Nacos 注册/配置 - Seata 分布式事务(必要时) - Sentinel 熔断限流
6. 接口风格
- RESTful + JSON
- URL:
/api/v1/{module}/{resource} - 统一响应:
{ code, msg, data, traceId } - 错误码:6 位(业务域 2 位 + 错误 4 位)
- 鉴权:
Authorization: Bearer <jwt> - 多租户:JWT 内含
tenantId+branchId,无需显式传
7. 性能目标
| 接口 | P95 | 备注 |
|---|---|---|
| 登录 / 列表查询 | < 300 ms | 含权限校验 |
| 抢单 | < 100 ms | Redis Lua |
| 派单 | < 500 ms | 含 MQ 投递 |
| 打印生成 | < 1 s | 服务端模板渲染 |
| 大屏聚合 | < 2 s | 缓存 + 预聚合 |
8. 安全
- HTTPS 强制
- JWT + Refresh Token
- 敏感字段(手机号、身份证)AES 加密存储 + 脱敏展示
- 操作日志全量记录
- SQL 注入、XSS、CSRF 防护
- 越权检测(数据权限拦截器全局生效)