如果让我选一个自己做过的最正确的决定,那就是花了半年把微服务框架的底子搭好。

不是认证中心、不是权限中心——是那层所有服务共享的东西:CommonAuthFilter、@WuxianAccess、CommonExceptionHandler。今天复盘一下我是怎么一步步搭出来的,以及这套东西到底省了多少事。


从重复代码开始的

最早我的 auth、perm、blog 三个服务是独立开发的。每个都有自己的 JWT 解析逻辑,自己的异常处理,自己的权限校验。代码差不多,但分散在三个仓库里。

改一个 JWT 解析的 bug,三个服务要改三次。

有一次我修了一个 token 过期的处理逻辑,改了 auth 和 perm,忘了改 blog。结果博客的 API 返回了一个莫名其妙的 500。排查了一下午。

那天晚上我就决定:抽共用代码。


wuxiannet-common 里有什么

现在这个公共包里沉淀了这些组件:

组件一句话
CommonAuthFilter不管 USER token 还是 APP token,一个过滤器全搞定
@WuxianAccess注解里写权限码,切面自动校验
@OperationLog注解里写操作描述,切面自动记日志
JwtTokenUtilJWT 解析一把梭
UserContext任何地方拿当前用户信息
CommonExceptionHandler全局异常处理,返回友好错误
ApiResult / PageResult统一响应格式

听起来不多。但对一个独立开发者来说,意味着:

新接一个服务,只需要写业务代码。


举个真实的例子

前两个月我加了个 scheduler 服务。你猜后端代码写了多久?

  • pom.xml 引入 common 包
  • application.yml 配置数据库
  • 加个 SecurityConfig 启用 CommonAuthFilter
  • 写业务代码

一天。 从建项目到跑起来。

没有写 JWT 解析。没有写异常处理。没有写权限校验。没有写统一的返回格式。这些东西 common 包里全有了,引进来就能用。


踩过的坑

Map.of() 不能传 null。

这是 Java 基础语法限制,但我忘了。CommonAuthFilter 里有一段写 401 返回:

Map.of("code", 401, "message", msg, "data", null)

本地跑没问题。打成 JAR 包部署上去,直接 NPE,空响应体。用户看到的是一个白屏——比 401 更糟,因为用户根本不知道发生了什么。

改成 new HashMap<>() 就解决了。后来我把这个写进了编码规范:所有 Map.of() 先检查有没有 null value。


回头看看

这半年搭框架,看起来是「慢」,其实是「快」。

每个服务都省了 80% 的重复代码。修一个 bug 一个地方改了所有服务生效。接新服务只要一天。这不是过度设计,这是独立开发者用最少的资源做最多的事。

如果你也在纠结要不要抽公共代码——别纠结了。重复三次就抽。你不会后悔。


关于作者:无羡,独立开发者,全栈工程师,专注 AI 应用与微服务架构。

📌 分类:技术复盘

🔗 个人博客 — 更多技术文章
✨ 开发者福利整理 — 云服务资源汇总
📂 软件工坊 — 我的技术分享
🌐 个人门户 — 独立开发作品全集

更多推荐