最近把mall-swarm项目升级支持了最新版Spring Cloud+Spring Boot 3+JDK17,今天就来介绍下mall-swarm项目做了哪些升级,包括依赖的升级、框架的用法升级以及运行部署的改动,希望对大家有所帮助!
mall-swarm项目简介
这里还是简单介绍下mall-swarm项目吧,mall-swarm项目(11k+star)是一套微服务商城系统,采用了Spring Cloud Alibaba、Spring Boot 3.2、JDK17、Kubernetes等核心技术,同时提供了基于Vue的管理后台方便快速搭建系统。mall-swarm在电商业务的基础集成了注册中心、配置中心、监控中心、网关等系统功能。
- Github地址:https://github.com/macrozheng/mall-swarm
- Gitee地址:https://gitee.com/macrozheng/mall-swarm
- 文档网站:https://cloud.macrozheng.com
后台管理系统演示
后台管理系统演示地址:https://www.macrozheng.com/admin/index.html
移动端商城演示
移动端商城演示地址(浏览器切换到手机模式体验更佳):https://www.macrozheng.com/app/
系统架构
mall-swarm采用目前主流的微服务技术栈
实现,涵盖了一般项目中几乎所有使用的技术。同时项目业务完整,包括前台商城和后台管理系统,能支持完整订单流程,通过下面这张架构图,大家应该能对mall-swarm项目的架构有所了解了。
升级版本
目前项目中的依赖都已经升级到了最新主流版本,具体的版本可以参考下表。
框架 | 版本 | 说明 |
---|---|---|
Spring Cloud | 2021.0.3->2023.0.1 | 微服务框架 |
Spring Cloud Alibaba | 2021.0.1.0->2023.0.1.0 | 微服务框架 |
Spring Boot | 2.7.5->3.2.2 | Java应用开发框架 |
Spring Boot Admin | 2.7.5->3.2.2 | 微服务应用监控 |
Sa-Token | Spring Security Oauth2->Sa-Token | 认证和授权框架 |
Nacos | 2.1.0->2.3.0 | 微服务注册中心 |
MyBatis | 3.5.10->3.5.14 | ORM框架 |
MyBatisGenerator | 1.4.1->1.4.2 | 数据层代码生成 |
PageHelper | 5.3.2->6.1.0 | MyBatis物理分页插件 |
Knife4j | 3.0.3->4.5.0(SpringFox->SpringDoc) | 文档生产工具 |
Druid | 1.2.14->1.2.21 | 数据库连接池 |
Hutool | 5.8.9->5.8.16 | Java工具类库 |
升级用法
在mall-swarm项目升级Spring Boot 3的过程中,有些框架的用法有所改变,比如微服务权限解决方案改用了Sa-Token,微服务API文档聚合方案中的Knife4j实现改用了SpringDoc,商品搜索功能中使用了Spring Data Elasticsearch的新用法,这里我们将着重讲解这些升级的新用法!
微服务权限解决方案升级
由于之前使用的基于Spring Security Oauth2权限解决方案已经不再支持Spring Boot 3,这里改用了Sa-Token提供的微服务权限解决方案。
- 在mall-gateway网关服务上进行了比较大的改动,比如之前使用
AuthorizationManager
来实现动态权限,现在使用了SaReactorFilter
来实现动态权限;
/**
* @auther macrozheng
* @description Sa-Token相关配置
* @date 2023/11/28
* @github https://github.com/macrozheng
*/
@Configuration
public class SaTokenConfig {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 注册Sa-Token全局过滤器
*/
@Bean
public SaReactorFilter getSaReactorFilter(IgnoreUrlsConfig ignoreUrlsConfig) {
return new SaReactorFilter()
// 拦截地址
.addInclude("/**")
// 配置白名单路径
.setExcludeList(ignoreUrlsConfig.getUrls())
// 鉴权方法:每次访问进入
.setAuth(obj -> {
// 对于OPTIONS预检请求直接放行
SaRouter.match(SaHttpMethod.OPTIONS).stop();
// 登录认证:商城前台会员认证
SaRouter.match("/mall-portal/**", r -> StpMemberUtil.checkLogin()).stop();
// 登录认证:管理后台用户认证
SaRouter.match("/mall-admin/**", r -> StpUtil.checkLogin());
// 权限认证:管理后台用户权限校验
// 获取Redis中缓存的各个接口路径所需权限规则
Map<Object, Object> pathResourceMap = redisTemplate.opsForHash().entries(AuthConstant.PATH_RESOURCE_MAP);
// 获取到访问当前接口所需权限(一个路径对应多个资源时,拥有任意一个资源都可以访问该路径)
List<String> needPermissionList = new ArrayList<>();
// 获取当前请求路径
String requestPath = SaHolder.getRequest().getRequestPath();
// 创建路径匹配器
PathMatcher pathMatcher = new AntPathMatcher();
Set<Map.Entry