SpringCloud+Mybatis实现微服务电商系统

1 前言

在毕业论文答辩完成后,我开始学习微服务这一块的内容,加上工作中也接触到了实际应用的微服务项目,因此想从零搭建一套项目学习这方面的内容,于是就把之前毕设的电商拿来改造重构,从去年7月至今,由于工作繁忙,经过半年左右终于基本完成。

这里附上之前SpringBoot版本的电商项目介绍:微信小程序+Vue+SpringBoot实现B2C电商系统(毕业论文)

下面简单介绍下,由于项目比较庞大,感兴趣的可以前往gitee仓库下载到本地。
gitee仓库地址

注意:这个项目我并没有完全启动所有服务运行过,只是保证了正常登录、可以获取token访问接口,由于是微服务架构,需要同时启动多个服务,对电脑性能要求较高,需要完整运行的建议电脑内存至少达到16GB,有条件的也可以购买云服务器进行部署。另外仓库只包括后端项目,vue和小程序项目除了登录授权和接口路径变化基本没有改动,所以不放在仓库了。

2 技术选型

以下为主要技术框架工具

技术版本说明
SpringCloudHoxton.SR5微服务框架
SpringCloud Gateway2.2.3网关
SpringCloud OpenFeign2.2.3服务调用
SpringBoot2.3.0MVC框架
SpringCloud Security2.3.0安全框架
SpringCloud Oauth22.2.2认证授权框架
Mybatis3.4.6ORM框架
Mybatis Generator1.3.3代码生成工具
PageHelper5.1.8分页查询工具
Druid1.2.0数据库连接池
Lombok1.18.20对象封装工具
FastJson1.2.3json转换工具
JWT0.9.0访问令牌工具
Eureka2.2.3注册中心

3 系统架构

所有客户端请求先访问网关,由网关和认证服务统一处理认证授权后下发登录令牌token,客户端再携带token访问用户、订单等服务,每个服务都连接同一个数据库(目前没有分库),网关和其它服务均注册到Eureka,服务之间使用OpenFeign互相调用。

在这里插入图片描述

4 项目结构

Eureka服务端目前只用了8761,有需要以集群方式运行可以配置8861

在这里插入图片描述

5 运行步骤

  1. 新建数据库my_mall,导入doc/my_mall_cloud.sql文件,数据库账号密码需要配置到每个服务的application.yml

  2. 启动eureka8761

  3. 启动用户服务,因为网关和认证服务需要调用用户服务,所以先启动user

  4. 启动网关

  5. 启动认证服务

  6. 有需要可以启动剩下服务

  7. 打开postman,调用用户服务的login接口获取token

  8. 调用其它服务接口,在请求头设置Authorization=Bearer空格然后加上token

以下为postman调用示例

在这里插入图片描述

在这里插入图片描述

另外为了降低内存占用,可以在每个服务配置启动参数

在这里插入图片描述

在这里插入图片描述

-Xms128m -Xmx512m

参考IntelliJ IDEA开发多个微服务非常占用内存很卡_idea 跑微服务特卡_广铁小多多的博客-CSDN博客

6 数据库改动

和之前SpringBoot版本不同的地方主要包括

  • 登录日志和操作日志合并到sys_api_log,异常日志迁移到sys_error_log,另外增加了token、服务类型标识等字段

  • 用户角色关联改为ums_user_role_relation,因为前台用户也要处理角色权限

  • 角色ums_role添加value字段作为校验标志

  • 权限ums_permission不再关系到前端页面的菜单展示,而是只表示用户权限,因此删掉了一些字段,也添加value字段作为校验标志

  • 其它一些表去掉了冗余其他服务的字段,避免数据不一致

  • 一些表加上了updateTime代表更新时间

7 技术要点

简单封装增删改查

由于之前的SpringBoot版本开发的时候比较赶,controller和service层代码比较混乱,包括接口返回的格式也不够统一,因此本次微服务版本在mall-common模块进行了一些简单的封装,比如BaseDTOMapper,BaseService,BaseMapper

BaseDTOMapper:处理实体转换为dto,再返回给前端,而不是像之前直接返回实体

BaseMapper:封装常用的增删改查方法

BaseService:在BaseMapper基础上加入了before, after的业务处理,可以理解成对增删改操作的切面

针对查询操作,controller层向service层传递参数加入了ListParam这个类,方便处理条件过滤、分页、排序

针对接口返回和错误码把原本的ErrorCode, ErrorResponse改造成ApiCode,ApiResponse,ApiResponse提供了多种接口返回的方式,以及兼容OpenFeign调用返回的结果处理

单点登录

登录这里之前用的是SpringSecurity和JWT,但是在微服务项目中是不够的,因为每个服务都是独立的,如果只在用户服务登录了,把token拿去访问其它服务是会失败的,因此这时候需要使用单点登录去实现统一认证授权。

我是参考这位技术大佬的方案的

微服务权限终极解决方案,Spring Cloud Gateway + Oauth2 实现统一认证和鉴权! | mall学习教程

大致原理就是使用auth服务作为认证服务,对每个客户端进行身份认证,认证通过的颁发token,然后网关服务作为资源服务器,对客户端校验权限以及处理路由转发,可以把网关理解成防火墙,所有请求包括对auth服务的请求都是先经过网关再转发到各自服务。

不过我和大佬在权限校验这里做法有点不同,大佬是在AuthorizationManager处理权限校验,但是需要在数据库保存每个接口和权限的关联,而我觉得这种做法不易于维护,扩展性较差,因此采用了自定义注解的方式处理,下面会介绍到。

权限校验

主要用了RequireRoles和RequirePermissions两个注解定义每个接口需要的角色或权限,然后每个服务定义了AuthenticationAspect进行接口的前置通知,在这里进行拦截,比对token中的用户角色或权限以及接口定义的角色或权限,来判断是否拥有接口的访问权限,这部分的实现放在mall-common的BaseAuthenticationHandler。

另外角色和权限是首次运行用户服务就会初始化到数据库,可以看看用户服务的InitRunner,角色权限数据放在resources下面的rolepermission.json文件。

8 结语

虽然这个项目不会很复杂,但是在开发过程中也是学到了很多,包括运行起来各种报错踩坑,然后要一个一个排查解决,总的来说也是收获较多,接下来还会进一步丰富完善这个项目,作为微服务架构的一个动手实践。

如果这篇文章有帮助到你就点个赞吧~

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
图书管理系统是一个用于管理图书信息的系统,我们可以使用Spring、Spring MVC和MyBatis实现这个系统。 首先,我们可以使用Spring来创建图书管理系统的核心应用程序。Spring提供了依赖注入、AOP、事务管理等功能,可以帮助我们更好地组织和管理系统的各个模块。通过Spring的配置文件,我们可以配置系统中的Bean并定义它们之间的关系,使系统能够更好地进行扩展和维护。 其次,我们可以使用Spring MVC来实现系统的Web层。Spring MVC是一个基于MVC模式的Web框架,可以帮助我们更好地组织和管理用户请求与页面响应。通过Spring MVC,我们可以创建各种Controller来处理用户请求,并将用户的输入数据传递给后端的处理逻辑,最终将处理结果返回给用户。同时,Spring MVC还提供了各种特性,如数据绑定、表单验证、RESTful风格的URL等,能够帮助我们更好地构建用户友好的Web应用程序。 最后,我们可以使用MyBatis实现系统的数据持久层。MyBatis是一个持久层框架,可以帮助我们更好地管理数据库操作。通过MyBatis,我们可以使用XML或者注解的方式来定义数据库操作,同时也可以将数据库操作映射到Java对象,从而简化数据的处理和管理。使用MyBatis,我们可以更好地与数据库交互,提高系统的性能和可维护性。 综上所述,通过使用Spring、Spring MVC和MyBatis,我们可以更好地实现图书管理系统。这些框架提供了丰富的功能和特性,能够帮助我们更好地组织和管理系统的各个层面,从而实现一个高性能、易扩展、易维护的图书管理系统

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值