
一、项目面试
面试中介绍项目的方法
在面试过程中,若被问及相关项目,为提升通过几率,应着重介绍项目的功能点和架构升级内容。确保将项目的亮点讲透讲精彩,这对获取 offer 至关重要。
1. 项目架构
项目整体架构概述
项目整体架构由多个层次构成:
- 系统入口层 :分为 C 端(前台)供顾客使用和 B 端(后台)供管理员使用。
- 接入层 :包括网关以及 user filter 和 admin filter 进行权限校验。对于完全开放的内容(如商品详情),可能无需经过过滤器。
- 业务层 :涵盖订单、商品、目录、购物车、用户、广告等功能模块。这些功能可通过框图方式清晰表达。
- 基础设施层 :包括所使用的组件和存储设备,如 MySQL、Redis、MQ 以及文件存储等。
- 通用能力和通用功能 :通用能力包括日志记录、异常处理、定时任务、权限整体校验、参数校验以及文件上传等。通用功能则涵盖图片处理、Excel 处理以及二维码生成等。
重点亮点 :整个项目架构图展示了丰富的功能、通用能力和通用功能,以及清晰的基础设施和业务层划分。在面试中展示此架构图,可体现开发经验和整体理解能力,是项目面试中的一大亮点。建议考生截图并尝试自行绘制,以确保熟悉并掌握架构图的各个部分。
2. 架构演进
项目面试中的架构演进亮点
-
单体变微服务 :
- 最初采用 spring boot 单体项目。
- 为实现模块间解耦,升级为 spring cloud 微服务架构,并学习 spring cloud 各模块间的通信机制。
-
用户权限校验升级 :
- 初始使用传统的 session 和 cookie 模式进行用户权限校验。
- 后续升级为 jwt 验证方式。需了解 jwt 的定义、组成部分、优点及缺点。
-
网关升级 :
- 最初使用旧网关。
- 现已迭代至 spring cloud gateway 网关。升级过程中解决了过滤器定义、新网关下身份验证、筛选排除及原网关升级等问题。
3. 项目亮点
本项目技术亮点包括:
-
线程池的使用 :
- 线程池是面试中的必考点,适用于初级至高级工程师。
- 在发送邮件时,为提高初始发送速度,采用线程池进行异步发送。需掌握线程池各参数的含义。
-
分布式锁的应用 :
- 在执行定时任务时,为防止多个实例同时执行,使用分布式锁。
- 本项目采用 Redis 实现分布式锁,需理解其背后原理。
-
分布式事务的引入 :
- 单体事务相对简单,但分布式环境中问题增多。
- 由于架构升级和微服务拆解,原单机事务无法满足需求,因此引入分布式事务。
以上三点是项目面试中的加分项,涵盖了整体架构、架构演进过程及独立亮点。
二、常见问题解答
1. 文件路径映射
有学生提出关于文件路径映射的疑问,即不理解为何在网页中输入地址即可打开图片。其映射机制是在 mvc config 类中配置了 URL 的映射规则。具体为,若 URL 中包含 image 路径,则将其映射至指定的 file 路径。该 file 路径为文件夹地址,需根据个人实际情况进行配置。
2. 远程调用校验管理员身份方法
我们之前会有一个 check admin row 这样的方法。有同学提出,这个时候是否需要用到远程调用?远程调用是否成本较高?是否可以直接引入 user service,然后直接使用 service 进行校验?
实际上,如果直接使用 service,会导致耦合性过强。因为与用户相关的功能,应尽量交由用户模块处理。例如,校验管理员身份这一功能,发生在 cut order 购物车订单模块中。最好的办法不是直接引入 user service,否则可能又回到单体架构上。最佳实践是,需要用到用户模块的功能时,通过接口调用其提供的服务。这样,后续无需关心其具体实现,即使用户模块逻辑发生改动,也仅是该模块内部的事务,与其他模块无关。因此,最优方案并非直接引入相关 service。
3. 连接本地端口问题
六三七九端口连接报错问题:
- 报错原因 :六三七九是 Redis 的默认端口,若遇到无法连接到此端口的错误,很大概率是本机未启动 Redis 服务。
- 项目运行依赖 :项目运行不仅依赖于 Redis,还包括其他服务如 MQ 等,这些服务均需正确下载、安装、配置并启动。
- 数据库配置 :若不进行数据库配置,项目将无法启动,因为数据库是项目运行的必要依赖。
- 微服务环境依赖 :在微服务环境下,若未启动 Eureka 作为注册中心,服务虽然可以启动,但会不断报错,提示找不到注册中心。
总结 :项目运行不仅依赖于 JAVA 代码,还需确保所有相关服务和依赖均正确配置并启动。
4. 日志查看问题
- 配置基础设施 :是必需的准备工作。
- 学会查看日志 :是提高问题排查能力的关键。
- 错误日志的重要性 :错误日志是查找问题原因的重要依据。在大多数情况下,错误都会在日志中清晰记录,无论是六三七九错误还是无法找到相应数据库的问题。错误日志会提供关键信息。
- 自我尝试解决问题 :有助于能力提升和获得成就感。如果日志难以理解,可以将相关日志复制到网站进行搜索,通常能找到其他遇到相同问题并分享解决思路的用户。建议学习者在遇到问题时,首先尝试自行解决,通过查看日志或搜索日志内容来找到解决方案。
三、总结
Spring Cloud 电商进阶开发总结
- 定时任务的学习与应用 :掌握了 cron 表达式的写法,并在 Spring 中实现了定时任务。实现了定时捞取超时订单并批量关闭的功能。为定时任务添加了分布式锁以增强稳定性。
- 线程池与 ThreadLocal 的使用 :在项目中应用了线程池来实现异步发送邮件。增强了路由的安全性,排除了不希望用户访问的接口。对异常进行了统一处理,提升了项目的健壮性。
- Spring Cloud Gateway 的学习与思考 :重点不仅在于如何使用 Spring Cloud Gateway,更在于项目开发中的思考。当切换网关或验证方式从 session 升级到 jwt 时,需要编写 gateway 相关配置。在微服务代码中,需调整以解除 session 依赖,并调整相关费用逻辑为 user free local。
- 项目面试相关内容 :介绍了项目架构、演进过程及项目亮点。助力面试者提升面试表现,争取更高分数。
- 课程问题解答 :对 Spring Cloud 课程中常见问题进行了解答,帮助学习者巩固知识点。