开源电商平台mall部署填坑

开源电商平台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

1

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
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
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源码目录中可能没有下图圈起部分的文件
    9
    不用管它,在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自动化练手实战.可是说是一个非常全面的练手项目;对了解当前主流软件技术架构非常有帮助,建议大家有空的话试一试.

参考文档:http://www.macrozheng.com/#/foreword/mall_foreword_01

3 个赞

很详细了,点赞!
遇到一个问题,开启rabbitmq管理器时,失败,
image
所以不能访问rabbitmq,百度的很多方法,仍无解
走过路过,有清楚的同学请回复。

可以看一下日志,看看具体是什么问题

有几个点想问下。。
1.
配置mysql权限时候,下面执行报错
grant all privileges on . to root@‘localhost’ identified by “123456”;

2.Elasticsearch安装后,启动不起来,看log没看出来问题在哪。。

3.Kibana看起来已经启动了 ,但是实际没有启动。。能提供点思路么

SQL部分讲命令中的单引号''换成反引号``(就是数字1左侧那个按键)

maven 编译mall-portal这个模块时,用的是哪个:
application-dev.yml
application-prod.yml

我没有仔细看源码,所以没有找到修改哪里去区分生产环境和开发环境,所以我是都给改了.当然你也可以全局搜索application-dev.yml来看看哪里做了调用区分.然后再修改相应的文件就可以了

班长牛B~

能否加上如何使用maven编译mall的过程?

文档中有写的。

你好,请问下这个项目的学院课程有吗

好像没,这是学院全链路压测课程的练习环境

感谢,根据你的教程加上自己查日志百度,现在搭建完成了

为何我启动mall portal会出现连接 mq 失败


然后我mall portal 网站也无法访问。

已解决,是我maven 构建docker 镜像的时候设置有问题

感谢感谢,搭建完成