From 8539808347b2cccde2bb60adaafaf6dd4c7ce1e2 Mon Sep 17 00:00:00 2001
From: wayn <1669738430@qq.com>
Date: Sun, 13 Feb 2022 12:14:56 +0800
Subject: [PATCH] =?UTF-8?q?feat(=E5=95=86=E5=9F=8E):=20=E4=BB=A3=E7=A0=81?=
=?UTF-8?q?=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
com.wayn.monitor/pom.xml | 34 ------
docker-compose.yml | 25 ++++
nginx-conf/nginx.conf | 112 ++++++++++++++++++
pom.xml | 2 +-
readme.md | 53 +++++----
.../src/main/resources/application.yml | 12 +-
.../src/main/resources/application.yml | 2 +-
.../mobile/api/controller/HomeController.java | 5 -
.../src/main/resources/application.yml | 10 +-
waynboot-monitor/pom.xml | 57 +++++++++
.../java/com/wayn/MonitorApplication.java | 0
.../monitor/config/WebSecurityConfigurer.java | 0
.../src/main/resources/application.yml | 0
13 files changed, 235 insertions(+), 77 deletions(-)
delete mode 100644 com.wayn.monitor/pom.xml
create mode 100644 nginx-conf/nginx.conf
create mode 100644 waynboot-monitor/pom.xml
rename {com.wayn.monitor => waynboot-monitor}/src/main/java/com/wayn/MonitorApplication.java (100%)
rename {com.wayn.monitor => waynboot-monitor}/src/main/java/com/wayn/monitor/config/WebSecurityConfigurer.java (100%)
rename {com.wayn.monitor => waynboot-monitor}/src/main/resources/application.yml (100%)
diff --git a/com.wayn.monitor/pom.xml b/com.wayn.monitor/pom.xml
deleted file mode 100644
index 59cad2c..0000000
--- a/com.wayn.monitor/pom.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
- waynboot
- com.wayn
- 1.1.0
-
- 4.0.0
-
- com.wayn.monitor
-
-
- 11
- 11
-
-
-
-
- de.codecentric
- spring-boot-admin-starter-server
- ${spring-boot-admin.version}
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.boot
- spring-boot-starter-security
-
-
-
diff --git a/docker-compose.yml b/docker-compose.yml
index f767f44..403b65f 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -7,12 +7,16 @@ services:
- "82"
volumes:
- /etc/localtime:/etc/localtime
+ - /home/logs:/home/logs
+ - /opt/wayn/upload:/opt/wayn/upload
- ./jars/waynboot-mobile-api-1.1.0.jar:/home/app/waynboot-mobile-api-1.1.0.jar
restart: always
command: java -Xms500m -Xmx500m -Duser.timezone=GMT+8 -Dfile.encoding=utf-8 -jar /home/app/waynboot-mobile-api-1.1.0.jar
network_mode: "host"
environment:
- TZ=Asia/Shanghai
+ - LOG_PATH_PREFIX=/home/logs
+ - UPLOAD_DIR=/opt/wayn/upload
waynboot-admin-api:
image: adoptopenjdk:11-openj9
container_name: admin
@@ -20,12 +24,16 @@ services:
- "81"
volumes:
- /etc/localtime:/etc/localtime
+ - /home/logs:/home/logs
+ - /opt/wayn/upload:/opt/wayn/upload
- ./jars/waynboot-admin-api-1.1.0.jar:/home/app/waynboot-admin-api-1.1.0.jar
restart: always
command: java -Xms500m -Xmx500m -Duser.timezone=GMT+8 -Dfile.encoding=utf-8 -jar /home/app/waynboot-admin-api-1.1.0.jar
network_mode: "host"
environment:
- TZ=Asia/Shanghai
+ - LOG_PATH_PREFIX=/home/logs
+ - UPLOAD_DIR=/opt/wayn/upload
waynboot-message:
image: adoptopenjdk:11-openj9
container_name: message
@@ -33,9 +41,26 @@ services:
- "85"
volumes:
- /etc/localtime:/etc/localtime
+ - /home/logs:/home/logs
+ - /opt/wayn/upload:/opt/wayn/upload
- ./jars/waynboot-message-consumer-1.1.0.jar:/home/app/waynboot-message-consumer-1.1.0.jar
restart: always
command: java -Xms500m -Xmx500m -Duser.timezone=GMT+8 -Dfile.encoding=utf-8 -jar /home/app/waynboot-message-consumer-1.1.0.jar
network_mode: "host"
environment:
- TZ=Asia/Shanghai
+ - LOG_PATH_PREFIX=/home/logs
+ - UPLOAD_DIR=/opt/wayn/upload
+ waynboot-monitor:
+ image: adoptopenjdk:11-openj9
+ container_name: monitor
+ ports:
+ - "89"
+ volumes:
+ - /etc/localtime:/etc/localtime
+ - ./jars/waynboot-monitor-1.1.0.jar:/home/app/waynboot-monitor-1.1.0.jar
+ restart: always
+ command: java -Xms500m -Xmx500m -Duser.timezone=GMT+8 -Dfile.encoding=utf-8 -jar /home/app/waynboot-monitor-1.1.0.jar
+ network_mode: "host"
+ environment:
+ - TZ=Asia/Shanghai
diff --git a/nginx-conf/nginx.conf b/nginx-conf/nginx.conf
new file mode 100644
index 0000000..5ab7e41
--- /dev/null
+++ b/nginx-conf/nginx.conf
@@ -0,0 +1,112 @@
+# For more information on configuration, see:
+# * Official English Documentation: http://nginx.org/en/docs/
+# * Official Russian Documentation: http://nginx.org/ru/docs/
+
+user nginx;
+worker_processes auto;
+error_log /var/log/nginx/error.log;
+pid /run/nginx.pid;
+
+# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
+include /usr/share/nginx/modules/*.conf;
+
+events {
+ worker_connections 1024;
+}
+
+http {
+ log_format main '$remote_addr - $remote_user [$time_local] "$request" '
+ '$status $body_bytes_sent "$http_referer" '
+ '"$http_user_agent" "$http_x_forwarded_for"';
+
+ access_log /var/log/nginx/access.log main;
+
+ sendfile on;
+ tcp_nopush on;
+ tcp_nodelay on;
+ keepalive_timeout 65;
+ types_hash_max_size 4096;
+
+ include /etc/nginx/mime.types;
+ default_type application/octet-stream;
+
+ # Load modular configuration files from the /etc/nginx/conf.d directory.
+ # See http://nginx.org/en/docs/ngx_core_module.html#include
+ # for more information.
+ include /etc/nginx/conf.d/*.conf;
+
+ server {
+ listen 80;
+ listen [::]:80;
+ server_name _;
+ root /usr/share/nginx/html;
+
+ # Load configuration files for the default server block.
+ include /etc/nginx/default.d/*.conf;
+ location /mall {
+ alias /usr/share/nginx/html/mall/dist/;
+ index index.html index.htm;
+ }
+
+ location /admin {
+ alias /usr/share/nginx/html/admin/dist/;
+ index index.html index.htm;
+ }
+
+ location /mobile-api/ {
+ proxy_pass http://localhost:82/;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-NginX-Proxy true;
+ #enables WS support
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrad
+ }
+
+ location /admin-api/ {
+ #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
+ #root html;
+ #index index.html index.htm;
+ proxy_pass http://localhost:81/;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-NginX-Proxy true;
+ #enables WS support
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+
+ }
+
+ location /monitor {
+ proxy_pass http://localhost:89/;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-NginX-Proxy true;
+
+ }
+
+ location /upload {
+ proxy_pass http://localhost:81/upload;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-NginX-Proxy true;
+
+ }
+
+ error_page 404 /404.html;
+ location = /404.html {
+ }
+
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ }
+ }
+
+}
+
diff --git a/pom.xml b/pom.xml
index 0146c4c..2c3c23c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -16,7 +16,7 @@
waynboot-message-consumer
waynboot-message-core
waynboot-data
- com.wayn.monitor
+ waynboot-monitor
com.wayn
waynboot
diff --git a/readme.md b/readme.md
index c079947..080b1b9 100644
--- a/readme.md
+++ b/readme.md
@@ -11,45 +11,53 @@ waynboot-mall是一套全部开源的微商城项目,包含一个运营后台
## 技术特点
-1. 商城接口代码清晰、注释完善、模块拆分合理
-2. 使用Spring-Security进行访问权限控制
-3. 使用jwt进行接口授权验证
-4. ORM层使用Mybatis Plus提升开发效率
-5. 添加全局异常处理器,统一异常处理
-6. 添加https配置代码,支持https访问
-7. 集成七牛云存储配置,上传文件至七牛
-8. 集成常用邮箱配置,方便发送邮件
-9. 集成druid连接池,进行sql监控
-10. 集成swagger,管理接口文档
+11. 商城接口代码清晰、注释完善、模块拆分合理
+2. 使用Spring-Security进行访问权限控制
+3. 使用jwt进行接口授权验证
+4. ORM层使用Mybatis Plus提升开发效率
+5. 添加全局异常处理器,统一异常处理
+6. 使用springboot admin进行服务监控
+7. 集成七牛云存储配置,上传文件至七牛
+8. 集成常用邮箱配置,方便发送邮件
+9. 商城前台使用hikari连接池,提升性能,后台使用druid连接池,进行sql监控
+10. 使用knife4j增强swagger,管理接口文档
11. 添加策略模式使用示例,优化首页金刚区跳转逻辑
12. 拆分出通用的数据访问模块,统一redis & elastic配置与访问
13. 使用elasticsearch-rest-high-level-client客户端对elasticsearch进行操作
14. 支持商品数据同步elasticsearch操作以及elasticsearch商品搜索
15. RabbitMQ生产者发送消息采用异步confirm模式,消费者消费消息时需手动确认
16. 下单处理过程引入rabbitMQ,异步生成订单记录,提高系统下单处理能力
-17. 引入google jib加速和简化构建Docker应用镜像
-18. ...
+17. 引入google jib加速和简化构建Docker应用镜像
+18. ...
-## 难点整理
+## 问题整理
### 1. 库存扣减操作是在下单操作扣减还是在支付成功时扣减?(ps:扣减库存使用乐观锁机制 `where goods_num - num >= 0`)
1. 下单时扣减,这个方案属于实时扣减,当有大量下单请求时,由于订单数小于请求数,会发生下单失败,但是无法防止短时间大量恶意请求占用库存,
造成普通用户无法下单
2. 支付成功扣减,这个方案可以预防恶意请求占用库存,但是会存在多个请求同时下单后,在支付回调中扣减库存失败,导致订单还是下单失败并且还要退还订单金额(这种请求就是订单数超过了库存数,无法发货,影响用户体验)
3. 还是下单时扣减,但是对于未支付订单设置一个超时过期机制,比如下单时库存减一,生成订单后,对于未在15分钟内完成支付的订单,
自动取消超期未支付订单并将库存加一,该方案基本满足了大部分使用场景
-4. 针对大流量下单场景,比如一分钟内五十万次下单请求,可以通过设置虚拟库存的方式减少下单接口对数据库的访问。具体来说就是把商品实际库存保存到redis中,
+4. 针对大流量下单场景,比如一分钟内五十万次下单请求,可以通过设置虚拟库存的方式减少下单接口对数据库的访问。具体来说就是把商品库存缓存到redis中,
下单时配合lua脚本原子的get和decr商品库存数量(这一步就拦截了大部分请求),执行成功后在扣减实际库存
### 2. 首页商品展示接口利用多线程技术进行查询优化,将多个sql语句的排队查询变成异步查询,接口时长只跟查询时长最大的sql查询挂钩
```java
-// 1. 通过创建子线程继承Callable接口
-Callable> bannerCall = () -> iBannerService.list(new QueryWrapper().eq("status", 0).orderByAsc("sort"));
-// 2. 传入Callable的任务给FutureTask
-FutureTask> bannerTask = new FutureTask<>(bannerCall);
-// 3. 放入线程池执行
-threadPoolTaskExecutor.submit(bannerTask);
-// 4. 最后可以在外部通过FutureTask的get方法异步获取执行结果
-List list = bannerTask.get()
+# 使用CompletableFuture异步查询
+List> list = new ArrayList<>();
+CompletableFuture f1 = CompletableFuture.supplyAsync(() -> iBannerService.list(Wrappers.lambdaQuery(Banner.class).eq(Banner::getStatus, 0).orderByAsc(Banner::getSort)), homeThreadPoolTaskExecutor).thenAccept(data -> {
+ String key = "bannerList";
+ redisCache.setCacheMapValue(SHOP_HOME_INDEX_HASH, key, data);
+ success.add(key, data);
+});
+CompletableFuture f2 = CompletableFuture.supplyAsync(() -> iDiamondService.list(Wrappers.lambdaQuery(Diamond.class).orderByAsc(Diamond::getSort).last("limit 10")), homeThreadPoolTaskExecutor).thenAccept(data -> {
+ String key = "categoryList";
+ redisCache.setCacheMapValue(SHOP_HOME_INDEX_HASH, key, data);
+ success.add(key, data);
+});
+list.add(f1);
+list.add(f2);
+# 主线程等待子线程执行完毕
+CompletableFuture.allOf(list.toArray(new CompletableFuture[0])).join();
```
### 3. `ElasticSearch`搜索查询,查询包含搜索关键字并且是上架中的商品,在根据指定字段进行排序,最后分页返回
@@ -309,6 +317,7 @@ public void test(){
## 文件目录
```
+|-- waynboot-monitor // 监控模块
|-- waynboot-admin-api // 运营后台api模块,提供后台项目api接口
|-- waynboot-common // 通用模块,包含项目核心基础类
|-- waynboot-data // 数据模块,通用中间件数据访问
diff --git a/waynboot-admin-api/src/main/resources/application.yml b/waynboot-admin-api/src/main/resources/application.yml
index 5aeed1b..2c77192 100644
--- a/waynboot-admin-api/src/main/resources/application.yml
+++ b/waynboot-admin-api/src/main/resources/application.yml
@@ -14,7 +14,6 @@ spring:
servlet:
multipart:
enabled: true
- location: ${wayn.uploadDir}
file-size-threshold: 5MB
max-file-size: 200MB
max-request-size: 200MB
@@ -43,7 +42,7 @@ logging:
org.springframework: info
com.baomidou: info
file:
- name: E:/home/${spring.application.name}/info.log
+ name: ${LOG_PATH_PREFIX:E:/home}/${spring.application.name}/info.log
management:
endpoints:
@@ -74,10 +73,9 @@ wayn:
name: wayn
version: 1.1.0
email: 166738430@qq.com
- #uploadDir: /opt/wayn/upload # linux下文件上传目录
- uploadDir: D:/wayn/upload # windows下文件上传目录
- adminUrl: http://127.0.0.1:81
- mobileUrl: http://127.0.0.1:82
+ uploadDir: ${UPLOAD_DIR:D:/wayn/upload}
+ adminUrl: http://localhost:81
+ mobileUrl: http://localhost:82
ssh-proxy: # ssh端口代理设置,eg:通过ssh连接公网服务器,在通过端口转发访问内网服务器的服务
enabled: false # 是否启用
host: # 服务器host
@@ -88,8 +86,6 @@ wayn:
remoteHost: # 需要代理的服务host
remotePort: # 需要代理的服务port
-
-
#滑块验证码配置
aj:
captcha:
diff --git a/waynboot-message-consumer/src/main/resources/application.yml b/waynboot-message-consumer/src/main/resources/application.yml
index 7519b9d..ff7be9c 100644
--- a/waynboot-message-consumer/src/main/resources/application.yml
+++ b/waynboot-message-consumer/src/main/resources/application.yml
@@ -39,7 +39,7 @@ logging:
com.wayn: debug
org.springframework: info
file:
- name: E:/home/${spring.application.name}/info.log
+ name: ${LOG_PATH_PREFIX:E:/home}/${spring.application.name}/info.log
management:
endpoints:
diff --git a/waynboot-mobile-api/src/main/java/com/wayn/mobile/api/controller/HomeController.java b/waynboot-mobile-api/src/main/java/com/wayn/mobile/api/controller/HomeController.java
index ab9468f..177bf6e 100644
--- a/waynboot-mobile-api/src/main/java/com/wayn/mobile/api/controller/HomeController.java
+++ b/waynboot-mobile-api/src/main/java/com/wayn/mobile/api/controller/HomeController.java
@@ -23,11 +23,6 @@ public class HomeController extends BaseController {
return IHomeService.getHomeIndexDataCompletableFuture();
}
- @PostMapping("index1")
- public R index1() {
- return IHomeService.getHomeIndexDataCompletableFuture();
- }
-
@GetMapping("goodsList")
public R getGoodsList() {
Page page = getPage();
diff --git a/waynboot-mobile-api/src/main/resources/application.yml b/waynboot-mobile-api/src/main/resources/application.yml
index 0f4fc0c..d23efb4 100644
--- a/waynboot-mobile-api/src/main/resources/application.yml
+++ b/waynboot-mobile-api/src/main/resources/application.yml
@@ -22,7 +22,6 @@ spring:
servlet:
multipart:
enabled: true
- location: ${wayn.uploadDir}
file-size-threshold: 5MB
max-file-size: 200MB
max-request-size: 200MB
@@ -49,7 +48,7 @@ logging:
org.springframework: info
com.baomidou: info
file:
- name: E:/home/${spring.application.name}/info.log
+ name: ${LOG_PATH_PREFIX:E:/home}/${spring.application.name}/info.log
# mybatis plus 配置
mybatis-plus:
@@ -68,10 +67,9 @@ wayn:
name: wayn
version: 1.1.0
email: 166738430@qq.com
-# uploadDir: /opt/wayn/upload # linux下文件上传目录
- uploadDir: D:/wayn/upload # windows下文件上传目录
- adminUrl: http://127.0.0.1:81
- mobileUrl: http://127.0.0.1:82
+ uploadDir: ${UPLOAD_DIR:D:/wayn/upload}
+ adminUrl: http://localhost:81
+ mobileUrl: http://localhost:82
# wx支付配置
shop:
diff --git a/waynboot-monitor/pom.xml b/waynboot-monitor/pom.xml
new file mode 100644
index 0000000..32ecfe3
--- /dev/null
+++ b/waynboot-monitor/pom.xml
@@ -0,0 +1,57 @@
+
+
+
+ waynboot
+ com.wayn
+ 1.1.0
+
+ 4.0.0
+
+ waynboot-monitor
+
+
+ com.wayn.MonitorApplication
+
+
+
+
+ de.codecentric
+ spring-boot-admin-starter-server
+ ${spring-boot-admin.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ ${main-class}
+ ZIP
+
+
+
+
+
+
+
+ repackage
+
+
+
+
+
+
+
diff --git a/com.wayn.monitor/src/main/java/com/wayn/MonitorApplication.java b/waynboot-monitor/src/main/java/com/wayn/MonitorApplication.java
similarity index 100%
rename from com.wayn.monitor/src/main/java/com/wayn/MonitorApplication.java
rename to waynboot-monitor/src/main/java/com/wayn/MonitorApplication.java
diff --git a/com.wayn.monitor/src/main/java/com/wayn/monitor/config/WebSecurityConfigurer.java b/waynboot-monitor/src/main/java/com/wayn/monitor/config/WebSecurityConfigurer.java
similarity index 100%
rename from com.wayn.monitor/src/main/java/com/wayn/monitor/config/WebSecurityConfigurer.java
rename to waynboot-monitor/src/main/java/com/wayn/monitor/config/WebSecurityConfigurer.java
diff --git a/com.wayn.monitor/src/main/resources/application.yml b/waynboot-monitor/src/main/resources/application.yml
similarity index 100%
rename from com.wayn.monitor/src/main/resources/application.yml
rename to waynboot-monitor/src/main/resources/application.yml