详细内容
- 概述
- Dodam 是一个拥有 500 多名用户的校内智慧校园平台。以往需要人工逐项办理的事务(外宿审批、深夜自习申请、学事日程管理等)如今都可通过 Dodam 完成。
- 开发并维护了 30 天内峰值 162.82k 次请求、平均每日 5.4k 次请求规模的服务服务器。
- 该 Web 服务仅限校内学生使用。
- 单体架构的局限与向 MSA 的转型
- 在原有的单体应用中,经历了服务间耦合以及部署效率低下的问题。
- 由于所有领域在同一进程中共享资源,某个领域的故障会波及整个系统。
- 存在即便是微小改动也需要整体构建与重新部署的结构性局限。
- 以领域边界为依据,将系统拆分为 11 个服务,并以 Spring Cloud Gateway 作为统一入口,处理路由与 OAuth2 认证。
- 服务拆分后的通信架构设计
- 随着服务的拆分,原本通过方法调用处理的逻辑必须改用网络通信来实现。
- 对于需要即时响应的认证流程采用 gRPC,对于无需等待结果的事件(用户创建、通知发送等)则采用 Kafka。
- 在 Core 模块中统一定义事件 Schema 与 Topic,从而将服务间的消息契约统一化。
- 由此得以采用可为每个服务选用不同语言的多语言(Polyglot)架构。
- 化解众多服务的部署与运维复杂度
- 随着服务数量增多,每次都构建并部署全部服务变得低效。
- 采用了仅检测并构建发生变更的服务的 Delta Build,以及按服务逐个进行的顺序滚动更新(Rolling Update)。
- 搭建了 K3s 集群(2 个 Worker 节点),仅对流量集中的核心服务(Gateway、Auth、User)分散部署副本,从而在有限的基础设施内确保了高可用性。
- 后端基础设施架构
- 核心功能由 Spring Boot 服务器负责,高流量 API 则使用 Redis 进行缓存。
- 为支持使用 Dodam 账号的 OAuth 功能,运行了 Token 服务器、OAuth 服务器、OpenAPI 服务器等。
- CI/CD 架构
- 创建 PR 时,通过 GitHub Actions 自动执行 Gradle 构建与测试,以校验代码质量。
- 合并到 develop 分支时,构建 Docker 镜像并通过 Docker Compose 部署到开发服务器。
- 合并到 main 分支时,构建 Docker 镜像并通过 kubectl apply 部署到 K3s 集群的生产环境。
- 心得体会
- 在亲自运维全校学生都在使用的服务、快速而准确地应对功能建议与故障的过程中,我深刻体会到稳定服务的重要性,并为提升代码质量与可维护性而不懈努力。
- 通过向 MSA 的转型,我能够仅对流量集中的服务进行选择性横向扩展,由此认识到以服务为单位的独立扩展会给运维效率带来巨大差异。