开源电商平台mall部署填坑
为什么要部署mall
学院宝藏课程中的服务端性能测试章节里电商系统的压测实战
中介绍了一款开源电商系统mall用于压测实战练手,之前直播的时候学院已经部署好了mall供练手使用,但目前学院部署mall的地址已经无法访问而且压测会对服务器产生一定影响,为了不影响他人我们也最好不要在公共服务器上压测练手项目。如果有练习压测的需求就可以自己部署一下mall。
由于mall采用了目前非常流行的架构,对我们来说除了可以用于接口/压测实战练习外,还可以把在学院学到的很多知识都实战一遍,个人认为是一个非常好的实战载体; 部署过程可能涉及到的知识点包括:
- Linux命令与shell脚本
- Docker
- Jenkins
- 持续集成相关知识
- 持续交付相关知识
mall的官方文档虽然和详尽,但是更新不及时,源码有些更改并没有体现在文档中,所以完全按照官方文档来进行部署是无法成功的。需要修改一些配置,下面就来介绍一下Linux下使用Docker的部署过程以及需要填的坑。
如何部署mall
mall功能很详尽主要模块有三个,分别为:
- mall-admin:后台管理
- mall-portal:前台管理
- mall-search:搜索
课程中使用的是mall-portal,所以我们以mall-portal举例
准备工作
首先需要下载mall源码;Github下载缓慢的话可以到Gitee下载
下载后使用idea打开源码,可以在/mall-master/document/mql/
路径下找到mall.sql
,这个是数据库文件,需要上传到linux服务器上(文中的目录为/mydata/)
mall依赖Docker镜像有9个,其中8个需要进行部署配置。Docker的安装我就不罗列了。需要注意的是本文中所有docker命令涉及到的挂载目录都需要操作权限,建立相应路径后记得chmod -R 777
一下
MySQL安装与配置
下载
- 使用如下命令启动MySQL服务(参数具体含义就不解释了,有疑问的话可以回顾一下Docker部分的课程或者留言):
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
- 将mall.sql文件拷贝到mysql容器的/目录下:
docker cp /mydata/mall.sql mysql:/
- 进入运行MySQL的docker容器:
docker exec -it mysql /bin/bash
- 使用MySQL命令打开客户端:
mysql -uroot -proot --default-character-set=utf8
- 创建mall数据库:
create database mall character set utf8;
- 选择mall数据库
use mall;
- 导入mall.sql数据
source /mall.sql;
- 创建一个reader:123456帐号并修改权限,使得任何ip都能访问:
grant all privileges on *.* to 'reader' @'%' identified by '123456';
至此mysql配置完成,可以使用mysql workbench连接数据库查看库与表是否正常创建
Redis安装
- 启动Redis服务:
docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
-d redis:5 redis-server --appendonly yes
- 进入Redis容器:
docker exec -it redis redis-cli
- 使用redis-cli命令进行连接
set a 100
get a
Nginx安装
- 先运行一次容器(为了拷贝配置文件):
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-d nginx:1.10
- 将容器内的配置文件拷贝到指定目录:
docker container cp nginx:/etc/nginx /mydata/nginx/
- 修改文件名称:
cd /mydata/nginx
mv nginx conf
- 删除容器:
docker rm -f nginx
- 使用如下命令重新启动Nginx服务:
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10
RabbitMQ安装
- 使用如下命令启动RabbitMQ服务:
docker run -p 5672:5672 -p 15672:15672 --name rabbitmq \
-d rabbitmq:3.7.15
- 进入容器:
docker exec -it rabbitmq /bin/bash
- 开启管理功能:
rabbitmq-plugins enable rabbitmq_management
- 退出容器并开启防火墙(如提示没有找到
firewall-cmd
命令可以按照提示进行下载,也可以尝试跳过防火墙设置,但我没有尝试跳过):
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload
- 访问地址查看是否安装成功:http://服务器地址:15672
- 输入账号密码并登录:guest guest
- 创建帐号并设置其角色为管理员:mall mall
- 创建一个新的虚拟host为:/mall
- 点击mall用户进入用户配置页面
- 给mall用户配置该虚拟host的权限
Elasticsearch安装
- 修改虚拟内存区域大小,否则会因为过小而无法启动:
sysctl -w vm.max_map_count=262144
- 使用如下命令启动Elasticsearch服务:
docker run -p 9200:9200 -p 9300:9300 --name elasticsearch \
-e "discovery.type=single-node" \
-e "cluster.name=elasticsearch" \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-d elasticsearch:7.6.2
- 安装中文分词器IKAnalyzer,并重新启动:
# 进入容器内
docker exec -it elasticsearch /bin/bash
# 此命令需要在容器中运行
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip docker restart elasticsearch
- 开启防火墙
firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --reload
- 验证
curl http://服务器地址:9200
- 返回类似如下信息证明配置成功
StatusCode : 200
StatusDescription : OK
Content : {
"name" : "1eec4f03eca0",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "RH-bShWzQ-Wa1U-7vZfzWQ",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" :...
RawContent : HTTP/1.1 200 OK
Content-Length: 540
Content-Type: application/json; charset=UTF-8
{
"name" : "1eec4f03eca0",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "RH-bShWzQ-Wa1U-7vZfzWQ",
"...
Forms : {}
Headers : {[Content-Length, 540], [Content-Type, application/json; charset=UTF-8]}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 540
Logstash安装(非必要)
- 修改Logstash的配置文件logstash.conf中output节点下的Elasticsearch连接地址为es:9200,配置文件地址:
logstash.conf位于/mall-master/document/elk/logstash.conf
output {
elasticsearch {
hosts => "es:9200"
index => "mall-%{type}-%{+YYYY.MM.dd}"
}
}
- 创建/mydata/logstash目录,并将Logstash的配置文件logstash.conf拷贝到该目录;
- 使用如下命令启动Logstash服务;
docker run --name logstash -p 4560:4560 -p 4561:4561 -p 4562:4562 -p 4563:4563 \
--link elasticsearch:es \
-v /mydata/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
-d logstash:7.6.2
- 进入容器内部,安装json_lines插件
# 进入容器内部
docker exec -it logstash
# 安装json_lines插件
logstash-plugin install logstash-codec-json_lines
Kibana安装
- 使用如下命令启动Kibana服务:
docker run --name kibana -p 5601:5601 \
--link elasticsearch:es \
-e "elasticsearch.hosts=http://es:9200" \
-d kibana:7.6.2
- 开启防火墙:
firewall-cmd --zone=public --add-port=5601/tcp --permanent
firewall-cmd --reload
- 访问地址进行测试:http://服务器地址:5601
MongoDB安装
- 使用docker命令启动:
docker run -p 27017:27017 --name mongo \
-v /mydata/mongo/db:/data/db \
-d mongo:4.2.5
至此所有依赖环境部署完成
SpringBoot应用部署
mall配置
部署mall过程中主要填坑部分在此,需要修改一些配置信息以匹配之前部署的docker容器
- 首先在
mall-master
目录中找到pom.xml文件,注释图中部分
此时ide源码目录中可能没有下图圈起部分的文件
不用管它,在ide右侧打开Maven进入mall/Lifecycle
双击package
进行编译.第一次编译需要下载依赖环境所以时间可能比较长,直到控制台显示BUILD SUCCESS字样后进行下一步操作. - 在
mall-master/mall-portal/src/main/resources/
文件夹中有两个yml配置文件,我们需要更改里面的环境连接host参数;原文件中涉及host的值为localhost,不修改会导致docker容器因找不到localhost容器而报错导致服务无法启动.所以我们需要进行如下改动
server: port: 8085
spring:
datasource:
url: jdbc:mysql://db:3306/mall?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
druid:
initial-size: 5 #连接池初始化大小
min-idle: 10 #最小空闲连接数
max-active: 20 #最大连接数
web-stat-filter:
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" #不统计这些请求数据
stat-view-servlet: #访问监控网页的登录用户名和密码
login-username: druid
login-password: druid
data:
mongodb:
host: mongo
port: 27017
database: mall-port
redis:
host: redis # Redis服务器地址
database: 0 # Redis数据库索引(默认为0)
port: 6379 # Redis服务器连接端口
password: # Redis服务器连接密码(默认为空)
timeout: 300ms # 连接超时时间(毫秒)
rabbitmq:
host: rabbit
port: 5672
virtual-host: /mall
username: mall
password: mall
logging:
level:
root: info
com.macro.mall: debug
logstash:
host: logstash
- 修改完成后,再次使用Maven编译
- 编译后可以在
mall-master/mall-portal/target
中找到mall-portal-1.0-SNAPSHOT.jar
文件,将此文件上传到服务器中 - 接下来可以在
mall-master/document/sh
目录下找到Dockerfile文件,打开并修改如下(具体含义可以回顾docker相关课程):
# 该镜像需要依赖的基础镜像
FROM java:8
# 将当前目录下的jar包复制到docker容器的/目录下
ADD mall-portal-1.0-SNAPSHOT.jar /mall-portal-1.0-SNAPSHOT.jar
# 声明服务运行在8085端口
EXPOSE 8085
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java", "-jar","/mall-portal-1.0-SNAPSHOT.jar"]
# 指定维护者的名字
MAINTAINER Captain
- 修改完成后将Dockerfile上传至服务器与
mall-portal-1.0-SNAPSHOT.jar
文件同路径下 - 使用如下命令创建docker镜像
docker build -t mall/mall-portal .
部署mall
- 启动mall-portal
docker run -p 8085:8085 --name mall-portal \
--link mysql:db \
--link redis:redis \
--link mongo:mongo \
--link rabbitmq:rabbit \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/portal/logs:/var/logs \
-d mall/mall-portal
如果想使用Logstash收集日志的话,需要将应用容器连接到Logstsh,添加如下配置即可;
--link logstash:logstash \
- 开启防火墙
firewall-cmd --zone=public --add-port=8085/tcp --permanent
firewall-cmd --reload
至此mall-portal部署完成,可以到http://部署地址:8085/swagger-ui.html
查看接口文档
在此基础上你可以使用jenkins进行持续集成\持续交付等练手操作.再结合接口自动化以及压测基本涵盖了测开班讲授的大部分内容.查看mall官方文档中应该还有前端和移动端和微服务的内容,也可以根据需要进行部署;根据需求结合进行UI自动化练手实战.可是说是一个非常全面的练手项目;对了解当前主流软件技术架构非常有帮助,建议大家有空的话试一试.