1. 项目背景与核心价值
流浪动物救助一直是社会公益领域的痛点问题。传统救助站普遍存在信息化程度低、领养流程繁琐、捐赠透明度不足等问题。去年参与某动物保护组织的志愿工作时,我亲眼目睹工作人员还在用Excel表格管理上百只动物的信息,领养申请需要填纸质表格,捐赠记录全靠手工记账。这种低效模式严重制约了救助效率。
这套系统的设计初衷,就是要用技术手段解决这些痛点。我们采用微服务架构,不是单纯为了追技术热点,而是基于三个实际考量:
- 业务解耦需求:领养、捐赠、动物管理这些功能天然适合拆分为独立服务。比如捐赠高峰期(如节假日)和领养高峰期(周末)的流量模式完全不同,独立部署可以针对性扩容
- 技术异构性:动物识别需要CV算法、捐赠需要区块链、推荐系统需要机器学习,不同模块的技术栈差异很大
- 容错要求:即使捐赠系统临时故障,也不能影响核心的领养流程
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构深度解析
2.1 微服务拆分策略
我们按照业务边界和变更频率,将系统拆分为六个核心服务:
| 服务名称 | 技术栈 | QPS要求 | 数据一致性要求 | 典型实例数 |
|---|---|---|---|---|
| 动物管理服务 | SpringBoot+MyBatis | 800 | 最终一致 | 3 |
| 领养流程服务 | SpringBoot+Seata | 500 | 强一致 | 2 |
| 捐赠服务 | SpringBoot+Fabric SDK | 300 | 强一致 | 2 |
| 推荐服务 | Python Flask | 200 | 无 | 1 |
| 用户服务 | SpringBoot+JWT | 1000 | 强一致 | 3 |
| 地理位置服务 | Go+Redis GEO | 1500 | 最终一致 | 2 |
这种拆分带来两个关键技术挑战:
- 分布式事务:领养流程涉及动物状态变更、协议生成、用户通知等多个服务。我们采用Seata的AT模式,对业务代码侵入小,性能损耗在可接受范围(实测增加约15%的响应时间)
- 服务发现:初期使用Eureka,但在K8s环境发现心跳机制有问题,后迁移到Nacos,利用其DNS-F特性实现跨环境的服务发现
2.2 关键组件选型对比
缓存方案对比测试:
java复制// 基准测试代码片段
@Benchmark
@BenchmarkMode(Mode.Throughput)
public void testRedisPipeline() {
redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
for (int
