趣玩搭(FunPlay)是一个基于 LBS 的垂直领域兴趣社交平台,用户发布线下活动(露营、桌游、运动、读书会等),系统推荐匹配,其他用户报名支付参加。本文作为系列的开篇,梳理项目现状、架构分层与技术选型思路。


一、项目现状

先看几个关键数字:

  • 日活用户:约 1,200

  • 注册用户:6 万

  • 日均活动发布:100+

  • 日均订单:200+

  • 技术团队:30 人

核心业务链路为:发布活动 → 推荐/搜索 → 报名/抢票 → 支付 → 即时通讯 → 活动完成 → 评价/积分

平台基于 yudao-cloud 开发框架(Spring Cloud Alibaba + Nacos + RocketMQ + Vue),涵盖活动、票务、支付、订单、会员、俱乐部、交友匹配、IM、AI 客服、内容审核、营销等十余个业务模块。

二、架构设计原则

在动手拆服务、选技术之前,我们先对齐五条核心原则,后续所有决策都以此为锚:

原则

说明

高内聚低耦合

按领域边界拆分微服务,服务间通过 RPC + MQ 解耦

弹性伸缩

无状态服务 + K8s HPA,按流量自动扩缩容

数据最终一致

核心链路采用 TCC/Saga,非核心链路采用 MQ 异步补偿

可观测性

全链路 Trace + Metrics + Logging 三位一体

渐进式演进

避免过度设计,按 DAU 里程碑逐步升级

最后一条尤其重要——千人 DAU 的项目上来就搞 Service Mesh 和异地多活,是典型的架构过度设计。我们的策略是"按需演进",每个阶段只解决当前阶段的核心瓶颈。

三、整体架构分层

系统采用经典六层架构,自上而下依次为:

┌─────────────────────────────────────────────────┐
│              接入层                               │
│   微信小程序 · H5 · 管理后台                       │
│   Vue 3 + uni-app + Nginx/Ingress                │
├─────────────────────────────────────────────────┤
│              网关层                               │
│   统一鉴权 · 限流 · 路由 · 灰度发布               │
│   Spring Cloud Gateway + Sentinel                │
├─────────────────────────────────────────────────┤
│              业务服务层                            │
│   活动 · 票务 · 订单 · 支付 · 会员 · 营销 …        │
│   Spring Boot 3 + Dubbo / Feign                  │
├─────────────────────────────────────────────────┤
│              领域支撑层                            │
│   搜索 · 推荐 · IM · AI · 内容审核                 │
│   ES + Milvus + 融云 + LLM                       │
├─────────────────────────────────────────────────┤
│              数据层                               │
│   关系型 · 缓存 · 消息 · 对象存储                   │
│   MySQL + Redis + RocketMQ + OSS                 │
├─────────────────────────────────────────────────┤
│              基础设施层                            │
│   容器编排 · 监控 · CI/CD                          │
│   K8s + Prometheus + Grafana + GitLab CI         │
└─────────────────────────────────────────────────┘

请求链路:客户端 → CDN → Nginx/Ingress → Gateway(鉴权 + 限流 + 灰度路由)→ 业务微服务 → 数据层。服务间通信采用 Dubbo RPC(同步)+ RocketMQ(异步) 双模式。

四、技术选型

4.1 后端技术栈

领域

技术

选型理由

开发框架

Spring Boot 3 + Spring Cloud Alibaba

团队已有 yudao-cloud 基础,迁移成本低

服务注册与配置

Nacos 2.x

注册 + 配置一体化,AP/CP 可切换

RPC 通信

Dubbo 3(Triple 协议)

高性能,兼容 gRPC,支持流式通信

API 网关

Spring Cloud Gateway + Sentinel

非阻塞 IO,集成限流熔断

消息队列

RocketMQ 5.x

事务消息、延迟消息、死信队列全支持

分布式事务

Seata(TCC + Saga)

轻量级,与 Spring Cloud 深度集成

数据库

MySQL 8.0 + ShardingSphere

成熟稳定,分库分表平滑扩展

缓存

Redis 7 Cluster

GEO、Stream、Lua 脚本全能力

搜索引擎

Elasticsearch 8.x

倒排索引 + 向量搜索(KNN)

向量数据库

Milvus

AI 知识库语义检索

任务调度

XXL-JOB

分片广播,可视化管控台

分布式 ID

Leaf(美团)

Snowflake + 号段双模式

日志收集

EFK(ES + Filebeat + Kibana)

全链路日志检索

几个关键决策的思考过程:

为什么选 Dubbo 而不是 Feign? 当前规模下 Feign 完全够用,但考虑到后续抢票秒杀场景的性能需求,Dubbo Triple 协议在序列化效率和长连接复用上有明显优势。而且 Dubbo 3 与 Spring Cloud 的兼容性已经很好,可以渐进切换。

为什么选 RocketMQ 而不是 Kafka? 趣玩搭的核心场景是交易链路(下单、支付、退款),RocketMQ 原生支持事务消息和延迟消息,这两个能力在我们的业务里高频使用。Kafka 更适合日志流和大数据管道,后续如果建设实时数据平台可以引入。

为什么选 ShardingSphere 而不是 TiDB? 团队对 MySQL 更熟悉,ShardingSphere-JDBC 透明接入成本低。TiDB 在运维复杂度和成本上当前阶段 ROI 不高,列入 Phase 3 备选方案。

4.2 前端与客户端

技术

说明

小程序

uni-app + Vue 3

一套代码多端发布

H5

Vue 3 + Vite

活动分享页、营销落地页

管理后台

Vue 3 + Element Plus

沿用 yudao 管理后台

4.3 基础设施

领域

技术

说明

容器化

Docker + K8s

服务编排、弹性伸缩

CI/CD

GitLab CI + ArgoCD

代码合并自动构建部署

监控

Prometheus + Grafana + AlertManager

指标采集、可视化、告警

链路追踪

SkyWalking / Jaeger

全链路调用链可视化

安全

OAuth 2.0 + JWT + API 鉴权

RBAC + 数据权限隔离

五、服务器选型与部署架构

我们按 DAU 增长划分三个阶段,每个阶段的基础设施配置如下:

阶段一:DAU < 5K —— 轻量云服务器

资源

规格

数量

用途

应用服务器

4C8G 云主机

3 台

微服务部署(Docker Compose)

数据库

MySQL 8.0 RDS(4C16G)

1 主 1 从

业务数据存储

Redis

Redis 6 云版(2C4G)

1 主 2 从

缓存 / 分布式锁 / GEO

ES

Elasticsearch 7(4C8G)

3 节点

搜索 / 推荐倒排索引

MQ

RocketMQ(2C4G)

2 Broker

异步消息

对象存储

OSS / COS

按量

图片、视频、文件

CDN

云 CDN

按量

静态资源加速

部署方式为 Docker Compose + Nginx 反向代理,Nacos 做服务注册与配置中心,数据库使用云厂商 RDS 托管。

阶段二:DAU 5K–50K —— K8s 集群

切换至 Kubernetes 集群部署,引入 Ingress Gateway 替代单点 Nginx,HPA 实现弹性伸缩。数据库升级为一主多从 + 读写分离,Redis 升级为 Cluster 模式。

阶段三:DAU 50K–100W —— 多 AZ + 异地多活

多可用区部署,核心服务跨 AZ 容灾。引入 TiDB 或分库分表(ShardingSphere)应对写入瓶颈。MQ 升级为 Kafka + RocketMQ 混合架构。引入 Service Mesh(Istio)实现流量治理、灰度发布与熔断。


下一篇趣玩搭微服务拆分实战:15 个服务的领域划分与通信设计——详解如何基于 DDD 拆分微服务,以及服务间的同步/异步通信规范。


本站由 困困鱼 使用 Stellar 创建。