外观
六、给前端的学习路径
后端代码量大,不要试图一次全看完。 按照下面这个顺序,每一步集中看一个点,效率最高。
Step 1:理解网关(入口层)
学什么
- 请求从哪里进来
- 怎么路由到目标服务
- 怎么做身份验证
看哪些文件
- 网关路由配置(
application.yml)—— 看请求如何被分发到各服务 - 认证过滤器(
AuthFilter.java)—— 看 token 怎么校验 - 入口类(
GatewayApplication.java)—— 看服务怎么启动
类比帮你理解
text
Spring Cloud Gateway 的运作方式:
请求进来
│
├── 匹配路由规则(predicate) ← 类似 Nginx 的 location 匹配
│ /api/user/** → 转发到用户服务
│ /api/ai/** → 转发到 AI 服务
│
├── 经过过滤器链(filters) ← 类似 Express 的 middleware 链
│ AuthFilter → RateLimitFilter → ...
│
└── 转发到目标服务你能学到
- Spring Cloud Gateway 的路由机制
- token 校验的典型实现
- 请求头在微服务间传递的方式
Step 2:看一个最简单的业务服务
学什么
Controller → Service → Repository 的完整链路(后端三层架构)
看哪些文件
- Controller(
UserController.java)—— 接口入口,看 URL 和参数 - Service 实现(
LoginRegisterServiceImpl.java)—— 核心业务逻辑 - Entity(
UserMst.java)—— 数据模型(数据库里存了什么) - Repository(
UserMstRepository.java)—— 数据库查询
怎么读
text
① UserController.login(LoginDto dto)
→ "哦,POST /v1/user/login 接口接收一个 LoginDto"
② 跟进 service.login(dto)
→ "哦,先验证验证码,再查用户,再调认证服务获取 token"
③ 看到 userRepository.findByLoginAndUserType(...)
→ "哦,这就是在 MongoDB 里按手机号查用户"
④ 看到 authFeignClient.getToken(...)
→ "哦,这就是在调认证服务的接口"你能学到
- 后端"三层架构"的职责分工
- Spring 注解的基本用法
- MongoDB Repository 的声明式查询
Step 3:理解服务间通信(Feign Client)
学什么
服务之间怎么互相调用
看哪些文件
- Feign 接口定义(
AuthFeignClient.java) - Feign 调用方(搜
aiFeignClient/userFeignClient的使用处) - Fallback 降级(
AiFeignFallback.java) - Feign 全局配置(
FeignConfiguration.java)
核心概念
java
// 声明式 HTTP 客户端(你定义接口,Feign 自动发 HTTP 请求)
@FeignClient(name = "auth-service", url = "${service.auth.url}",
fallback = AuthFeignFallback.class)
public interface AuthFeignClient {
@PostMapping("/oauth/token")
RtData<TokenResponse> getToken(@RequestBody TokenRequest request);
}
// 降级处理(远程服务挂了怎么办)
@Component
public class AuthFeignFallback implements AuthFeignClient {
@Override
public RtData<TokenResponse> getToken(TokenRequest request) {
return RtData.fail("认证服务暂时不可用"); // 返回兜底数据
}
}💡 前端类比:
typescript// 前端版的 "Feign Fallback" async function getToken(req) { try { return await axios.post('/oauth/token', req) } catch (e) { return { code: -1, message: '认证服务暂时不可用' } // fallback } }
你能学到
- 声明式 HTTP 客户端的写法
- Fallback 降级保护
- 请求头透传(requestId、uid 等)
Step 4:理解异步流程(消息队列)
学什么
RocketMQ 如何实现异步任务
看哪些文件
- 发消息工具类(
RocketMQUtils.java) - 消费者注解(
@RocketMQMessageListener) - 推送式消费者(
ImageResultConsumer.java) - 拉取式消费者(
ImageGenerateTaskPullConsumer.java)
消息流转图
text
发送方 消费方
────── ──────
画布服务 AI 服务
│ │
├─── 发送 "请生成图片" 消息 ──▶ MQ │
│ │
│ ├── 从 MQ 拉取消息
│ ├── 调用 AI API
│ ├── 发送 "图片已生成" 消息 ──▶ MQ
│ │
├── 从 MQ 接收结果消息 ◀─────────────┘
├── 上传图片到 OSS
├── 更新任务状态
│你能学到
- 生产者-消费者模式
- 推送 vs 拉取两种消费模式
- 异步任务处理的典型架构
Step 5:理解数据访问层
学什么
后端怎么操作数据库
看哪些文件
- MongoDB 配置(
MongoAutoConfiguration.java) - 通用 Repository(
CustomRepository.java) - 自定义查询实现(
XxxCustomRepositoryImpl.java) - MySQL 配置(
MybatisPlusConfig.java) - MyBatis SQL 映射(
XxxMapper.xml)
Repository 方法命名规则
java
// Spring Data 根据方法名自动生成查询,规则如下:
findByLogin(String login)
// → WHERE login = ?
findByLoginAndUserType(String login, String userType)
// → WHERE login = ? AND userType = ?
findByUidIn(Collection<Long> uids)
// → WHERE uid IN (?)
findByCreatedAtBetween(Date start, Date end)
// → WHERE createdAt BETWEEN ? AND ?
countByUserType(String userType)
// → SELECT COUNT(*) WHERE userType = ?💡 是不是很神奇?只要按命名规则写方法名,不需要自己写查询语句!
你能学到
- Spring Data MongoDB 的 Repository 模式
- MongoTemplate 手动查询(用于复杂场景)
- MyBatis XML SQL 映射(用于 MySQL)
Step 6:阅读一个完整的复杂模块
学什么
真实业务模块中用到的设计模式
看哪些文件
- Controller(
ImageController.java)—— 入口 - Service 接口(
ImageTaskService.java) - Service 实现(
ImageTaskServiceImpl.java)—— 策略模式
你会在代码里看到的设计模式
| 模式 | 在哪里 | 解决什么问题 | 前端类比 |
|---|---|---|---|
| 策略模式 | 图片生成策略选择 | 不同 AI 模型用不同处理逻辑 | switch(type) 但更优雅 |
| 外观模式 | 任务编排 Service | 封装多个子步骤为一个方法 | 封装复杂的连续 API 调用 |
| 自定义注解 | @PaidFeature | 标记需要付费的功能 | 类似 @needAuth 装饰器 |
你能学到
- 策略模式如何让代码从
if-else泥潭中解脱 - 外观模式如何简化复杂调用
- 自定义注解的实际用法
