起因
有一天,苹果和西瓜说:“哎,市面咋没有好用的微服务商城呢?”
西瓜:“太难了呗,你看这个好像是微服务商城耶”
苹果:“这个只有后台代码,数据库都没”
西瓜:“这个呢”
苹果:“有数据库没前端”
西瓜:“这个呢”
苹果:“有前端,但是是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.后台截图
平台端
商家端
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。