共计 2861 个字符,预计需要花费 8 分钟才能阅读完成。
起因
有一天,苹果和西瓜说:“哎,市面咋没有好用的微服务商城呢?”
西瓜:“太难了呗,你看这个如同是微服务商城耶”
苹果:“这个只有后盾代码,数据库都没”
西瓜:“这个呢”
苹果:“有数据库没前端”
西瓜:“这个呢”
苹果:“有前端,然而是 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. 后盾截图
平台端
商家端