
OpenBlog从零自研的 Spring Boot 3 Vue 3 全栈博客系统OpenBlog 是一个面向个人博客场景的开源全栈项目后端 Spring Boot 3前端 Vue 3线上运行于 wecode.xin。这篇文章介绍它的技术架构、功能设计以及几个值得参考的实现细节。这个项目是做什么的OpenBlog 是一套完整的博客系统文章、评论、论坛、媒体、SEO、管理后台都有前后端分离全部自研。项目在 GitHub 开源线上站点 wecode.xin 在运行。功能覆盖一条完整的博客链路模块功能账号注册、登录、JWT 双 Token 鉴权Access Refresh、用户资料文章Markdown 编辑、草稿/发布/定时发布/隐藏、全文搜索、导入导出评论文章评论、回复嵌套、幂等防重复提交论坛话题发布、评论、敏感词过滤DFA、管理员隐藏互动点赞、收藏、关注媒体MinIO/本地存储、缩略图、粘贴/拖拽上传支持 WebPSEO爬虫动态 SSR、Open Graph、JSON-LD、sitemap.xml、百度推送站点配置后台可视化编辑站点名称/描述/版权管理后台文章、用户、评论、反馈、附件管理更新日志个性化Live2D 看板娘、飞书风格主题、亮暗模式技术选型层技术后端Java 17、Spring Boot 3.5、MyBatis-Plus、Spring Security中间件MySQL 8、RedisRedisson、MinIO、RocketMQRPC/注册Dubbo 3.4 Nacos前端Vue 3、Vue Router 4、Vite 8、marked、DOMPurify部署Docker、GitHub Actions 自托管 Runner架构三服务拆分 自研框架模块Maven 多模块工程按职责拆成几块模块端口职责OpenBlog-business8082主业务文章、评论、论坛、用户、SEO、媒体OpenBlog-message8083统一通知服务邮件阿里云 DirectMail Dubbo NacosOpenBlog-gateway8090API 网关JWT 粗校验、限流、traceId、统一错误兜底、CORSOpenBlog-framework-自研框架redis / elasticsearch / audit / idempotent 四个子模块OpenBlog-api-跨服务共享的 RPC 接口与 DTOvue-Vue 3 前端三个服务之间的耦合约束写进了部署文档business 通过 Dubbo 调 message两边共用同一套 RPC 接口升级必须同步部署business 和 gateway 共用 JWT 密钥换密钥也要两端同步。自研框架模块是另一个重点framework-redis封装RedisOps统一 Key 管理内置容错Redis 不可用时自动回退数据库不影响业务。framework-auditAuditLog注解 AOP自动记录操作快照和耗时。framework-idempotent通用幂等组件下文单独讲。framework-elasticsearch预留模块为搜索能力升级做准备。几个值得看的实现细节1. 文章表拆成两张articles表存标题、摘要、状态、分类等元数据article_bodies表单独存 Markdown 和渲染后的 HTML。列表查询不拖正文大字段正文可以独立做 FULLTEXT 全文索引。2. 两级缓存 版本号失效已发布文章走 Redis 缓存。正文缓存 30 分钟列表缓存 5 分钟。列表缓存的 Key 里带版本号发布或删除文章时只做一次 INCR旧缓存自然过期不用逐个清理。RedisOps所有方法内置 try-catchRedis 挂了就回退数据库不会让业务跟着挂。3. 轻量动态 SSRSPA 对搜索引擎不友好是老问题。OpenBlog 没有引入 Nuxt而是用 Nginx 按 User-Agent 分流爬虫请求转发到后端用 Thymeleaf 渲染完整 HTML普通用户直接拿 Vue SPA。再配上 Open Graph、JSON-LD 结构化数据、sitemap.xml 自动生成和百度站长推送凑成一套完整的 SEO 闭环。4. 网关收口 设备指纹限流gateway 统一做 JWT 粗校验、限流、traceId 透传、统一错误兜底和 CORS。限流支持设备指纹维度前端用 FingerprintJS 算指纹网关按指纹 IP 复合维度限流登录、反馈等未登录接口也能防刷。5. 幂等框架一个注解防重复执行双击发表评论会发两条RPC 超时重试也可能重复执行。OpenBlog 抽了一个通用幂等组件RepeatExecuteLimit注解 AOP 切面在方法外层套本地锁Caffeine Redisson 分布式锁 Redis 幂等标识三层防护配合双重检测。支持两种失败策略CACHE_REJECT直接拒绝提示重复操作。RETURN_SAME_RESULT返回上一次的结果。评论场景用这个双击会返回同一条评论而不是报错。幂等 Key 由前端 requestId 用户 业务字段拼出来不会误伤同一内容想再发一次的正常操作。6. 通知服务同步 异步两条路径消息服务拆出来之后通知编排层也整体迁了过去business 只留一个 Dubbo RPC 客户端。同步路径直发邮件异步路径走 outbox 模式先在同一事务里写notification_outbox表定时任务扫 PENDING 记录发到 RocketMQ消费后再投递保证至少一次配合幂等兜底防重复。邮件发送本身也做了幂等用email_records表去重。运维与部署三个服务各自 Docker 化CI 是三条独立流水线push master 自动构建部署互不影响。business 和 message 因为 Dubbo 接口强耦合部署必须同步。踩过的坑都有记录。比如 Dubbo 重试导致邮件重复发送最后用幂等三件套解决调用方幂等键 接收方去重 DB 唯一索引。这些经验沉淀在仓库的 docs 目录里。另外各模块日志都持久化到文件business 的 5xx 错误单独留痕方便排障。线上体验与开源线上地址 wecode.xin可以实际体验文章渲染、亮暗主题切换、SEO 效果右键查看源码能看到服务端渲染的结构化数据和 Live2D 看板娘。GitHub 仓库yyyCode/OpenBlog本地跑起来只需要 MySQL 8 Redis# 后端默认端口 8082mvn spring-boot:run-plOpenBlog-business# 前端cdvuenpminstallnpmrun dev一点个人感受这个项目最大的价值不在功能多而在它是一个完整可运行的参考实现微服务拆分、缓存、幂等、消息、SEO、CI/CD 都有真实落地每个设计都踩过坑、写成了文档。如果你在搭个人博客或者想系统看一个 Spring Boot 3 Vue 3 全栈项目实际长什么样可以拿来参考。欢迎 Star、提 Issue 交流。