05-code-review-report

MyBilibili 代码审查报告

1. 审查范围

  • 审查时间:2026-07
  • 范围:当前云微服务版本(master,Java 8 服务)
  • 规模:约 509 个 Java 文件
  • 方法:静态扫描 + 人工抽样 + 架构审计脚本

2. 总体结论

维度 评级 说明
架构清晰度 ★★★☆ 服务边界基本清晰,职责划分合理
依赖耦合 ★★☆☆ 与 Spring Cloud Alibaba 深度耦合
可移植性 ★★☆☆ 强绑定 Java 生态
代码质量 ★★★☆ 整体可读,部分长文件
抽象程度 ★★★☆ StorageService 已抽象,其余紧耦合
测试覆盖 ★★☆☆ 覆盖率不足

3. 发现的问题

3.1 严重问题

P1-1:业务代码与 RocketMQ 直接耦合

位置: 多个服务直接注入 RocketMQTemplate

java 复制代码
@Autowired
private RocketMQTemplate rocketMQTemplate;

影响:

  • 换消息队列必须改业务代码
  • 单元测试必须启动 RocketMQ 或用 mock
  • 无法在弱设备使用(RocketMQ 太重)

建议: 抽象 MessageQueue 接口,业务依赖接口


P1-2:服务间调用用 @FeignClient 硬绑定

位置: 各服务 Feign Client 接口

java 复制代码
@FeignClient(name = "mybilibili-content-interaction")
public interface ContentInteractionClient {
    @GetMapping("/interaction/comment/list")
    List<CommentDTO> listComments(...);
}

影响:

  • 只能 Java 调用 Java
  • 与 HTTP 路由耦合,改协议困难
  • 无法被 Go 服务调用

建议: 抽 ServiceCaller 接口,gRPC 实现


P1-3:Nacos 配置直接注入,无抽象

位置: @Value("${nacos.config...}") 或 Nacos 配置类

影响:

  • 配置中心换 etcd 要改所有注入点
  • 弱设备无法跑 Nacos

建议: 配置管理抽象,etcd/文件/env 多实现


3.2 中等问题

P2-1:服务内模块边界模糊
  • content-interaction 服务同时处理评论、点赞、收藏、举报,内部缺少清晰模块分层
  • video-media 服务把转码、字幕、直播、AI 总结堆在一起

建议: 内部按 domain 分包,后续按需拆分

P2-2:DTO 与 Entity 混用
  • 部分 Controller 直接返回 Entity
  • 部分 Entity 里混入展示字段

建议: 明确 DTO/Entity/PO 分层

P2-3:长方法、长类
  • 部分 Service 类超过 800 行
  • Controller 里存在事务逻辑

建议: 抽出辅助类,事务下沉 Service

P2-4:异常处理不统一
  • 部分接口返回自定义 Result,部分直接抛异常
  • 错误码未统一枚举

建议: 统一错误码 + 全局异常处理

P2-5:魔法值与硬编码
  • 多处硬编码 Redis key、超时时间、重试次数

建议: 常量类/配置化


3.3 轻量问题

  • 大量 Lombok 注解(可接受,但注意 GraalVM 反射配置)
  • 注释中英文混杂
  • 部分 Controller 缺少参数校验
  • 日志级别不统一

4. 亮点

4.1 StorageService 已抽象 ✅

复制代码
StorageService(接口)
 ├── MinioStorageService(MinIO 实现)
 ├── LocalStorageService(本地实现)

这证明抽象层模式已在本项目实践过且有效,可推广到 MessageQueue/ServiceDiscovery/CacheStore。

4.2 服务边界基本合理

  • 8 个服务职责基本单一
  • gateway 独立,认证逻辑集中
  • mq 独立模块处理消息

4.3 有架构审计脚本

scripts/check-architecture.ps1、check-feign-boundaries.ps1 等脚本可用于自动化检查。


5. 重构优先级建议

优先级 项 工作量 风险
P0 抽象 MessageQueue 接口 中 高
P0 抽象 ServiceCaller 接口 中 高
P0 抽象 ServiceDiscovery 低 中
P1 统一错误码/异常处理 低 低
P1 DTO/Entity 分层 中 低
P2 长类拆分 中 低
P2 硬编码配置化 低 低

策略: 先抽接口(改动集中在注入点),确认编译通过且功能不变后再逐个替换实现。这样重构风险最低、可随时回滚。


6. 结论

  1. 现有代码功能完整 ,但基础设施耦合严重
  2. 抽象层思路已被 StorageService 验证可行
  3. 重构建议从 MessageQueue → ServiceCaller → ServiceDiscovery 顺序推进
  4. 每个服务独立迁移,先支持配置切换(保持原实现),再逐步替换
  5. GraalVM 编译时需注意 Lombok/反射的 native-image 配置(reflect-config.json)
相关推荐
JAVA面经实录9171 小时前
Java高级后端 · 架构组件开发 + CodeReview(本岗位差异化核心)
java·架构·代码复审
xhy_070710 天前
Git 合并冲突怎么解决?用 AI 处理冲突的流程、Prompt 和 4 个易错点
人工智能·git·安全·prompt·ai编程·代码复审
hasty11 天前
2026软件供应链安全政策全景
安全·安全威胁分析·代码复审
Liaiyang6619 天前
# 自研 AST 容错初筛工具:横向评测 Django、PyTorch、TensorFlow 三大开源 Python 框架异常收容风险
python·测试工具·自动化·开源软件·代码规范·devops·代码复审
hasty20 天前
一封邮件如何跨越三层边界拿到 root?Cisco Secure Email Gateway CVE-2026-76461 深度解析
安全·安全威胁分析·代码复审
hasty21 天前
一次同秒竞态,如何把污染制品送进 npm 与 TestPyPI
安全·安全威胁分析·代码复审
hasty22 天前
未登录也能读取服务器文件:GitLab CVE-2026-85706 深度解析
安全·代码复审
hasty22 天前
一个任意文件读取漏洞,如何撬动整个 CI/CD 信任链
安全·安全威胁分析·代码复审
数据知道1 个月前
白盒审计入门:Source Code Review 检查清单
网络·安全·网络安全·代码复审