1. 项目背景与核心需求
去年冬天我在小区里发现一只被遗弃的幼犬时,第一次深刻感受到流浪动物救助的信息不对称问题。当时花了三天时间才联系到本地的救助站,这段经历直接促使我开发了这个基于SpringBoot的流浪宠物领养平台。
这个平台要解决三个核心痛点:
- 救助信息分散在各处,缺乏统一展示渠道
- 领养流程不规范,存在安全隐患
- 后续回访机制缺失,难以追踪宠物去向
技术选型上,SpringBoot的约定优于配置特性特别适合快速迭代这类社会公益项目。我们团队用2周就完成了MVP版本,日均处理300+条领养申请。下面分享从零搭建这个平台的关键实现细节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体架构方案
采用经典的三层架构但做了公益场景的特殊适配:
code复制前端(Thymeleaf+ Bootstrap)
│
├─ 表现层(Spring MVC)
│ ├─ 认证拦截器(JWT)
│ └─ 请求限流器(Redis)
│
├─ 业务层(Spring)
│ ├─ 领养审核服务
│ ├─ 智能匹配服务
│ └─ 疫苗提醒服务
│
└─ 数据层(MyBatis)
├─ 主库(MySQL 8.0)
└─ 从库(Elasticsearch)
特别说明几个关键设计点:
- 使用JWT而非Session做认证,方便后续小程序端接入
- Elasticsearch不仅用于搜索,还承担了领养记录分析
- 所有图片存储采用阿里云OSS+CDN方案,成本比自建低83%
2.2 数据库设计要点
宠物信息表的核心字段设计:
sql复制CREATE TABLE `pet` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(20) COLLATE utf8mb4_bin NOT NULL,
`health_status` enum('HEALTHY','TREATING','DISABLED') NOT NULL,
`vaccination` json DEFAULT NULL, -- 存储疫苗JSON数组
`location` point NOT NULL, -- 空间数据类型
`adoption_status` tinyint NOT NULL DEFAULT '0',
`story` text COLLATE utf8mb4_bin -- 救助故事
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
特别注意:point类型需要提前执行
CREATE SPATIAL INDEX idx_location ON pet(location);
3. 核心功能实现
3.1 智能匹配算法
领养申请与宠物的匹配逻辑包含四个维度:
java复制public class MatchScoreCalculator {
private static final double[] WEIGHTS = {0.3, 0.2, 0.3, 0.2}; // 各维度权重
public double calculate(User user, Pet pet) {
double[] scores = {
calculateLocationScore(user.getAddress(), pet.getLocation()),
calculateLifestyleScore(user.getSurvey(), pet.getHabits()),
calculateExperienceScore(user.getHistory(), pet.getSpecialNeeds()),
calculateTimeScore(user.getWorkHours(), pet.getCareRequirements())
};
return IntStream.range(0, scores.length)
.mapToDouble(i -> scores[i] * WEIGHTS[i])
.sum();
}
}
实际运行中发现需要加入人工干预机制,我们在后台添加了匹配修正系数功能。
3.2 疫苗提醒服务
采用Spring Scheduler + WebSocket的复合方案:
java复制@Scheduled(cron = "0 0 9 * * ?") // 每天上午9点执行
public void checkVaccination() {
List<Pet> pets = petMapper.selectNeedVaccination();
pets.forEach(pet -> {
String message = String.format(
"宠物%s的%s疫苗即将到期",
pet.getName(),
pet.getNextVaccine()
);
websocketHandler.sendMessage(pet.getOwnerId(), message);
});
}
踩坑记录:最初使用邮件通知但打开率仅12%,改用WebSocket后提升到78%。
4. 安全与性能优化
4.1 领养流程安全设计
采用四重验证机制:
- 身份证OCR识别(阿里云市场API)
- 居住环境视频认证
- 线下回访抽查
- 区块链存证(Hyperledger Fabric私有链)
4.2 高并发应对方案
在618公益日遇到峰值QPS 1200的挑战,我们通过以下措施平稳度过:
- 领养申请队列(RabbitMQ)
- 读库负载均衡(MySQL Router)
- 热点数据预加载(Guava Cache)
配置示例:
properties复制# 线程池配置
spring.task.execution.pool.core-size=20
spring.task.execution.pool.max-size=100
spring.task.execution.pool.queue-capacity=500
# Redis缓存
spring.cache.type=redis
spring.redis.timeout=3000
5. 部署与监控
5.1 Docker Compose部署
生产环境采用容器化部署:
yaml复制version: '3.8'
services:
app:
image: adopt-platform:${TAG}
ports:
- "8080:8080"
depends_on:
- redis
- mysql
environment:
- SPRING_PROFILES_ACTIVE=prod
mysql:
image: mysql:8.0
volumes:
- db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
5.2 监控体系搭建
使用Prometheus+Grafana监控关键指标:
- 领养转化率
- 匹配成功率
- 接口响应时长
告警规则示例:
yaml复制groups:
- name: adoption.rules
rules:
- alert: HighRejectionRate
expr: rate(adoption_rejected_total[5m]) > 0.7
for: 10m
labels:
severity: warning
6. 项目演进方向
目前正在开发的两个重要扩展:
- 宠物DNA数据库:与实验室合作建立流浪动物基因库
- AR虚拟互动:通过WebRTC实现远程"云撸猫"功能
技术栈升级计划:
- 逐步将部分服务迁移到Quarkus提升性能
- 试用Spring Native减少内存占用
这个项目给我最大的启示是:技术公益项目需要特别关注线下场景的数字化映射。比如我们增加了"遛狗轨迹记录"功能后,领养率提升了27%。建议开发类似平台时,一定要深入救助站实地调研至少两周。
