概述
我们开工前要准备 “继续往下写代码的资格”:把一个空目录变成能跑起来的多模块微服务工程,并在上面跑通手机号加验证码登录。
纲要
- 本章目标:从空工程到可运行的微服务骨架与登录闭环
- 五个板块的任务书:认识项目 / 工程准备 / 接入第三方能力 / 实现登录 / 代码优化
- 五件事的依赖关系图:为什么顺序不能调换
- 第一章结束时的工程形态预告(模块树)
- 环境自检清单:开工前必须就绪的七项,以及哪些可以后补
- 学习建议与常见误解
- 本章第一篇实质内容指向
本章要抵达的终点
一句话讲清楚这一章的交付:从一个空工程开始,搭出项目的微服务骨架,并跑通"手机号 + 验证码"登录,包含首次登录自动注册。
"跑通"的标准不看写了多少行代码,而是看这条链路能不能从头走到尾:手机端请求验证码 →mf-app-server生成验证码并写入 Redis → 手机端提交验证码 → app-server 校验 → 通过 Dubbo 调mf-dubbo-db查库 → 用户不存在就建号 → 签发 JWT 返回。
五个板块的任务书
| 板块 | 要做什么 | 产出物 | 验收标准 |
|---|---|---|---|
| ① 认识项目 | 搞清产品是什么、用什么架构、模块怎么划 | 一张留在脑子里的图,不是代码 | 能说清 app-server 与 dubbo-db 各自职责,以及为什么 Dubbo 要拆接口模块和服务模块 |
| ② 工程准备 | 装工具、建模块、配依赖 | 能编译通过的多模块 Maven 聚合工程 | mvn clean install全绿;根工程下层级与模块名和讲义 3.2.2 模块表一致 |
| ③ 接入第三方能力 | 打通阿里云短信,并封装成自动装配组件 | mf-autoconfig中的SmsTemplate、SmsProperties、mfAutoConfiguration、META-INF/spring.factories | 业务模块里不写任何配置类、不 new 任何 SDK 对象,直接@Autowired SmsTemplate就能发短信 |
| ④ 实现登录 | 验证码 + JWT + 自动注册 | POST /user/login、POST /user/loginVerification两个接口,JwtUtils工具类 | 用 Postman 走完两段请求:先拿验证码,再带着验证码登录,返回体里同时有token和isNew;新手机号登录后库里多出一条tb_user记录 |
| ⑤ 代码优化 | 下沉公共字段,交给 MyBatis-Plus 自动填充 | BasePojo抽象类、MyMetaObjectHandler | User不再自己声明created/updated;插入数据时不手动赋值,两列也有值 |
③ 的验收标准值得单独强调一遍:它是"组件封装得对不对"的唯一判据。只要业务代码里还出现一次DefaultProfile或IAcsClient,就说明抽象漏了。
依赖关系:顺序不是课表排的
这五件事的先后,是被依赖逼出来的,不是随便编的顺序。
四条边各有一句话的理由:
- ② → ③:
mf-autoconfig是从一开始就规划好的模块。模块没分出来,短信组件只能塞进mf-app-server,以后第二个服务要用就得复制一份。 - ③ → ④:先有
SmsTemplate,UserService.sendMsg()才可能只写一行调用。反过来先写登录,业务里就会直接依赖阿里云 SDK,后面再想抽就得到处改。 - ④ → ⑤:
BasePojo是在User落库时才暴露出"每个实体都要手写两个时间字段"这个重复的。没写过一遍,抽象就没有依据。 - ① → 全部:认知类板块不产出代码,但它决定后面所有的"为什么这么选"。先看导学再动手,不是形式主义。
第一章结束时的工程形态
讲义 3.2.2 的模块表是"要建什么",这一章的代码快照是"建成了什么样"。对着下面这棵树开工,就知道终点在哪。
mf ├── pom.xml ├── mf-autoconfig # 自动装配组件,本章交付 SmsTemplate 与 spring.factories │ └── src/main/resources/META-INF/spring.factories ├── mf-model # 实体类,本章交付 User 与 BasePojo ├── mf-commons # 工具类,本章交付 JwtUtils ├── mf-dubbo # 只作父工程,不写代码 │ ├── mf-dubbo-interface # 服务接口,本章交付 UserApi │ ├── mf-dubbo-db # 数据库服务提供者,本章交付 UserMapper / UserApiImpl / MyMetaObjectHandler │ └── mf-dubbo-mongo # MongoDB 服务提供者,本章只建骨架,没有业务 └── mf-app-server # 与手机端交互的入口,本章交付 LoginController / UserService两个容易忽略的点:mf-dubbo本身只是"文件夹",不写一行 Java;mf-dubbo-mongo这一章是空壳,它的用处在后面的附近的人与动态模块。
环境自检清单
开工前把这张表从上到下过一遍,能省掉后面一大半"跑不起来又不报明显错"的时间。
| 项 | 要求 | 怎么验 | 必须 / 可后补 |
|---|---|---|---|
| JDK | 8 | java -version输出1.8.0_xxx | 必须 |
| Maven | 3.6+,配国内镜像 | mvn -v;改settings.xml的<mirrors>指向阿里云,否则拉依赖慢到怀疑网络 | 必须 |
| IDEA | 装好 Lombok 插件并开启注解处理 | 打开工程后@Data能点进去、无红色波浪线 | 必须 |
| Nacos | 启动并注册可用 | 访问http://192.168.136.160:8848/nacos,默认nacos/nacos能进控制台 | 必须 |
| Redis | 6379 可连 | redis-cli -h 192.168.136.160 ping回PONG | 必须 |
| MySQL | 建库mf,导入 SQL | mysql -uroot -proot -e "use mf; show tables;"能看到tb_user | 必须 |
| 短信账号 | 阿里云 AccessKey + 签名 + 模板 | 先跑通再说 | 可后补 |
| 端口规划 | app-server 18080 / dubbo-db 18081 / Dubbo 协议 20881 / Nacos 8848 | lsof -i:18080启动后应被占用 | 必须 |
| Postman | 调POST /user/login | 返回 200 | 必须 |
| Android 模拟器 | 网易 MuMu,装 APK | 能连上 app-server | 可后补 |
短信账号为什么可以后补:UserService.sendMsg()里真正的发送与写 Redis 是两件事,先把验证码固定成123456写进 Redis、把template.sendSms(...)注释掉,整条登录链路照样能调通。等账号下来了再把那行注释放开,业务代码一行都不用改——这正是第 ③ 步封装组件的收益。
学习建议
先跑通再求甚解。这一章的目标是"看到东西动起来",不是把spring.factories的加载时机、Dubbo 的泛化调用都抠透。跑通之后再回头读实现,理解成本低得多。
跟着敲,不要复制。多模块工程的依赖传递、<parent>指向、spring.factories的路径,这些地方复制粘贴非常容易漏一层。漏了之后症状还不是报错,是"注解不生效"。
报错先看日志定位模块。多模块工程的报错十有八九是第一句:ClassNotFoundException或找不到com.mf.model.domain.User,真实原因往往是被依赖的模块没install到本地仓库。先mvn clean install -DskipTests再谈别的。
用 Git 分阶段提交。每完成一个板块提交一次,出问题好回退。这是真实工程习惯,也是这一章最便宜的保险。
几个容易踩的误解
| 误解 | 实际情况 |
|---|---|
| 先把讲义通读一遍再开工 | 讲义里大量内容是"做完之后才看得懂"的。边做边翻,效率高得多 |
| 模块划分可以边写边改 | 中期改模块划分,要动全部 pom 的<parent>和<dependency>,成本远高于开工前花十分钟想清楚 |
| 这一章就是照抄代码 | 抄出来的东西只有这一章能用。重点是理解分层的边界和封装的套路,比如为什么SmsTemplate要放在 autoconfig 而不是 app-server |
| 登录功能很简单 | 这里串了四类技术:Redis 缓存、Dubbo RPC、第三方服务、JWT。任何一环配错都表现为"登录失败" |
下一篇
这一章的第一篇实质内容就是《项目介绍》——先把这个平台是干什么的、面向谁、后端用什么技术栈讲清楚,再去建工程。认知在前,动手在后,顺序和上面那张依赖图是一致的。
官方文档
- Spring Boot 2.3.9 Release Notes
- MyBatis-Plus 自动填充
- Nacos 快速开始
- 阿里云短信服务文档
总结
这一章的定位是开工前的任务书:五个板块、各自的产出物、可验证的验收标准,以及一条由依赖推出来的执行顺序。验收不看代码量,看链路——短信能发、验证码能存、登录能返回 token、新号能自动入库。环境清单里唯一可以后补的是短信账号,用调试模式先把流程跑通即可。