From 3f3d58622efdc7cfbc5acd50f7fc9e6304fe958e Mon Sep 17 00:00:00 2001 From: wayn <1669738430@qq.com> Date: Mon, 2 Aug 2021 23:59:32 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E5=95=86=E5=9F=8E):=20=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=AE=9D=E6=94=AF=E4=BB=98=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 +-- readme.md | 106 ++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 93 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index 703543d..87a7caf 100644 --- a/pom.xml +++ b/pom.xml @@ -31,8 +31,8 @@ wayn111 adoptopenjdk:11-jre-openj9 - 1669738430@qq.com - he201011 + 填写你的阿里云账号 + 填写你的密码,site:https://cr.console.aliyun.com/cn-shanghai/instance/credentials ${java.version} ${java.version} diff --git a/readme.md b/readme.md index 4629ef8..d938b53 100644 --- a/readme.md +++ b/readme.md @@ -9,7 +9,7 @@ waynboot-mall是一套全部开源的微商城项目,包含一个运营后台 [运营后台项目](https://github.com/wayn111/waynboot-admin) [h5商城项目](https://github.com/wayn111/waynboot-mobile) -## waynboot-mall接口项目 +## 技术特点 1. 商城接口代码清晰、注释完善、模块拆分合理 2. 使用Spring-Security进行访问权限控制 @@ -27,9 +27,10 @@ waynboot-mall是一套全部开源的微商城项目,包含一个运营后台 14. 支持商品数据同步elasticsearch操作以及elasticsearch商品搜索 15. RabbitMQ生产者发送消息采用异步confirm模式,消费者消费消息时需手动确认 16. 下单处理过程引入rabbitMQ,异步生成订单记录,提高系统下单处理能力 -17. ... - -## 商城技术特点 +17. 引入google jib加速和简化构建Docker应用镜像 +18. ... + +## 难点整理 ### 1. 库存扣减操作是在下单操作扣减还是在支付成功时扣减?(ps:扣减库存使用乐观锁机制 `where goods_num - num >= 0`) 1. 下单时扣减,这个方案属于实时扣减,当有大量下单请求时,由于订单数小于请求数,会发生下单失败,但是无法防止短时间大量恶意请求占用库存, 造成普通用户无法下单 @@ -40,14 +41,14 @@ waynboot-mall是一套全部开源的微商城项目,包含一个运营后台 下单时配合lua脚本原子的get和decr商品库存数量(这一步就拦截了大部分请求),执行成功后在扣减实际库存 ### 2. 首页商品展示接口利用多线程技术进行查询优化,将多个sql语句的排队查询变成异步查询,接口时长只跟查询时长最大的sql查询挂钩 -``` -# 1. 通过创建子线程继承Callable接口 +```java +// 1. 通过创建子线程继承Callable接口 Callable> bannerCall = () -> iBannerService.list(new QueryWrapper().eq("status", 0).orderByAsc("sort")); -# 2. 传入Callable的任务给FutureTask +// 2. 传入Callable的任务给FutureTask FutureTask> bannerTask = new FutureTask<>(bannerCall); -# 3. 放入线程池执行 +// 3. 放入线程池执行 threadPoolTaskExecutor.submit(bannerTask); -# 4. 最后可以在外部通过FutureTask的get方法异步获取执行结果 +// 4. 最后可以在外部通过FutureTask的get方法异步获取执行结果 List list = bannerTask.get() ``` @@ -145,15 +146,37 @@ private static String encryptUserId(String userId, int num) { ### 6. 金刚区跳转使用策略模式 ```java -# 1. 定义金刚位跳转策略接口 +# 1. 定义金刚位跳转策略接口以及跳转枚举类 public interface DiamondJumpType { List getGoods(Page page, Diamond diamond); Integer getType(); } +// 金刚位跳转类型枚举 +public enum JumpTypeEnum { + COLUMN(0), + CATEGORY(1); + + private Integer type; + + JumpTypeEnum(Integer type) { + this.type = type; + } + + public Integer getType() { + return type; + } + + public JumpTypeEnum setType(Integer type) { + this.type = type; + return this; + } +} # 2. 定义策略实现类,并使用@Component注解注入spring + +// 分类策略实现 @Component public class CategoryStrategy implements DiamondJumpType { @@ -171,6 +194,8 @@ public class CategoryStrategy implements DiamondJumpType { return JumpTypeEnum.CATEGORY.getType(); } } + +// 栏目策略实现 @Component public class ColumnStrategy implements DiamondJumpType { @@ -217,22 +242,73 @@ public class DiamondJumpContext { } } -# 4.使用 +# 4.使用,注入DiamondJumpContext对象,调用getInstance方法传入枚举类型 @Autowired private DiamondJumpContext diamondJumpContext; @Test public void test(){ - DiamondJumpType diamondJumpType = diamondJumpContext.getInstance(1); + DiamondJumpType diamondJumpType = diamondJumpContext.getInstance(JumpTypeEnum.COLUMN.getType()); } ``` -### 7. google jib docker镜像部署 +### 7. google jib加速和简化docker镜像构建 + +```xml + + + com.google.cloud.tools + jib-maven-plugin + 3.0.0 + + + + adoptopenjdk:11-jre-openj9 + + + + registry.cn-shanghai.aliyuncs.com/${aliyun-docker-namespace}/${project.artifactId} + + + + ${project.version} + + + + 填写你的阿里云账号 + 填写你的密码 site:https://cr.console.aliyun.com/cn-shanghai/instance/credentials + + + + + 填写项目启动类路劲 eg:com.wayn.AdminApplication + + -Xms812m + -Xmx812m + -Xss512k + -XX:+HeapDumpOnOutOfMemoryError + -XX:HeapDumpPath=./ + + + + + + + + package + + build + + + + + +``` - todo ## 文件目录 -```java +``` |-- waynboot-admin-api // 运营后台api模块,提供后台项目api接口 |-- waynboot-common // 通用模块,包含项目核心基础类 |-- waynboot-data // 数据模块,通用中间件数据访问 @@ -245,7 +321,7 @@ public void test(){ |-- pom.xml // maven父项目依赖,定义子项目依赖版本 |-- ... ``` - + ## 开发部署 ``` # 1. 克隆项目