乐趣区

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

起因

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

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

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

西瓜:“这个呢”

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

西瓜:“这个呢”

苹果:“有前端,然而是 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 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 框架

零碎架构图

商城部署后 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…

退出移动版