10 KiB
10 KiB
外卖SaaS系统 - 技术架构
1. 技术栈
1.1 后端技术栈
- .NET 10:最新的.NET平台,提供高性能和现代化开发体验
- ASP.NET Core Web API:构建RESTful API服务
- Entity Framework Core 10:最新ORM框架,用于复杂查询和实体管理
- Dapper 2.1+:轻量级ORM,用于高性能查询和批量操作
- PostgreSQL 16+:主数据库,支持JSON、全文搜索等高级特性
- Redis 7.0+:缓存和会话存储
- RabbitMQ 3.12+:消息队列,处理异步任务
1.2 开发工具和框架
- AutoMapper:对象映射
- FluentValidation:数据验证
- Serilog:结构化日志
- MediatR:CQRS和中介者模式实现
- Hangfire:后台任务调度
- Polly:弹性和瞬态故障处理
- Swagger/Swashbuckle:API文档生成
1.3 认证授权
- JWT (JSON Web Token):无状态身份认证
- IdentityServer/Duende IdentityServer:OAuth2.0和OpenID Connect
- ASP.NET Core Identity:用户身份管理
1.4 测试框架
- xUnit:单元测试框架
- Moq:Mock框架
- FluentAssertions:断言库
- Testcontainers:集成测试容器化
1.5 DevOps工具
- Docker:容器化部署
- Docker Compose:本地开发环境
- GitHub Actions/GitLab CI:CI/CD流水线
- Nginx:反向代理和负载均衡
2. 系统架构
2.1 整体架构
┌─────────────────────────────────────────────────────────────┐
│ 客户端层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ Web管理端 │ │ Web用户端 │ │ 小程序端(用户) │ │
│ └──────────┘ └──────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ API网关层 │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Nginx / API Gateway (路由、限流、认证、日志) │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 应用服务层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │租户服务 │ │商家服务 │ │订单服务 │ │配送服务 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │用户服务 │ │支付服务 │ │营销服务 │ │通知服务 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 基础设施层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │PostgreSQL │ │ Redis │ │ RabbitMQ │ │ MinIO │ │
│ │ (主库) │ │ (缓存) │ │ (消息队列)│ │(对象存储) │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘
2.2 分层架构
2.2.1 表现层 (Presentation Layer)
- TakeoutSaaS.AdminApi:管理后台 Web API 项目(/api/admin/v1)
- Controllers:后台管理API控制器
- Filters:过滤器(异常处理、日志、验证)
- Middleware:中间件(认证、租户识别、RBAC)
- Models:请求/响应DTO
- TakeoutSaaS.MiniApi:小程序/用户端 Web API 项目(/api/mini/v1)
- Controllers:用户端API控制器
- Filters:过滤器(异常处理、限流、签名校验)
- Middleware:中间件(小程序登录态、租户识别、CORS)
- Models:请求/响应DTO
2.2.2 应用层 (Application Layer)
- TakeoutSaaS.Application:应用逻辑
- Services:应用服务
- DTOs:数据传输对象
- Interfaces:服务接口
- Validators:FluentValidation验证器
- Mappings:AutoMapper配置
- Commands/Queries:CQRS命令和查询
2.2.3 领域层 (Domain Layer)
- TakeoutSaaS.Domain:领域模型
- Entities:实体类
- ValueObjects:值对象
- Enums:枚举
- Events:领域事件
- Interfaces:仓储接口
- Specifications:规约模式
2.2.4 基础设施层 (Infrastructure Layer)
- TakeoutSaaS.Infrastructure:基础设施实现
- Data:数据访问
- EFCore:EF Core DbContext和配置
- Dapper:Dapper查询实现
- Repositories:仓储实现
- Migrations:数据库迁移
- Cache:Redis缓存实现
- MessageQueue:RabbitMQ实现
- ExternalServices:第三方服务集成
- Data:数据访问
2.2.5 共享层 (Shared Layer)
- TakeoutSaaS.Shared:共享组件
- Constants:常量定义
- Exceptions:自定义异常
- Extensions:扩展方法
- Helpers:辅助类
- Results:统一返回结果
3. 核心设计模式
3.1 多租户模式
- 数据隔离策略:每个租户独立Schema
- 租户识别:通过HTTP Header或JWT Token识别租户
- 动态切换:运行时动态切换数据库连接
3.2 CQRS模式
- 命令(Command):处理写操作,修改数据
- 查询(Query):处理读操作,不修改数据
- 分离优势:读写分离,优化性能
3.3 仓储模式
- 抽象数据访问:统一数据访问接口
- EF Core仓储:复杂查询和事务处理
- Dapper仓储:高性能查询和批量操作
3.4 工作单元模式
- 事务管理:统一管理数据库事务
- 批量提交:减少数据库往返次数
3.5 领域驱动设计(DDD)
- 聚合根:定义实体边界
- 值对象:不可变对象
- 领域事件:解耦业务逻辑
4. 数据访问策略
4.1 EF Core使用场景
- 复杂的实体关系查询
- 需要变更跟踪的操作
- 事务性操作
- 数据库迁移管理
4.2 Dapper使用场景
- 高性能查询(大数据量)
- 复杂SQL查询
- 批量插入/更新
- 报表统计查询
- 存储过程调用
4.3 混合使用策略
// EF Core - 复杂查询和实体管理
public async Task<Order> GetOrderWithDetailsAsync(Guid orderId)
{
return await _dbContext.Orders
.Include(o => o.OrderItems)
.Include(o => o.Customer)
.FirstOrDefaultAsync(o => o.Id == orderId);
}
// Dapper - 高性能统计查询
public async Task<OrderStatistics> GetOrderStatisticsAsync(DateTime startDate, DateTime endDate)
{
var sql = @"
SELECT
COUNT(*) as TotalOrders,
SUM(total_amount) as TotalAmount,
AVG(total_amount) as AvgAmount
FROM orders
WHERE created_at BETWEEN @StartDate AND @EndDate";
return await _connection.QueryFirstOrDefaultAsync<OrderStatistics>(sql,
new { StartDate = startDate, EndDate = endDate });
}
5. 缓存策略
5.1 缓存层次
- L1缓存:内存缓存(IMemoryCache)- 进程内缓存
- L2缓存:Redis缓存 - 分布式缓存
5.2 缓存场景
- 商家信息缓存(30分钟)
- 菜品信息缓存(15分钟)
- 用户会话缓存(2小时)
- 配置信息缓存(1小时)
- 热点数据缓存(动态过期)
5.3 缓存更新策略
- Cache-Aside:旁路缓存,先查缓存,未命中查数据库
- Write-Through:写入时同步更新缓存
- Write-Behind:异步更新缓存
6. 消息队列应用
6.1 异步任务
- 订单状态变更通知
- 短信/邮件发送
- 数据统计计算
- 日志持久化
6.2 事件驱动
- 订单创建事件
- 支付成功事件
- 配送状态变更事件
7. 安全设计
7.1 认证机制
- JWT Token认证
- Refresh Token刷新
- Token过期管理
7.2 授权机制
- 基于角色的访问控制(RBAC)
- 基于策略的授权
- 资源级权限控制
7.3 数据安全
- 敏感数据加密(密码、支付信息)
- HTTPS传输加密
- SQL注入防护
- XSS防护
7.4 接口安全
- 请求签名验证
- 接口限流(Rate Limiting)
- 防重放攻击
- CORS跨域配置