校园外卖配送平台是当前高校生活服务数字化的重要场景。传统的外卖平台在校园场景下存在几个痛点:配送效率低(校外骑手不熟悉校园路线)、订单分配不合理(高峰期出现大量超时订单)、系统扩展性差(寒暑假订单量波动大)。我们设计的这套微服务分布式系统,正是针对这些痛点提出的技术解决方案。
这个项目的核心创新点在于:
系统采用经典的三层微服务架构:
code复制[小程序端]
↓ ↑ HTTP/WebSocket
[API Gateway] → [Spring Cloud Gateway]
↓ ↑
[微服务集群] → [服务注册中心]
↓ ↑
[数据持久层] → [MySQL + MongoDB + Redis]
这种架构的优势在于:
对比RabbitMQ和Kafka后,最终选择RabbitMQ,主要考虑:
关键配置示例(application.yml):
yaml复制spring: rabbitmq: host: mq-campus port: 5672 virtual-host: /food publisher-confirm-type: correlated publisher-returns: true
采用改进的加权轮询算法,考虑因素包括:
算法核心代码片段:
java复制public Rider selectBestRider(Order order) {
List<Rider> candidates = riderService.getAvailableRiders();
return candidates.stream()
.max(Comparator.comparingDouble(r ->
0.4 * distanceScore(r, order) +
0.3 * loadScore(r) +
0.2 * punctualityScore(r) +
0.1 * levelScore(r)
)).orElseThrow();
}
结合校园地图特点,预先建立关键节点拓扑图:
code复制宿舍区 ←→ 教学楼 ←→ 食堂
↑ ↑ ↑
└── 快递站 ←─┴── 商业街
使用A*算法计算最优路径时,为不同路段设置动态权重:
订单状态变更涉及多个微服务:
采用Seata的AT模式实现最终一致性:
java复制@GlobalTransactional
public void completeOrder(Long orderId) {
orderService.complete(orderId);
paymentService.settle(orderId);
statsService.updateRiderStats(orderId);
}
关键配置参数:
采用多级缓存架构:
缓存击穿解决方案:
java复制public Menu getMenu(Long shopId) {
String key = "menu:" + shopId;
return cacheTemplate.opsForValue()
.get(key, () -> menuService.getMenu(shopId), 5, TimeUnit.MINUTES);
}
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
connection-timeout: 30000
idle-timeout: 600000
配送轨迹文档结构:
json复制{
"orderId": "ORD123456",
"riderId": "R1001",
"tracks": [
{
"lng": 116.404,
"lat": 39.915,
"time": "2023-01-01T12:00:00Z"
}
],
"geoHash": "wx4g0"
}
建立2dsphere索引加速LBS查询:
javascript复制db.tracks.createIndex({ "tracks.loc": "2dsphere" })
采用Prometheus + Grafana方案:
关键告警规则示例:
yaml复制- alert: HighErrorRate
expr: sum(rate(http_server_requests_seconds_count{status=~"5.."}[1m])) by (service) / sum(rate(http_server_requests_seconds_count[1m])) by (service) > 0.05
for: 2m
Docker Compose编排关键服务:
yaml复制version: '3'
services:
order-service:
image: food-docker/order:v1.2
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
deploy:
resources:
limits:
cpus: '1'
memory: 1G
Kubernetes HPA配置:
yaml复制apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: order-service
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: order-service
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
初期采用数据库自增ID导致的问题:
最终解决方案:美团的Leaf方案
java复制// 配置示例
leaf.name=order
leaf.segment.enable=true
leaf.jdbc.url=jdbc:mysql://mysql-campus:3306/leaf
遇到的性能问题:
优化措施:
java复制@GetMapping("/orders")
public ResponseEntity<List<Order>> listOrders(
@RequestHeader("Accept-Encoding") String encoding) {
List<Order> orders = orderService.list();
return ResponseEntity.ok()
.header("Content-Encoding",
encoding.contains("gzip") ? "gzip" : "identity")
.body(orders);
}
使用JMeter模拟以下场景:
关键指标:
测试用例设计:
gherkin复制Feature: 订单全流程测试
Scenario: 正常下单流程
Given 用户已登录且余额充足
When 用户提交订单并支付
Then 系统应分配骑手
And 骑手端应收到推送
And 用户可查看配送进度
使用Arthas进行线上诊断:
bash复制# 监控方法调用
watch com.example.OrderService createOrder '{params,returnObj}' -x 3
短期规划:
长期规划:
这套系统在实际运行中已经支撑了某高校日均3000+订单的配送需求,骑手平均配送时长缩短了25%,订单超时率从8%降至2%以下。特别是在开学季等高峰时段,系统的弹性伸缩能力得到了充分验证。