起因

有一天,苹果和西瓜说:“哎,市面咋没有好用的微服务商城呢?”

西瓜:“太难了呗,你看这个好像是微服务商城耶”

苹果:“这个只有后台代码,数据库都没”

西瓜:“这个呢”

苹果:“有数据库没前端”

西瓜:“这个呢”

苹果:“有前端,但是是pc的,我要移动端的”

西瓜:“这个呢”

苹果:“开不了店,不是b2b2c”

西瓜:“这个呢”

苹果:“太旧了,不维护了”

西瓜:“那我们自己写个吧“

准备

一个微服务商城应该有啥呢?

答:要拆分服务吧。

拆分之后用啥做服务注册发现呢?

答:spring cloud alibaba 吧,最近挺火的。

都拆开服务了,要分库吧?

答:分,必须分呀。

分完库要处理分布式事务吧?

答:用seata吧,比较简单。追求性能的时候,用mq实现最终一致性吧。

服务内部调用要用dubbo吧,听说性能挺高的?

答:是呀,不过用http协议会不会好点,毕竟听说dubbo对k8s的兼容不怎么好耶。用http协议,以后改造架构方便呀。

搜索呢?

答:要分词吧,用es

数据库要同步到es耶,用啥?

答:canal吧

那安全呢?登录权限呢?

答:安全用security,登录之类的自己手写吧,spring security的那套太复杂了。

金额呢?

答:用分啦

实施

做一个商城的第一步,统一异常处理

本来设想是dubbo的,后来发现dubbo和nacos的兼容性不太好,k8s也有很多dubbo不兼容的坑,决定去除dubbo

引入阿里的代码规范

springcloud2020刚release,迎难而上

几乎同时,nacos被爆安全问题,管理员不理不睬的态度,让人气愤

重新review了一遍安全相关的代码,内部请求封装也进行校验,吸取nacos的教训

seata踩坑

不管性能不性能的问题,rocketmq有事务消息,rabbitmq要自己写

完成

经历了多个框架的替换,多个踩坑,从众多不合理中寻求最合理的结果,每一行代码都是独立完成,都有提交记录,项目历经快一年,终于出来了!!!

一个基于Spring Cloud、Nacos、Seata、Mysql、Redis、RocketMQ、canal、ElasticSearch、minio的微服务B2B2C电商商城系统,采用主流的互联网技术架构、全新的UI设计、支持集群部署、服务注册和发现以及拥有完整的订单流程等,代码完全开源,没有任何二次封装,是一个非常适合二次开发的电商平台系统。

一个代码非常规范的微服务商城,使用阿里巴巴代码规范工具扫描,完全没有异常

目录结构规范

我们也有自己的目录结构

  • 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 Boot2.4MVC核心框架
Feign3.0服务调用
Nacos2.0服务注册与发现
Seata1.4分布式事务
Mybatis2.1持久层框架
hutool5.5JAVA工具集
pagehelper1.3Mybatis分页插件
Redis2.4分布式缓存
RocketMQ2.2消息队列
canal1.1数据库同步
Spring Cloud Gateway3.0网关
Spring Cloud LoadBalancer3.0负载均衡
ElasticSearch7.9数据搜索
minio8.0文件上传
Knife4j3.0MVC框架集成Swagger生成Api文档
Element UI2.13UI框架
vue、uni-appvue2.6JS框架

系统架构图

商城部署后 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.后台截图

  • 平台端

  • 商家端

2.uniapp截图

坑已经踩了一年,你不花5分钟了解下么

你的点赞鼓励,是我们前进的动力~

你的点赞鼓励,是我们前进的动力~

你的点赞鼓励,是我们前进的动力~

快来点个star吧

https://gitee.com/gz-yami/mal...


mall4j
26 声望0 粉丝