引言
在笔者之前的文章微服务版mall电商项目本地开发环境启动前后端服务详细指导教程中笔者详细介绍了如何在开发者的本地环境把开源mall-swarm电商项目跑起来。但是最终我们的项目都是要部署到云服务器上去成为一个用户可访问的站点才有价值,包括后面的支付环节都是需要我们部署到云服务上才能申请到支付宝支付和微信支付的商户号才能打通的。
笔者在尝试将mall电商项目部署到个人的腾讯云和阿里云服务上时踩了不少坑,这篇文章相信可以帮助大家在部署微服务项目的时候少踩很多坑。由于部署mall-swarm微服务项目需要安装不少中间件以及不少于3个微服务,因此一台1核2G的云服务器根本跑不起来,因此需要不少于2台云服务器,至少有一台2核4G配置的云服务器,当然如果能租一台4核8G的云服务器一台也够了。
JDK8 安装
Linux
系统环境下安装JDK8
非常简单,为了节约文章篇幅,笔者给大家找了一篇写得非常具有实操性且图文并茂的文章给大家参考实践。linux环境安装jdk8
Docker 环境安装
因为我们在云服务器Linux环境下部署mall-swarm微服务项目时大部分中间件服务都是基于docker安装的,所以需要在自己的云服器上先安装docker环境。
1)安装yum-utils
yum install -y yum-utils device-mapper-persistent-data lvm2
2)为yum源添加docker仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3)安装docker
yum install docker-ce
RabbitMQ安装
1)下载rabbitmq3.12-management
的docker镜像
docker pull rabbitmq:3.12-management
2)docker 启动 RabbitMQ
服务
docker run -p 5672:5672 -p 15672:15672 --name rabbitmq \
-v /mydata/rabbitmq/data:/var/lib/rabbitmq \
-d rabbitmq:3.12-management
3)开通 RabbitMQ
端口防火墙
# rabbitmq 客户端访问rabbitmq 服务端口号
firewall-cmd --zone=public --add-port=5672/tcp --permanent
# rabbitmq 客户端访问rabbitmq 管理后台服务端口号
firewall-cmd --zone=public --add-port=15672/tcp --permanent
# 使开通的防火墙生效
firewall-cmd --reload
开通rabbitmq 服务端口的防火墙之后还需要登录往云服务控制台中的安全组入站规则添加对 5672和15672端口的放行,否则无法通过浏览器访问rabbitmq
控制台页面。
- 访问地址查看是否安装成功:http://47.120.47.250:15672/
- 输入账号密码并登录:guest/guest
- 创建帐号并设置其角色为管理员:mall/mall1234
- 创建一个新的虚拟host为:/mall
- 给mall用户分配权限和/mall虚拟host
点击mall用户进入用户配置页面并给mall用户配置该虚拟host的权限
ElasticSearch 与 Kibana 安装
ES 与 Kibana的安装请参考笔者之前写过的文章Docker 安装7.12.1版本ElasticSearch、Kibana及中文分词器
MongoDB安装
MongoDB 的安装请参考笔者之前写过的文章文档型数据库MongoDB的安装与入门操作
Nacos 安装
Nacos
的安装笔者没有使用docker安装,而是通过上传nacos-server-2.1.0.tar.gz
压缩包到云服务器上的/usr/local
目录,然后执行以下命令完成解压和安装
# 解压
tar -zxvf nacos-server-2.1.0.tar.gz
# 进入bin目录
cd ./nacos/bin
# 以单机模式启动nacos服务
sh startup.sh -m standalone
# 启动nacos 成功后执行命令查看启动日志
cat /usr/local/nacos/logs/start.out
控制台出现nacos启动成功的日志
,--.
,--.'|
,--,: : | Nacos 2.1.0
,`--.'`| ' : ,---. Running in stand alone mode, All function modules
| : : | | ' ,'\ .--.--. Port: 8848
: | \ | : ,--.--. ,---. / / | / / ' Pid: 1208727
| : ' '; | / \ / \. ; ,. :| : /`./ Console: http://172.29.68.237:8848/nacos/index.html
' ' ;. ;.--. .-. | / / '' | |: :| : ;_
| | | \ | \__\/: . .. ' / ' | .; : \ \ `. https://nacos.io
' : | ; .' ," .--.; |' ; :__| : | `----. \
| | '`--' / / ,. |' | '.'|\ \ / / /`--' /
' : | ; : .' \ : : `----' '--'. /
; |.' | , .-./\ \ / `--'---'
'---' `--`---' `----'
2024-03-05 23:55:14,468 INFO Bean 'org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler@285f09de' of type [org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2024-03-05 23:55:14,473 INFO Bean 'methodSecurityMetadataSource' of type [org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2024-03-05 23:55:14,901 INFO Tomcat initialized with port(s): 8848 (http)
2024-03-05 23:55:15,345 INFO Root WebApplicationContext: initialization completed in 4955 ms
2024-03-05 23:55:20,923 INFO Initializing ExecutorService 'applicationTaskExecutor'
2024-03-05 23:55:21,074 INFO Adding welcome page: class path resource [static/index.html]
2024-03-05 23:55:21,427 INFO Creating filter chain: Ant [pattern='/**'], []
2024-03-05 23:55:21,630 INFO Initializing ExecutorService 'taskScheduler'
2024-03-05 23:55:21,660 INFO Exposing 2 endpoint(s) beneath base path '/actuator'
2024-03-05 23:55:21,832 INFO Tomcat started on port(s): 8848 (http) with context path '/nacos'
2024-03-05 23:55:21,836 INFO Nacos started successfully in stand alone mode. use embedded storage
开通 nacos
8848 和 9848 端口防火墙,前者用于客户端与nacos
服务端http
协议通信和 grpc
通信协议端口
# nacos 客户端访问nacos 服务端http协议端口号
firewall-cmd --zone=public --add-port=8848/tcp --permanent
# nacos 客户端访问nacos 服务端 grpc 协议端口号
firewall-cmd --zone=public --add-port=9848/tcp --permanent
# 使开通的防火墙生效
firewall-cmd --reload
最后,记得登录往云服务控制台中的安全组入站规则添加对 8848 和9848端口的放行
安装 Nginx
服务
Nginx
是一个轻量级的Web服务器,后面我们要部署Vue
项目打包后的zip包这就需要用到Nginx
服务。这里我们也选择使用docker
容器来安装 Nginx
服务, 因为无论是使用tar.gz
包安装需要经过编译安装,这个过程非常容易出错,笔者一开始选择了使用tar.gz
包安装,但却在安装过程中出现各种报错。于是索性使用Docker容器安装,没想到非常顺利就把Nginx
安装好了。
执行如下命令安装并启动Nginx
# 拉取Nginx 镜像
docker pull nginx
#运行
docker run --name nginx-test -p 80:80 -d nginx
启动Nginx
成功后执行如下命令进入docker使用沙箱隔离机制给Nginx
分配的系统空间
docker exec -it nginx-test /bin/bash
进入Nginx
的隔离系统后,执行ls命令可看到Docker容器给Nginx
服务分配的系统根目录
[root@iZf8zdh51orpja1xwy1mutZ bin]# docker exec -it nginx-test /bin/bash
root@4b0c1dff5fe8:/# ls
bin dev docker-entrypoint.sh home lib32 libx32 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib lib64 media opt root sbin sys usr
root@4b0c1dff5fe8:/#
docker
安装的 Nginx
服务的 几个重要文件分别在隔离系统中的以下几个目录:
nginx
配置文件位置:/etc/nginx/nginx.conf
, 其中nginx.conf
文件中引入了/etc/nginx/conf.d/default.conf
配置文件;html
目录位置:/usr/share/nginx/html
;- 访问与错误日志位置:
/var/log/nginx/access.log
,/var/log/nginx/error.log
; nginx.pid
文件位置:/run/nginx.pid
,用于存放nginx
服务的进程id
在docker
沙箱系统中我们不好修改 nginx
的配置文件,我们可以docker container cp
命令将nginx
的配置文件目录拷贝到宿主机中的/mydata/nginx
目录下:
docker container cp nginx-test:/etc/nginx /mydata/nginx/
反之,我们也可以使用docker container cp
将宿主机中的文件拷贝到docker
容器中,然后通过执行docker restart nginx-test
命令重启nginx
服务。
部署后端SpringCloud
微服务jar包
这里我们为了方便演示并考虑服务器能承受的最大运行内存,我们目前只启动3个微服务,分别是mall-gateway
、mall-auth
和 mall-portal
3 个微服务。
1)修改mall-gateway
和 mall-auth
两个子模块中的bootstrap-prod.yml
配置文件
spring:
cloud:
nacos:
discovery:
server-addr: 47.113.205.244:8848 #注意使用服务器ip地址不需要加http协议
# server-addr: http://nacos-registry:8848
config:
# server-addr: http://nacos-registry:8848
file-extension: yaml
server-addr: 47.113.205.244:8848
logging:
file:
path: ./logs
level:
root: info
sql: debug
web: info
主要修改了nacos的地址,改为云服务上部署的nacos服务地址,并加上了日志文件位置和日志级别配置。
2)修改mall-portal
子模块中的`bootstrap-prod.yml
配置文件`
spring:
cloud:
nacos:
discovery:
server-addr: 47.113.205.244:8848
config:
server-addr: 47.113.205.244:8848
file-extension: yaml
datasource:
url: jdbc:mysql://134.175.187.61:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
username: mallSwarm
password: mallPassword1234
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
rabbitmq:
host: 47.120.47.250
port: 5672
username: guest
password: guest
redis:
host: localhost # Redis服务器地址
database: 0 # Redis数据库索引(默认为0)
port: 6379 # Redis服务器连接端口
password: # Redis服务器连接密码(默认为空)
timeout: 3000ms # 连接超时时间(毫秒)
logging:
file:
path: ./logs
level:
root: info
sql: debug
web: info
主要修改了客户端连接nacos
、mysql
和 rabbitmq
三个服务的连接地址,并加上了日志文件和日志级别配置项。
3)打包上传到服务器
在IDEA中对三个子模块的Lifecycle
生命周期函数,选中跳过测试模式开关按钮,依次执行 clean
和 package
打包扣好后会在子模块对应的target
目录下出现对应的<name>-1.0-SNAPSHOT.jar
,将打包好的mall-gateway-1.0-SNAPSHOT.jar
、mall-auth-1.0-SNAPSHOT.jar
和mall-portal-1.0-SNAPSHOT.jar
依次上传到2核4G配置的阿里云服务器上新建的/usr/local/mall/gateway
、/usr/local/mall/auth
和/usr/local/mall/portal
目录下,并分别在各个子目录中新建logs
目录。
4)运行启动微服务jar包脚本
执行如下命令启动三个微服务(因为笔者最熟悉的部署方式就是这种上传jar包后执行shell脚本完成部署,因此暂时没用docker部署,未来会切换成docker容器部署微服务)
# cd切换到gateway目录
cd /usr/local/mall/gateway
# 启动mall-gateway网关微服务
nohup java -jar -Dspring.profiles.active=prod -Dserver.port=8201 ./mall-gateway-1.0-SNAPSHOT.jar>./logs/app.log 2>&1 &
# cd切换到auth目录
cd ../auth
# 启动mall-auth 认证微服务
nohup java -jar -Dspring.profiles.active=prod -Dserver.port=8401 ./mall-auth-1.0-SNAPSHOT.jar>./logs/app.log 2>&1 &
# cd切换到portal目录
cd ../portal
# 启动mall-portal电商客户侧应用微服务
nohup java -jar -Dspring.profiles.active=prod -Dserver.port=8085 ./mall-portal-1.0-SNAPSHOT.jar>./logs/app.log 2>&1 &
启动成功后控制会打印出启动成功的微服务线程ID。
5)开通微服务端口防火墙
启动成功后控制会打印出启动成功的微服务线程ID。
5)开通微服务端口防火墙
6)云服务器控制台安全组添加微服务端口入站规则
添加完入站规则后点击右边的保存按钮完成对指定端口的入站放行,下面对几个微服务端口的入站规则笔者已经全部添加好了。
然后我们登录Nacos
服务的控制台(默认的登录用户名和密码为:nacos/nacos)
进入主页后点击左边菜单栏中的【服务管理】-> 【服务列表】就可以看到注册上来的三个微服务:
mall-auth
、mall-portal
和 mall-gateway
。
部署前端mall-app-web
项目
使用HBuilder X
打开 mall-app-web
项目
1)修改appConfig.js
文件中的API_BASE_URL
常量
export const API_BASE_URL = 'http://47.113.205.244:8201'; //修改为 mall-gateway 网关服务对应的IP地址
2)打包H5
项目
网站域名栏可填写自己注册备案的域名,本人的服务器暂时未备案就暂时使用h5命名,然后点击【发行按钮】完成项目打包,打包完成后控制台会提示编译后的
index.html
文件和static
静态文件为于项目根目录的unpackage/dist/build/h5
目录下。
3)压缩包上传到云服务器并拷贝到Nginx
服务的docker容器中
我们将h5目录打成一个h5.zip
包压缩文件到云服务器
笔者使用免费开源的
FinalShell
这款云服务器连接客户端工具连接的阿里云服务器,切换到指定目录后,点击右侧上传附件的图标按钮,打开对话框后选中打包好的h5.zip
压缩文件上传到/mydata/nginx/html
目录,并执行unzip h5.zip
命令解压h5.zip
压缩包。
4)修改从docker容器nginx-test
镜像服务系统空间拷贝到宿主机/mydata/nginx
目录下的配置文件
# 切换到conf.d目录下
cd /mydata/nginx/nginx/conf.d
# 修改default.conf
vim default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
// ......省略其他
}
按住i键后将 server 对象中的server_name
改为localhost
, 然后按住 Esc键后再输入 ':' ,再输入 'wq' 回车保存修改
然后执行如下命令将修改后的default.conf
配置文件拷贝到nginx-test
镜像服务空间的conf.d
目录
docker container cp default.conf nginx-test:/etc/nginx/conf.d
然后再执行重新加载配置文件命令
docker exec -it nginx-test nginx -s reload
5)将解压后的的h5目录中的文件拷贝到nginx-test
镜像服务空间的html
目录
# 切换到宿主机html目录
cd /mydata/nginx/nginx/html
# 拷贝index.html文件到nginx-test镜像服务空间
docker container cp index.html nginx-test:/usr/share/nginx/html
# 拷贝static目录到nginx-test镜像服务空间
docker container cp static nginx-test:/usr/share/nginx/html
6)重启nginx-test
镜像服务
docker restart nginx-test
站点效果
部署完成后,我们就可以在浏览器中输入站点网址 http://47.113.205.244
回车后进入系统首页
此时是以游客角色进入系统首页,点击任何一个链接后页面会弹框提示我们去登录
点击【重新登录】按钮进入登录界面
输入用户名zhengsan
和登录密码123456
点击登录按钮登录成功后再次进入首页
这次是以普通用户角色进入系统首页,点击下面的【小米官方旗舰店】则可跳转到【品牌详情】页
点击其中一个商品【小米 红米5A】则可进入购物页面
点击右边的【加入购物车按钮】后,然后点击【购物车】按钮进入购物车页面
继续点击【去结算】则进入【创建订单】页面
后面的流程笔者就不继续演示了,大家把mall项目部署到自己的云服务器上后就可以自行操作熟悉各种场景了。
结语
本文主要介绍了如何在付服务器Linux系统环境下搭建部署mall
电商项目所需要的基础设施以及中间件服务,包括JDK8
、Docker
、Mysql
、RabbitMq
、Redis
、MongoDB
、ElasticSearch
、Nacos
、Nginx
等,大部分基础设施服务采用了Docker
容器安装,简单高效。并以jar
包的形式部署了mall
电商项目中的三个微服务项目,分别是:mall-gateway
网关项目、mall-auth
鉴权项目以及商城门户项目mall-portal
,同时使用Nginx
的Docker
镜像服务服务部署了使用HBuilderX
打包好的mall-web-app
项目。前端访问后端接口统一走mall-gateway
网关,本文的部署实践部分也附带了很多操作过程中的截图。
最后我们通过浏览器访问的方式体验了部署到阿里云服务器上的mall电商项目的网站效果,希望大家通过本文都能掌握具备独立开发项目的运维知识和技术。整个部署过程中,笔者也踩了不少坑,下一篇文章笔者会详细列举自己在部署过程中踩过的坑以及它们对应的解决方案。
阿里云服务器推荐
大家也看到了要部署整个mall电商项目的前后端服务,需要安装8个基础设施及中间件服务,5个后台微服务(mall-gateway
、mall-auth
、mall-portal
、mall-admin
和 mall-monitor
)以及两个前端服务(mall-app-web
和 mall-admin-web
)等多达15个服务,占用的运行内存不可谓不高,所以需要至少两台云服务器才能支撑整个项目的稳定运行。如果要部署自己的mall
电商项目独立站点,那就少不了要购买云服务器。
部署好mall这样一个多模块微服务项目少购买一两台云服务器,笔者的这个mall
项目的多数jar包就部署在了一台2核4G配置的阿里云服务器上。亲身体验过,不仅好用,而且价格非常实惠。新人购买一台2核4G配置的阿里云服务器3个月只需要60多块钱,而购买一台2核2G配置的ECS云服务器一年只需要99元,非常划算!
感兴趣的老铁们可以复制下面的链接到浏览器中进入【阿里云小站】购买一台属于自己的云服务器,不仅有助于提高我们独立开发网站的能力,而且有一天说不定还能还能依靠自己的网站变现给自己带来一份不菲的副业收入,小伙伴们有想法就赶紧点击下面的链接【阿里小站】去选购自己想要的阿里云服务器吧!
下面是【阿里云小站】中的热销云服务器产品及其价格预览图
原创不易,能看到这里的老铁真的是铁粉无疑了!非常需要你们的点赞、在看和转发一套三连来鼓励笔者写出更多更好的优质文章,谢谢!
关注微信公众号【阿福谈Web编程】,并在公众号后台发送关键字【mall项目源码】即可获得mall
前后端项目的源码git
仓库地址链接。