1. 项目概述:在线图书商城的技术架构选型
这个基于Spring Boot+Vue的在线图书商城系统,本质上是一个典型的B2C电商平台。我在2018年参与过类似项目的重构,当时从传统Java EE架构迁移到Spring Boot+Vue组合,性能提升了近3倍。这种前后端分离的架构已经成为当前电商系统开发的事实标准。
核心架构分为三个层次:
- 前端展示层:采用Vue.js构建响应式用户界面
- 业务逻辑层:Spring Boot实现RESTful API
- 数据持久层:MySQL关系型数据库存储业务数据
选择这套技术栈主要基于四个考量:
- 开发效率:Spring Boot的自动配置和起步依赖大幅减少XML配置
- 性能表现:Vue的虚拟DOM优化前端渲染性能
- 可维护性:前后端分离便于团队分工协作
- 生态成熟:两者都有丰富的插件和社区支持
提示:新手常犯的错误是直接开始编码,建议先用Axure或墨刀完成原型设计,明确各模块数据流转关系。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心模块设计与实现
2.1 用户认证模块
采用JWT+Spring Security实现认证授权。关键配置如下:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
实测中发现三个常见问题:
- 未设置合理的token过期时间(建议2小时)
- 未实现token刷新机制
- 密码未加盐存储(推荐BCryptPasswordEncoder)
2.2 商品管理模块
采用DDD领域驱动设计,核心聚合根为Book:
java复制@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String title;
@Column(columnDefinition = "DECIMAL(10,2)")
private BigDecimal price;
// 库存采用乐观锁控制
@Version
private Integer stock;
// 分类关联
@ManyToOne
private Category category;
}
特别注意:图书图片存储建议使用OSS服务,数据库只保存URL。我们曾因直接存base64导致数据库膨胀到50GB。
2.3 订单支付模块
状态机设计是关键,典型状态流转:
mermaid复制stateDiagram
[*] --> PENDING
PENDING --> PAID: 支付成功
PENDING --> CANCELLED: 用户取消
PAID --> SHIPPED: 发货
SHIPPED --> COMPLETED: 确认收货
SHIPPED --> RETURNING: 发起退货
实现时注意:
- 订单号生成使用雪花算法
- 支付超时需定时任务扫描
- 库存扣减要放在事务最后一步
3. 前后端协同开发实践
3.1 API接口规范
采用RESTful风格,响应统一格式:
json复制{
"code": 200,
"message": "success",
"data": {
"id": 123,
"title": "Java编程思想"
},
"timestamp": 1634567890
}
建议使用Swagger生成文档,Spring Boot配置:
java复制@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.bookstore"))
.paths(PathSelectors.any())
.build();
}
3.2 Vue前端工程化
推荐的项目结构:
code复制src/
├── api/ # 接口定义
├── assets/ # 静态资源
├── components/ # 公共组件
├── router/ # 路由配置
├── store/ # Vuex状态管理
├── utils/ # 工具函数
└── views/ # 页面组件
关键优化点:
- 按需加载路由组件
- 使用axios拦截器处理全局错误
- 商品列表实现虚拟滚动
4. 性能优化实战记录
4.1 数据库优化
MySQL配置建议:
sql复制# 图书表添加复合索引
ALTER TABLE book ADD INDEX idx_category_price (category_id, price);
# 分页查询优化
SELECT * FROM book WHERE category_id = 1 ORDER BY price DESC LIMIT 10000, 20;
-- 改写为
SELECT * FROM book WHERE id IN (
SELECT id FROM book WHERE category_id = 1
ORDER BY price DESC LIMIT 10000, 20
);
4.2 缓存策略
采用多级缓存架构:
- 本地缓存(Caffeine):高频访问的基础数据
- Redis缓存:热点商品信息
- CDN缓存:静态资源
缓存击穿解决方案:
java复制public Book getBookById(Long id) {
// 1. 先查缓存
Book book = cache.get(id);
if (book != null) {
return book;
}
// 2. 获取分布式锁
RLock lock = redissonClient.getLock("book:" + id);
try {
lock.lock();
// 3. 二次检查
book = cache.get(id);
if (book != null) {
return book;
}
// 4. 查数据库
book = bookRepository.findById(id).orElse(null);
if (book != null) {
cache.put(id, book);
}
} finally {
lock.unlock();
}
return book;
}
5. 部署与监控方案
5.1 容器化部署
Docker Compose配置示例:
yaml复制version: '3'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./mysql-data:/var/lib/mysql
redis:
image: redis:alpine
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
frontend:
build: ./frontend
ports:
- "80:80"
5.2 监控指标
必备监控项:
- JVM内存使用(通过Micrometer暴露)
- API响应时间P99
- MySQL慢查询数量
- Redis缓存命中率
Prometheus配置示例:
yaml复制scrape_configs:
- job_name: 'spring'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['backend:8080']
6. 典型问题排查实录
6.1 N+1查询问题
现象:获取图书列表时产生大量SQL
解决方案:
java复制// 错误写法
@Query("SELECT b FROM Book b")
List<Book> findAll();
// 正确写法
@Query("SELECT b FROM Book b LEFT JOIN FETCH b.category")
List<Book> findAllWithCategory();
6.2 跨域问题
Vue开发环境配置:
javascript复制module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
}
}
生产环境建议通过Nginx解决:
nginx复制location /api {
proxy_pass http://backend:8080;
add_header 'Access-Control-Allow-Origin' '$http_origin';
add_header 'Access-Control-Allow-Credentials' 'true';
}
7. 扩展功能建议
7.1 推荐系统
基于用户行为的协同过滤:
python复制# 使用Surprise库
from surprise import Dataset, KNNBasic
data = Dataset.load_builtin('ml-100k')
algo = KNNBasic()
algo.fit(data.build_full_trainset())
# 获取相似用户
algo.get_neighbors(uid=123, k=5)
7.2 秒杀功能
技术要点:
- 库存预热到Redis
- 令牌桶限流
- 请求队列削峰
Redis Lua脚本示例:
lua复制local stock = tonumber(redis.call('GET', KEYS[1]))
if stock <= 0 then
return 0
end
redis.call('DECR', KEYS[1])
return 1
这个项目最让我意外的是Vue的响应式系统与Spring Boot的配合效率。在实际压测中,采用这套架构的系统在4核8G服务器上可以稳定支撑3000+ QPS,而传统的JSP方案只能达到800 QPS左右。不过要注意的是,初期我们忽略了Vue的keep-alive组件导致内存泄漏,后来通过封装动态路由组件解决了这个问题。
