> mall4j-bbc:j代表java,java项目,这里面包含了小程序/uniapp/pc/后台vue连接需要的接口。 ## 1.开发环境(要在开发环境打包完成才能放到生产环境,所以开发环境要搭建起来) 以下版本是最低要求的!!! 提问问题前请注意生产环境!!请安装好对应的依赖。 | 工具 | 版本 | | ------ |-------| | jdk | 17 | | mysql | 8.0 | | redis | 5.0+ | | ElasticSearch| 7.xx | | xxl-job| 3.0.0 | ## 2.导入数据库到正式环境 #### 2.1.1 导入数据库之前,先要修改数据库配置 修改配置文件my.cnf ```cnf [mysqld] # 默认使用“mysql_native_password”插件认证 # 如果使用的是mysql 8.0 需要设置 mysql_native_password,不然有些工具连不上 default_authentication_plugin=mysql_native_password # 关闭 only_full_group_by sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION ``` 修改完毕之后,重启mysql服务。 #### 2.2.2 导入数据库(用docker部署,docker启动时会自动初始化,不需要导入) 启动idea,右上角选择open,找到mall4j-bbc的文件夹 ![idea open](../img/开发环境搭建/idea open.png) 在项目中会有一个 `db` 文件夹 如图所示: ![db文件夹](../img/开发环境搭建/db文件夹.png) 里面会有很多的数据库文件,按照0、1、2、3的顺序将`0schema.sql`、`1yami_bbc.sql`、`2area.sql`、`3xxl_job.sql` 导入mysql中。 > 问:那其他的数据库文件是干嘛的? 答:是更新过了某个时间更新代码时,更新的sql补丁,总数据都在上面四个文件中,所以初始化的时候,只要将四个文件按顺序导入数据库即可。 ### 3. 配置环境信息准备开始打包 > 对于无法找到文件的用户,推荐使用idea快捷键 ctrl + shift + n 进行文件搜索 1. 分别修改`yami-shop-multishop`、`yami-shop-platform`、`yami-shop-api` 下的 `\src\main\resources\application-prod.yml` 更改为生产环境的数据库账号密码,端口号等(如果是 `docker` 环境请修改对应的`application-docker.yml`环境配置文件) 2. 分别修改`yami-shop-multishop`、`yami-shop-platform`、`yami-shop-api` 修改`yami-shop-admin\src\main\resources\logback-prod.xml` 修改里面的`PROJECT_PATH` 将`/opt/projects/yami-b2b2c` 改为自己生产环境的项目路径(如果是 `docker` 环境请修改对应的`logback-docker.yml`环境配置文件) 3. 根据需要,修改`yami-shop-multishop`、`yami-shop-platform`、`yami-shop-api` 下的`\src\main\resources\application-prod.yml`线程数量(如果是 `docker` 环境请修改对应的`application-docker.yml`环境配置文件) > 值得注意的是:docker环境是优先读取环境变量的,在`docker-compose` 文件 ```yml environment: - MYSQL_HOST=mall4j-mysql - MYSQL_PORT=3306 - MYSQL_DATABASE=yami_bbc - MYSQL_USERNAME=root - MYSQL_PASSWORD=hn02le.34lkdLKD - REDIS_HOST=mall4j-redis - REDIS_PORT=6379 - REDIS_DATABASE=1 - REDIS_PASSWORD=hn02le.34lkdLKD - DATACENTER_ID=21 - ELASTIC_ADDRESS=http://mall4j-elasticsearch:9200 - ELASTIC_USERNAME=elastic - ELASTIC_PASSWORD=hn02le.34lkdLKD - WUKONGIM_ADDRESS=http://mall4j-wukongim:5001 - WUKONGIM_TOKEN=hn02le.34lkdLKD - SMS_SUPPLIER=alibaba # 默认阿里云 - SMS_ACCESS_KEY_ID=必填短信服务accessKeyId - SMS_ACCESS_KEY_SECRET=必填短信accessKeySecret - SMS_SIGNATURE=必填短信服务signatureId ``` 修改好环境信息之后才可以进行打包!!! ### 4.使用idea对项目进行打包 使用maven进行项目构建可以使用maven build相关命令,也可以直接在idea右侧 单击maven,点击clean,再点击package ![maven build](../img/生产环境/maven build.png) 1. 修改完毕后打包,使用`mvn clean package -DskipTests` 命令进行打包,最终会生成很多的jar,我们需要其中三个。 - 商城后台商家端接口 `yami-shop-multishop\target\yami-shop-multishop-0.0.1-SNAPSHOT.jar` - 商城后台平台端接口 `yami-shop-platform\target\yami-shop-platform-0.0.1-SNAPSHOT.jar` - 商城前端接口`yami-shop-api\target\yami-shop-api-0.0.1-SNAPSHOT.jar` 2. 将三个jar上传到生产环境的服务器中 ### 5. 启动 #### 5.1不使用docker进行部署 > 强烈建议使用docker进行部署,因为docker可以将jdk进行隔离,而且docker里面的jdk已经在dockerfile写好了,如果不使用docker,而是自己找的jdk,会有各种各样的问题 > 如果步骤” 配置环境信息准备开始打包“ 中修改了`PROJECT_PATH` 那么对应的路径也要跟着修改 1. 创建存放项目jar的文件夹和日志文件的文件夹 ```bash mkdir -p /opt/projects/yami-b2b2c/log ``` 2. 将3个jar上传至 `/opt/projects/yami-b2b2c` 目录中 3. 启动jar ```bash # 启动api,1g内存,可以根据服务器内存调整大小,推荐最低1G java -jar -Xmx1024m -Xss256k -Dspring.profiles.active=prod /opt/projects/yami-b2b2c/yami-shop-api-0.0.1-SNAPSHOT.jar > "/opt/projects/yami-b2b2c/log/api-console.log" & # 启动商家端,512M内存,可以根据服务器内存调整大小,推荐最低512M java -jar -Xmx512m -Xss256k -Dspring.profiles.active=prod /opt/projects/yami-b2b2c/yami-shop-multishop-0.0.1-SNAPSHOT.jar > "/opt/projects/yami-b2b2c/log/multishop-console.log" & # 启动平台端服务,512M内存,可以根据服务器内存调整大小,推荐最低512M java -jar -Xmx512m -Xss256k -Dspring.profiles.active=prod /opt/projects/yami-b2b2c/yami-shop-platform-0.0.1-SNAPSHOT.jar > "/opt/projects/yami-b2b2c/log/platform-console.log" & ``` 不使用docker部署,需要将`xxl-job`也打包上传到服务器,同时启动 #### 5.2使用docker进行部署 > 在本文件所在的目录下有个`yami-shop` 文件夹,压缩,上传到linux,解压 1. 如果数据库没有初始化,在`mall4j-bbc`项目的`db` 文件夹里面会有很多的数据库文件,将`0schema.sql`、`1yami_bbc.sql`、`2area.sql`、`3xxl_job.sql` 上传到`/mysql/initdb`文件夹中。 2. 根据需要修改my.cnf,如果是新项目,可以不用修改 3. 将打包好3个jar包,分别放到`/yami-shop/yami-shop-api`,`/yami-shop/yami-shop-multishop`,`/yami-shop/yami-shop-platform`文件夹,(dockerfile一般不需要改动,除非你有特别需求),等待`docker-compose` 启动 ### 6. nginx配置 nginx配置可以参考 本文件所在的目录下有个`yami-shop/nginx/conf.d` 文件夹,有3个配置文件,内有详细的配置文件 ,可以参考: [b2b2c-api.conf](../linux环境(生产环境搭建)/mall4j-shop/nginx/conf.d/b2b2c-api.conf) [b2b2c-multishop.conf](../linux环境(生产环境搭建)/mall4j-shop/nginx/conf.d/b2b2c-multishop.conf) [b2b2c-platform.conf](../linux环境(生产环境搭建)/mall4j-shop/nginx/conf.d/b2b2c-platform.conf) ### 7. xxl-job 下载xxl-job github下载地址:`https://github.com/xuxueli/xxl-job/releases/tag/3.0.0` gitee下载地址:`https://gitee.com/xuxueli0323/xxl-job` 用idea打开项目,修改`xxl-job-admin` 模块下的`properties` 连接数据库,数据库的默认配置已经在商城的java项目的`db文件夹`下`3xxl_job.sql` 这里有初始化的信息了,记得导入 ### 8. WuKongIm 参考文档配置机器人[安装WuKongIm](../linux环境(生产环境搭建)/安装WuKongIm.md) ### 9. redis容器 和 aof-redis容器的区别 redis: 商城数据、登录(token)缓存,该redis中的数据可以随时删除。 aof-redis: 持久化redis,存储商品sku库存、订单锁定记录、退款、秒杀等数据,数据不可删除,用于提高订单性能。 这里建议用两个redis: 1. 持久化的aof,需要参考这个 `linux环境(生产环境搭建)/mall4j-shop/redis/redis.conf` 里面的 `appendfsync always`,否则aof redis是无意义的。 2. 只做缓存的普通redis是不需要开启这个的,而且最好不要开启,毕竟会影响性能。做库存需要持久化的需要开启这个。也就是说普通的redis只要用默认的配置就行。 3. 如果真的用不了两个redis,一定要用同一个redis,那么这个redis要开启aof,并且分开redis的数据库,比如一个放在0,一个放在10(为什么不用1,因为怕不记得0和1了),并且千万不要删掉这里的数据。 4. 持久化的库存如论如何都有可能认为失误,或者极小概率会丢失,可以通过定时任务找回来。因为数据库存了出入库记录,通过出入库记录可以找回来。不过如果你们代码修改多了,不确定会不会影响定时任务,所以做aof是非常有必要的。 5. 为什么要用将库存放在redis当中,因为下单的时候,提交订单会涉及很多表操作,会变成一个大事务,而库存是行锁,严重的时候对同一个商品(不是下单,同时购买同一个商品)可能每秒只能十几的并发,所以放在redis是有必要的。 #### 订单号 如果测试环境、开发环境、生产环境用的都是同一套支付系统,那么会面临一个问题: 测试环境中的支付单号1,会与生产环境中的支付单号1重复。所以需要在不同的环境增加一个需要,比如加多个序号测试环境的1会变成11,开发环境的1会变成21 需要在`application.yml` 修改这个配置,请配置10-99。请手动在不同的环境加上不同的id ```yaml application: workerId: 21 ``` ### 关于跨域 关于跨域,目前已经在java后台实现了跨域的配置,修改`CorsConfig` 将里面`*`的域名改为自己需要的域名即可。 #### 异常通知 如果希望系统报错的时候能够及时查到通知,而不是自己慢慢查询日志。可以配置异常通知的邮箱。 可以参考:https://jingyan.baidu.com/article/fedf0737af2b4035ac8977ea.html 获取授权码 ```yaml spring: mail: # 企微邮箱为:smtp.exmail.qq.com,qq邮箱为:smtp.qq.com,163邮箱为:smtp.163.com,其他的请自行查找相关资料 host: smtp.exmail.qq.com # 进行发送通知的邮箱账户名 username: # 进行发送通知的邮箱密码,这个不是密码,而是自己邮箱-账户-开启POP3/SMTP时的客户端授权码 password: logging: # 接受异常通知的邮箱,可以配置多个用逗号隔开 log-error-email: # 当前环境,比如测试环境,生产环境 log-env: ```