shape

Dodam - 将架构从单体式(Monolithic)迁移到 MSA

概述

消除服务间耦合与部署低效问题,并搭建 K3s 集群

技术栈

  • Java

    Java

  • Kotlin

    Kotlin

  • Spring Boot

    Spring Boot

  • Spring JPA

    Spring JPA

  • Spring Cloud Gateway

    Spring Cloud Gateway

  • MySQL

    MySQL

  • Redis

    Redis

  • Flyway

    Flyway

  • Kafka

    Kafka

  • gRPC

    gRPC

  • Docker Compose

    Docker Compose

  • AWS

    AWS

  • Kubernetes

    Kubernetes

团队

9 人(后端 2 人、Web 3 人、Android 2 人、iOS 2 人)

期间

2025.03 ~ 2026.03

相关链接

后端源码网页服务

详细内容

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