1. 苍穹外卖项目Day01:从零搭建外卖平台的技术栈选型
作为一名经历过多个外卖平台开发的老手,我深知技术选型对项目成败的决定性影响。今天要分享的"苍穹外卖"项目,是一个典型的互联网餐饮SaaS平台,其技术架构既要应对高并发订单压力,又要保证商家端和用户端的实时交互体验。在项目启动的第一天,我们需要完成基础技术栈的搭建和环境配置,这直接决定了后续开发的顺畅程度。
从热词数据来看,nginx、git、数据库和lombok等技术组件备受关注,这也印证了当前企业级项目的主流选择。不同于教学演示项目,真实商业环境中的外卖系统对稳定性有着近乎苛刻的要求——想象一下午高峰时期如果支付接口崩溃,造成的损失和投诉将难以估量。因此我们的技术选型必须兼顾开发效率和线上稳定性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境准备与工具链配置
2.1 Git版本控制系统的规范使用
在团队协作开发中,Git的使用规范往往被新手忽视。我建议采用功能分支工作流(Feature Branch Workflow),每个新功能都在独立分支开发:
bash复制# 初始化仓库(项目负责人执行)
git init
git remote add origin <仓库地址>
# 开发者日常操作
git checkout -b feature/order-module # 创建功能分支
git add .
git commit -m "feat: 实现订单创建接口"
git push origin feature/order-module
重要提示:commit message必须遵循Angular规范(feat/fix/docs/style/refactor等前缀),这对后续代码审查和版本回溯至关重要。我曾见过因为随意提交信息导致回滚错版本的惨剧。
2.2 Lombok的正确打开方式
Lombok确实能减少样板代码,但需要注意:
- IDE必须安装Lombok插件(IntelliJ IDEA默认支持)
- 在pom.xml中添加依赖:
xml复制<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
实际开发中建议谨慎使用@Builder等高级特性,特别是在JPA实体类中,不当使用可能导致Hibernate代理失效。我的经验是:DTO/VO可以大胆用Lombok,领域模型保持克制。
3. Nginx的高效部署方案
3.1 编译安装与性能调优
不同于直接使用apt-get安装,生产环境推荐源码编译:
bash复制# 安装依赖
sudo apt-get install gcc make libpcre3-dev zlib1g-dev
# 下载解压(以1.23.3为例)
wget https://nginx.org/download/nginx-1.23.3.tar.gz
tar -zxvf nginx-1.23.3.tar.gz
cd nginx-1.23.3
# 编译配置(关键参数)
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-threads \
--with-file-aio
make && sudo make install
关键配置项说明:
- worker_processes设置为CPU核心数
- worker_connections建议设为10240(需调整系统文件描述符限制)
- 启用gzip压缩可减少30%以上的静态资源传输量
3.2 反向代理配置技巧
外卖平台通常需要处理多种服务路由,建议采用模块化配置:
nginx复制# 主配置文件包含各模块
include /etc/nginx/conf.d/*.conf;
# api.conf示例
upstream backend {
server 127.0.0.1:8080 weight=5;
server 127.0.0.1:8081 weight=3;
keepalive 32;
}
server {
listen 443 ssl;
server_name api.cangqiong.com;
# SSL证书配置
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location /order {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
遇到过的一个坑:当上游服务使用Spring Session时,必须配置proxy_set_header Host $host,否则会话可能丢失。
4. 数据库设计与优化实践
4.1 核心表结构设计
外卖系统的数据库设计有几个关键点:
- 订单表需要支持分库分表
- 商品信息需要版本控制(价格变更历史)
- 地理信息需要空间索引
sql复制CREATE TABLE `orders` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '雪花算法ID',
`order_no` varchar(32) NOT NULL COMMENT '订单编号',
`user_id` bigint NOT NULL,
`shop_id` bigint NOT NULL,
`total_amount` decimal(10,2) NOT NULL COMMENT '含原价、优惠、实付等多个金额字段',
`status` tinyint NOT NULL COMMENT '0-待支付 1-已接单...',
`delivery_geo` point NOT NULL COMMENT '配送位置',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`),
SPATIAL KEY `idx_delivery_geo` (`delivery_geo`),
KEY `idx_user_shop` (`user_id`,`shop_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
4.2 达梦数据库迁移要点
当需要适配国产数据库时,需特别注意:
- MySQL的ON UPDATE CURRENT_TIMESTAMP语法需改为触发器实现
- 自增列语法差异:达梦使用IDENTITY(1,1)替代AUTO_INCREMENT
- 分页查询语法不同:达梦使用FETCH FIRST...ONLY替代LIMIT
建议使用DBX数据库工具进行结构比对和差异迁移,其可视化界面能显著提升效率。
5. 企业级项目启动规范
5.1 微服务架构下的模块划分
苍穹外卖建议采用领域驱动设计(DDD)划分模块:
code复制cangqiong-parent (聚合工程)
├── cq-common # 公共组件
├── cq-gateway # Spring Cloud Gateway
├── cq-auth # 认证中心
├── cq-order # 订单核心域
├── cq-payment # 支付域
└── cq-delivery # 配送域
每个业务模块应包含:
- API(接口定义和DTO)
- Biz(业务逻辑实现)
- Infrastructure(持久层等)
5.2 日志与监控的黄金标准
生产环境必须完善的三个监控维度:
- 业务埋点:关键业务流程打点(如订单创建成功率)
java复制// 使用Micrometer指标
Metrics.counter("order.create.total", "shopId", shopId).increment();
- 性能监控:接口响应时间P99线
yaml复制# Spring Boot Actuator配置
management:
endpoints:
web:
exposure:
include: health,metrics,prometheus
- 日志追踪:全链路TraceID
java复制// 使用MDC实现日志关联
MDC.put("traceId", UUID.randomUUID().toString());
这些基础设施在项目第一天就必须搭建完成,后期补充成本极高。我曾参与重构一个没有监控的老系统,光添加埋点就耗费了两周。
6. 开发中的避坑指南
6.1 多环境配置管理
建议采用Spring Cloud Config + Vault的方案:
code复制application.yml # 公共配置
application-dev.yml # 开发环境
application-test.yml # 测试环境
application-prod.yml # 生产环境(加密)
关键技巧:
- 使用jasypt加密数据库密码
- 通过spring.profiles.active指定环境
- 敏感信息存储在HashiCorp Vault
6.2 接口幂等性设计
外卖系统的订单接口必须实现幂等,推荐两种方案:
- 令牌机制(前端先获取令牌)
java复制@PostMapping("/order")
public Result createOrder(@RequestBody OrderDTO dto,
@RequestHeader("Idempotent-Key") String idempotentKey) {
// 校验redis中是否存在该key
// ...
}
- 数据库唯一约束(订单号+业务类型)
sql复制CREATE TABLE `idempotent_record` (
`biz_type` varchar(32) NOT NULL,
`biz_no` varchar(64) NOT NULL,
PRIMARY KEY (`biz_type`,`biz_no`)
);
在618大促期间,我们曾因为幂等设计缺陷导致重复下单,这个教训价值百万。
第一天的工作看似基础,实则奠定了整个项目的技术基调。当项目进行到中后期,早期在Git规范、监控体系、环境隔离等方面投入的时间会带来十倍回报。下个迭代我们将深入订单系统的状态机设计和分布式事务实现,那又是另一个充满挑战的技术深水区。
