一个springcloud微服务商城系统的诞生

起因 有一天,苹果和西瓜说:“哎,市面咋没有好用的微服务商城呢?”
西瓜:“太难了呗,你看这个好像是微服务商城耶”
苹果:“这个只有后台代码,数据库都没”
西瓜:“这个呢”
苹果:“有数据库没前端”
西瓜:“这个呢”
苹果:“有前端,但是是pc的,我要移动端的”
西瓜:“这个呢”
苹果:“开不了店,不是b2b2c”
西瓜:“这个呢”
苹果:“太旧了,不维护了”
西瓜:“那我们自己写个吧“
准备 一个微服务商城应该有啥呢?
答:要拆分服务吧。
拆分之后用啥做服务注册发现呢?
答:spring cloud alibaba 吧,最近挺火的。
都拆开服务了,要分库吧?
答:分,必须分呀。
分完库要处理分布式事务吧?
答:用seata吧,比较简单。追求性能的时候,用mq实现最终一致性吧。
服务内部调用要用dubbo吧,听说性能挺高的?
答:是呀,不过用http协议会不会好点,毕竟听说dubbo对k8s的兼容不怎么好耶。用http协议,以后改造架构方便呀。
搜索呢?
答:要分词吧,用es
数据库要同步到es耶,用啥?
答:canal吧
那安全呢?登录权限呢?
答:安全用security,登录之类的自己手写吧,spring security的那套太复杂了。
金额呢?
答:用分啦
实施 做一个商城的第一步,统一异常处理
一个springcloud微服务商城系统的诞生
文章图片

本来设想是dubbo的,后来发现dubbo和nacos的兼容性不太好,k8s也有很多dubbo不兼容的坑,决定去除dubbo
一个springcloud微服务商城系统的诞生
文章图片

引入阿里的代码规范
一个springcloud微服务商城系统的诞生
文章图片

springcloud2020刚release,迎难而上
一个springcloud微服务商城系统的诞生
文章图片

几乎同时,nacos被爆安全问题,管理员不理不睬的态度,让人气愤
一个springcloud微服务商城系统的诞生
文章图片

【一个springcloud微服务商城系统的诞生】重新review了一遍安全相关的代码,内部请求封装也进行校验,吸取nacos的教训
一个springcloud微服务商城系统的诞生
文章图片

seata踩坑
一个springcloud微服务商城系统的诞生
文章图片

不管性能不性能的问题,rocketmq有事务消息,rabbitmq要自己写
一个springcloud微服务商城系统的诞生
文章图片

完成 经历了多个框架的替换,多个踩坑,从众多不合理中寻求最合理的结果,每一行代码都是独立完成,都有提交记录,项目历经快一年,终于出来了!!!
一个基于Spring Cloud、Nacos、Seata、Mysql、Redis、RocketMQ、canal、ElasticSearch、minio的微服务B2B2C电商商城系统,采用主流的互联网技术架构、全新的UI设计、支持集群部署、服务注册和发现以及拥有完整的订单流程等,代码完全开源,没有任何二次封装,是一个非常适合二次开发的电商平台系统。
一个代码非常规范的微服务商城,使用阿里巴巴代码规范工具扫描,完全没有异常
一个springcloud微服务商城系统的诞生
文章图片

目录结构规范 我们也有自己的目录结构
一个springcloud微服务商城系统的诞生
文章图片

  • VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
  • DTO(Data Transfer Object):数据传输对象,前端像后台进行传输的对象,类似于param。
  • BO(Business Object):业务对象,内部业务对象,只在内部传递,不对外进行传递。
  • Model:模型层,此对象与数据库表结构一一对应,通过 Mapper 层向上传输数据源对象。
  • Controller:主要是对外部访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。为了简单起见,一些与事务无关的代码也在这里编写。
  • FeignClient:由于微服务之间存在互相调用,这里是内部请求的接口。
  • Controller:主要是对内部访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。为了简单起见,一些与事务无关的代码也在这里编写。
  • Service 层:相对具体的业务逻辑服务层。
  • Manager 层:通用业务处理层,它有如下特征:
    • 1) 对第三方平台封装的层,预处理返回结果及转化异常信息,适配上层接口。
    • 2) 对 Service 层通用能力的下沉,如缓存方案、中间件通用处理。
    • 3) 与 DAO 层交互,对多个 DAO 的组合复用。
  • Mapper持久层:数据访问层,与底层 MySQL进行数据交互。
  • Task层:由于每个服务之间会存在定时任务,比如定时确认收货,定时将活动失效等情况,这里面的Task实际上连接的是xxl-job(具体可以查看 https://github.com/xuxueli/xx... )进行任务调度。
  • Listener:监听 RocketMQ 进行处理,有时候会监听easyexcel相关数据。
关于FeignClient,由于微服务之间存在互相调用,Feign 是http协议,理论上是为了解耦,而实际上提供方接口进行修改,调用方却没有进行修改的时候,会造成异常,所以我们抽取出来。还有就是对内暴露的接口,是很多地方都公用的,所以我们还将接口抽取了出了一个模块,方便引用。可以看到mall4cloud-api这个模块下是所有对内feign接口的信息。
技术选型
技术 版本 说明
Spring Boot 2.4 MVC核心框架
Feign 3.0 服务调用
Nacos 2.0 服务注册与发现
Seata 1.4 分布式事务
Mybatis 2.1 持久层框架
hutool 5.5 JAVA工具集
pagehelper 1.3 Mybatis分页插件
Redis 2.4 分布式缓存
RocketMQ 2.2 消息队列
canal 1.1 数据库同步
Spring Cloud Gateway 3.0 网关
Spring Cloud LoadBalancer 3.0 负载均衡
ElasticSearch 7.9 数据搜索
minio 8.0 文件上传
Knife4j 3.0 MVC框架集成Swagger生成Api文档
Element UI 2.13 UI框架
vue、uni-app vue2.6 JS框架
系统架构图 一个springcloud微服务商城系统的诞生
文章图片

商城部署后 API 地址
服务 地址
mall4cloud-gatway 网关服务 http://127.0.0.1:9000
mall4cloud-auth 授权校验服务 http://127.0.0.1:9101
mall4cloud-biz 业务代码服务(如图片上传/短信等) http://127.0.0.1:9000
mall4cloud-leaf 基于美团leaf的生成id服务 http://127.0.0.1:9100
mall4cloud-multishop 商家服务 http://127.0.0.1:9103
mall4cloud-order 订单服务 http://127.0.0.1:9106
mall4cloud-payment 支付服务 http://127.0.0.1:9113
mall4cloud-product 商品服务 http://127.0.0.1:9112
mall4cloud-rbac 用户角色服务 http://127.0.0.1:9102
mall4cloud-search 搜索服务 http://127.0.0.1:9108
mall4cloud-user 用户服务 http://127.0.0.1:9105
代码运行相关截图 1.后台截图
  • 平台端
    一个springcloud微服务商城系统的诞生
    文章图片

  • 商家端
    一个springcloud微服务商城系统的诞生
    文章图片

    一个springcloud微服务商城系统的诞生
    文章图片

2.uniapp截图
一个springcloud微服务商城系统的诞生
文章图片

一个springcloud微服务商城系统的诞生
文章图片

坑已经踩了一年,你不花5分钟了解下么 你的点赞鼓励,是我们前进的动力~ 你的点赞鼓励,是我们前进的动力~ 你的点赞鼓励,是我们前进的动力~ 快来点个star吧 https://gitee.com/gz-yami/mal...

    推荐阅读