微服务版mall电商项目本地开发环境启动前后端服务详细指导教程
- 前言
- [1 克隆mall-swarm 电商项目源码](#1 克隆mall-swarm 电商项目源码)
- [2 安装启动mall-swarm项目需要的第三方服务](#2 安装启动mall-swarm项目需要的第三方服务)
-
- [2.1 安装MySql8 并初始化数据](#2.1 安装MySql8 并初始化数据)
- [2.2 安装Nacos](#2.2 安装Nacos)
- [2.3 安装Redis](#2.3 安装Redis)
- [2.4 RabbitMQ安装](#2.4 RabbitMQ安装)
- [2.5 ElasticSearch安装](#2.5 ElasticSearch安装)
- [2.6 MongoDB安装](#2.6 MongoDB安装)
- [2.7 Minio安装](#2.7 Minio安装)
- [3 启动mall-swarm后台项目](#3 启动mall-swarm后台项目)
- [4 启动 mall-app-web 前端服务](#4 启动 mall-app-web 前端服务)
- [4 启动 mall-admin-web 前端项目](#4 启动 mall-admin-web 前端项目)
- [5 双十一腾讯云服务器推广](#5 双十一腾讯云服务器推广)
前言
去年就开始关注mall-swarm开源微服务项目,也尝试着从gitee
上克隆代码到本地后在本地启动项目,但是当时因为项目启动过程中一直报各种奇怪的错误,尤其本地Java客户端连接Nacos
注册和配置中心报错和ElasticSearch
服务安装失败困扰着自己继续深入研究这个开源项目的源码。最近自己换了性能更好的新电脑,个人云服务器上也使用Docker
安装好了ElasticSearch
, 于是又重新尝试在本地启动这个微服务项目,这次启动过程依然报了连接Nacos
服务失败的异常,但是自己搜索博客参考别人的解决思路总算解决了,后面笔者会交代具体踩坑过程的解决方案。
关于mall-swarm项目的具体用到了哪些技术栈,大家可以参考我去年写过的一篇文章重点推荐一个基于SpringCloud的电商微服务项目mall-swarm, mall-swarm项目的作者Macrozheng持续维护了这个开源项目,并为此写下了很多篇技术文章,甚至还开通了知识星球mall电商项目实战交流圈用来与付费粉丝互动并帮助解决粉丝的在学习和实践这个项目中遇到的各种问题。
1 克隆mall-swarm 电商项目源码
读者最好先将以上三个项目的源码fork到自己的gitee仓库,然后从自己的gitee个人仓库克隆到本地磁盘,这样就可以愉快地做二次开发了。
首先需要使用git clone
命令将三个仓库的代码克隆到本地磁盘
2 安装启动mall-swarm项目需要的第三方服务
mall-swarm
微服务项目用到了Mysql(关系型数据库服务)、Nacos(微服务注册中心与配置中心服务)、Redis(分布式缓存服务)、RabbitMq(消息队列服务)、ElasticSearch(搜索引擎服务)、MongoDB(文档数据库服务)以及 Minio(开源对象存储服务)等第三方服务,下面我们一一介绍它们的下载安装与启动。
2.1 安装MySql8 并初始化数据
进入Mysql官网下载社区版mysql8:Mysql下载地址
点击下面的MySQL installer for Windows 进入下载Windows系统的Mysql8社区版服务,选择下面的288.6M的安装msi文件下载到本地磁盘
下载完成后双击该mysql-installer-community-8.0.35.msi安装包,按照安装提示完成Mysql8数据库服务端的安装并设置root账户的登录密码,详细安装过程可参考知乎文章Mysql超详细安装配置教程(保姆级)。安装好Mysql8之后可以下载安装社区版的Mysql Workbench
或者在社区版本的Intellj IDEA
中下载一个DB Navigator
插件作为连接Mysql服务的客户端工具。
安装好Mysql8后,打开Mysql workbench
使用root账号和密码登录Mysql数据库,先执行如下sql脚本创建mall数据库和访问mall数据库的特定用户druid
sql
-- 创建数据库mall
CREATE DATABASE `mall` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
-- 创建用户druid及登录密码
CREATE USER 'druid'@'%' IDENTIFIED BY 'druid705';
-- 将mall数据库的各项操作权限授予druid用户
GRANT CREATE,DROP,ALTER,INSERT,UPDATE,SELECT,DELETE on mall.* to 'druid'@'%' with grant OPTION;
-- 刷新授权
FLUSH PRIVILEGES;
然后退出root账户登录并退出Mysql Workbench
, 重新打开Mysql Workbench
后点击Mysql Connection
字体右边的+号创建一个新的连接
Connection Name
随意输入符合规范的连接名称,这里输入mysql_mall
, Hostname
参数输入 localhost
, Port参数默认为3306(如果Mysql是安装在Linux服务器上还需要开通3306端口防火墙才能连接Mysql服务), Username
参数输入我们新创建的用户名druid, 输入Password参数前点击右边的Store in Vault
按钮在打开的小对话框中输入druid用户的登录密码druid705
, 输入密码后会以掩码的形式显示,然后点击下面的Ok按钮保存密码
输入完druid用户的密码并保存后,继续输入Default Schema参数,也就是默认的数据库,这里输入mall,
然后点击下面的Test Connection
按钮测试连接是否可用弹出一个Successfully Made the Mysql Connection
的提示框则表示连接可用。然后依次点击提示框和Setup New Connection
对话框中的两个ok
按钮回到Mysql Workbench
欢迎页面可以看到多了一个如下图所示的mysql_mall的连接
双击mysql_mall连接,连接成功后会自动进入一个自动命名为Query 1
的sql
终端控制台,在该控制台中可执行sql
脚本。
然后将mall-swarm项目中document/sql/mall.sql
文件中的sql脚本将其中的CHARSET=utf8统一改为CHARSET=utf8mb4后按住Ctrl+A
全选复制拷贝到Mysql Workbench
的Query 1
sql终端控制台中,然后按住Ctrl+A
全选后点击图中的闪电符号执行选中的建表和插入数据sql脚本
执行完建表sql脚本后点击左边菜单栏中mall数据库下面的Tables可以看到多出了很多张以cms、oms、pms、sms 和 ums 开头的表,如下图所示
2.2 安装Nacos
进入Nacos官网快速开始页面 根据Nacos安装指导文档安装Nacos服务
安装Nacos之前需要预先安装8以上版本的JDK和3.2.x以上版本的Maven, JDK和Maven的安装网上有很多详细教程,安装也比较简单,还没有下载安装这两个软件的同学可参搜索百度考相关教程安装,笔者这里就不多说了。
1)从git仓库下载源码并编译打包
在本地D盘新建Nacos目录,进入Nacos目录后鼠标右键选择 Open Git Bash Here
(需要先在本地安装git), 然后执行拉取nacos源码的脚本
bash
git clone https://github.com/alibaba/nacos.git
克隆完成后进入nacos子目录执行Maven编译打包脚本
bash
cd nacos
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
打包完成后执行查看编译包命令
bash
ls -al distribution/target/
可以看到有个nacos-server-2.3.0-BETA 版本的nacos可用,切换到该版本nacos的bin目录,然后执行单机启动命令
bash
cd distribution/target/nacos-server-2.3.0-BETA/nacos/bin
startup.cmd -m standalone
nacos 启动成功后可以在控制台看到如下日志信息:
然后再浏览器中输入http://localhost:8848/nacos
进入nacos管理控制台查看集群与微服务注册信息,首次登录的用户名和密码都是nacos
上图是进入单机启动的Nacos管理控制台中的集群管理->节点列表页面截图
如果需要在Linux
系统的云服务器上安装Nacos 则可将nacos/distribution/target
目录下的nacos-server-2.3.0-BETA.tar.gz
安装包上传到Linux
服务器执行tar -zxvf nacos-server-2.3.0-BETA.tar.gz
解压命令后,进入nacos-server-2.3.0-BETA/bin
目录后执行单机启动脚本
bash
cd ./nacos-server-2.3.0-BETA/bin
sh startup.sh -m standalone
项目开源作者建议安装2.1.0版本的Nacos, 因为这是一个经过众多用户验证体验较好且稳定的Nacos版本,笔者Linux云服务上安装的Nacos也是2.1.0版本,该版本的二进制包可前往github下载:nacos稳定版本二进制安装包下载页面
下载后解压该zip包,然后进入nacos-server-2.1.0/bin
目录执行startup.cmd -m standalone
命令即可启动Nacos服务。
2.3 安装Redis
请参考菜鸟教程Redis安装 完成Redis安装和启动, 不过下载安装的Redis
版本需要换成5.0
及以上的版本。
2.4 RabbitMQ安装
请参考知乎文章绝对详细的 RabbitMQ入门,看完本系列就够了(二) 完成RabbitMq的安装和启动, 并通过guest用户登录rabbitmq控制台后创建admin用户及登录密码及/mall
的虚拟主机,并将/mall
虚拟主机的访问权限授予给admin
用户
2.5 ElasticSearch安装
请参考笔者前几天发表的docker安装ElasticSearch
教程文章Docker 安装7.12.1版本ElasticSearch、Kibana及中文分词器
安装好ElasticSearch、Kibana
及中文分词器
2.6 MongoDB安装
请参照笔者去年发表的文章文档型数据库MongoDB的安装与入门操作 完成MongoDB的安装和启动,并创建mallMaster用户及登录密码, database使用test
2.7 Minio安装
在谷歌浏览器URL导航栏中输入https://dl.minio.org.cn/server/minio/release/windows-amd64/minio.exe 后回车下载Windows版本的minio二进制安装程序,下载完成后在D:ProgramFiles
目录下新建minio
文件夹, 并在该文件夹下新建data
目录。然后将下载的minio.exe
将其剪切到D:\ProgramFiles\minio
目录,并在该目录打开cmd
命令控制台, 然后在控制台中执行如下命令
bash
minio.exe server D:\ProgramFiles\minio\data --console-address ":9001"
minio安装成功之后会在控制台中出现如下信息:
Minio服务启动成功后,MinIO的API将运行在9000
端口,MinIO Console管理页面将运行在9001
端口;
然后在浏览URL栏中其中输入: http://localhost:9001
回车后进入到Minio登录页面
输入用户名: minioadmin
和密码 minioadmin
点击下面的 Login
按钮 登录成功后进入 minio
控制台首页
点击Administrator下面的 Buckets 菜单按钮进入Buckets界面
点击右边的Create Buckets 按钮可打开创建Bucket存储桶的界面
在Bucket Name 输入框中输入bucket名称mall-swarm, 然后点击下面的Create Bucket按钮即可完成一个存储桶的创建。
到这里启动mall-swarm后台项目需要的第三方服务就安装和启动完成了。
3 启动mall-swarm后台项目
打开IntellJ IDEA
开发软件, 然后依次点击File->New->Project from Existing Sources, 在打开的对话框中选择mall-swarm
所在的位置
点击下面的OK按钮完成将mall-swarm
项目导入到IDEA中,导入后依次选择File->Project Structure 打开对话框设置Java SDK
选中本地安装的JDK8
, 然后点击OK完成设置。
IntellJ IDEA
导入项目源码后会根据pom.xml
中的Maven依赖去阿里云Maven公共仓库和Maven中央仓库下载本项目所需要的依赖jar包到本地Maven仓库,下载完所有的依赖jar包会需要一段时间,时间长短取决于你的网络带宽。
1)修改 mall-gateway, mall-auth, mall-portal, mall-search
和 mall-admin
5个子模块项目的pom.xml
中的nacos
客户端版本
统一排除spring-cloud-starter-alibaba-nacos-discovery
和spring-cloud-starter-alibaba-nacos-config
依赖中的1.4.1版本的nacos-client
, 并换上2.1.1版本的nacos-client
依赖
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.1</version>
</dependency>
之所以要换上2.1.1版本的nacos-client
, 是因为1.4.1版本的nacos-client
会在项目启动时报各种如下面这种因类不存在而导致的反射异常导致项目启动失败
bash
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration': Unsatisfied dependency expressed through field 'propertySourceLocators'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'nacosPropertySourceLocator' defined in class path resource [com/alibaba/cloud/nacos/NacosConfigBootstrapConfiguration.class]: Unsatisfied dependency expressed through method 'nacosPropertySourceLocator' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'nacosConfigManager' defined in class path resource [com/alibaba/cloud/nacos/NacosConfigBootstrapConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.alibaba.cloud.nacos.NacosConfigManager]: Factory method 'nacosConfigManager' threw exception; nested exception is com.alibaba.cloud.nacos.diagnostics.analyzer.NacosConnectionFailureException: java.lang.reflect.InvocationTargetException
2)修改mall-gateway, mall-portal, mall-search
和 mall-admin
5个子模块项目中src/main/resource
目录下的application.yml
文件
mall-gateway
子模块项目的application.yml
配置文件新增支持循环引用
yml
spring:
main:
allow-circular-references: true
因为不配置支持循环引用项目启动过程会报RedisTemplate
bean在启动过程中不支持循环引用而初始化失败的错误,从而导致项目启动失败。
mall-portal
子模块项目的application.yml
配置文件中数据源配置变量中的用户名和密码换成我们创建的druid用户名和认证密码,url变量后面增加&allowPublicKeyRetrieval=true
;mongodb
连接配置也换成我们自己的连接host
、database
、username
和 password
;rabbitmq
连接的用户名和密码也换成我们自己的,同时也要增加支持循环引用的配置变量。
yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
username: druid
password: <your password>
data:
mongodb:
host: localhost
port: 27017
database: test
username: <mongo username>
password: <mongo password>
rabbitmq:
host: localhost
port: 5672
virtual-host: /mall
username: <rabbitmq username>
password: <rabbitmq password>
main:
allow-circular-references: true
mall-search
子模块项目的application.yml
中的数据源配置变量中的username
和 password
换成druid
用户名和认证密码,url变量后面增加&allowPublicKeyRetrieval=true
;elasticsearch
的连接uri
也换成自己服务器上安装的ES对应的uri
。
yml
spring
datasource:
url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
username: druid
password: <druid password>
elasticsearch:
uris: localhost:9200
因为mall-search
子模块项目中没有配置RedisTemplate
的bean,所以无需在配置文件中开启循环引用。
mall-admin
子模块项目中的application.yml
中的数据源配置变量中的username
和 password
换成druid
用户名和认证密码,url变量后面增加&allowPublicKeyRetrieval=true
;同时也配置支持循环引用。
yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
username: druid
password: <druid password>
main:
allow-circular-references: true
然后我们依次启动mall-gateway
、mall-auth
、mall-portal
、mall-search
和 mall-admin
5个子模块项目中启动类中的main
方法, 启动成功后我们可以在nacos
注册中心的服务列表页面看到这5个微服务的基础信息,这也表示以上5个子模块对应的应用启动成功。
还有一个mall-monitor
微服务用于服务监控的,考虑到我们暂时用不上暂且先不启动。
4 启动 mall-app-web 前端服务
mall-app-web
项目是用于对接mall-swarm
后台服务的普通用户客户端电商项目
启动mall-app-web
项目可参考该项目源码根目录下的README.md
文档中的搭建步骤部分内容
在启动之前我们需要把utils/appConfig.js
文件中的API_BASE_URL='http://localhost:8080' 改为
API_BASE_URL='http://localhost:8201/mall-portal' ,统一走微服务网关访问后台API,无需按照README.md
文档中的内容修改utils/requestUtils.js
文件中的config.baseUrl
变量的值,如果你只是前端开发人员,不想部署mall-swarm
后台服务, 那么可以将API_BASE_URL变量的值替换为https://portal-api.macrozheng.com
前端直接调用开源作者部署的后台API。
由于源码中manifest.json
文件中appid
的值为空,我们需要在使用HBuilderX导入mall-app-web
项目的源码后选中manifest.json
文件,点击基础配置 界面中的重新获取按钮生成项目的appid
笔者这里生成的appid为__UNI__E9EFFB0
然后在HBuilder X
中使用运行->运行到浏览器->Chrome
运行项目,运行成功后会自动打开下面地址(将浏览器改为手机模式):http://localhost:8060,如果浏览器没有启动的话,可以直接访问如下地址访问:http://localhost:8060
初次进入系统会自动跳转到的登录页面
初次登录我们使用ums_member
表中的test账户,由于表中的password密码时加密的,我们通过注册接口的后台源码发现用户注册时密码加密时使用的是BCrypt#hashpw
静态方法。于是我们在后台mall-portal
子模块项目src/test
目录下的com.macro.mall.portal
包中新建测试类UserTest
, 并在该类中写一个main方法用来生成test用户的登录密码test123
的加码字符串
java
package com.macro.mall.portal;
import cn.hutool.crypto.digest.BCrypt;
public class UserTest {
public static void main(String[] args) {
String password = "test123";
String encryptPwd = BCrypt.hashpw(password);
System.out.println("encryptPwd:"+encryptPwd);
}
}
然后运行UserTest
类中的main方法就可以看到控制台打印出了一长串加密字符串: $2a$10$eiuT/mpVqD6s5A.aV1oDQOruakyGvHYBX9WHBYf7/y8T6Cv3oxRFS
然后我们在Mysql数据库客户端中执行更新sql语句将这一串字符串更新到ums_member
表中test用户的password字段
sql
update ums_member set password='$2a$10$eiuT/mpVqD6s5A.aV1oDQOruakyGvHYBX9WHBYf7/y8T6Cv3oxRFS'
where username='test';
执行成功后我们就可以在登录页面的密码输入框中输入test用户的密码test123
, 然后点击登录按钮,登录成功后进入系统首页
进入首页之后用户就可以点击底部导航栏中的分类 、购物车 和我的等菜单按钮进入对应的页面,也可以在每个页面的右侧通过鼠标下滑浏览页面详细内容,这里就不过多演示了,读者可以自己去页面上操作。不过项目里还有一些功能尚未完善,比如用户注册功能和支付功能就还没有实现,笔者打算在这个项目的基础上做二次开发完成这些未实现功能的开发,等功能完善后再部署到自己的云服务器上
4 启动 mall-admin-web 前端项目
参照mall-admin-web
项目源码根目录下的README.md
文档中的搭建 步骤完成项目的启动,启动过程中如果发现node-sass
安装失败很可能是因为你安装的node.js
版本与node-sass
的版本不兼容导致的问题,如果你在开发环境使用的node.js
版本是v12.14.0
版本的话那么执行安装依赖npm install
的过程是不会报错的。而笔者开发环境使用的node.js
版本是v14.21.3
所以安装依赖个过程报了错,需要将package.json
文件中的node-sass
的值由^4.13.0
改为^4.14.0
, 然后继续执行npm install
命令完成依赖的安装就没问题了。
终端控制台中执行完npm install
命令成功安装完项目的依赖后继续执行开发环境启动命令npm run dev
,启动成功后可以在命令控制台看到如下日志内容:
然后在谷歌浏览器URL栏中输入http://localhost:8090
后回车进入mall电商后管系统登录页面
对于admin
用户的登录密码我们可以按照启动mall-app-web
项目中修改test用户登录密码一样的方式修改ums_admin
表中admin
用户的登录密码
首先修改UserTest
类中main方法的源码,将password变量值修改为admin123
java
public class UserTest {
public static void main(String[] args) {
String password = "admin123";
String encryptPwd = BCrypt.hashpw(password);
System.out.println("encryptPwd:"+encryptPwd);
}
}
然后执行main
方法, 看到控制台打印出encryptPwd
的值后将其拷贝出来并在Mysql客户端中通过执行如下sql修改admin
用户的登录密码:
sql
update ums_admin set password='$2a$10$KTZFXSdz/SZEb3noBHTe7ON5QxiVYdhG.XLM70uYBOlMHbFVg3uAC'
where username='admin';
修改好admin
用户的登录密码后我们就可以使用修改后的密码admin123
进行登录了,登录后管系统成功后进入后管系统首页
点击商品 菜单下面的商品列表 按钮可以在右边主页看到商品列表信息,同时后台管理员用户还可以通过点击添加商品菜单按钮添加自己想要发布的商品。
点击订单 菜单下面的订单列表 按钮可以在右边主页看到订单列表数据
其他的页面笔者就不一一演示了,大家可自行操作玩转mall-admin-web
后管系统。
到这里我们就可以愉快地研究mall电商项目的源码并在此基础上进行二次开发扩展自己的新功能了!
5 双十一腾讯云服务器推广
对于这样一个多模块微服务项目来说,不仅自己部署各种自己开发的项目jar包服务和使用Nginx部署前端Web服务需要云服务器,
而且各种Mysql如数据库、MongoDB、ElasticSearch、Redis、RabbitMQ 和 Nacos等第三方服务都很消耗机器的CPU资源和内存,
为了减轻机器因为负载过重而导致宕机停服的概率发生,笔者还是建议大家把第三方服务和自己的项目jar包分开部署在不同的服务器上。
如果全部在自己的个人电脑上跑这么多服务,很容易造成电脑非常卡顿,为了方便具备独立开发的能力,也顺便掌握一些运维的知识,笔
者一直用的是腾讯云服务器,感觉一直非常好用。最近临近双十一,腾讯云也在做各种优惠打折活动,2核2G的服务器一年才只要88元,
真的是太划算了!所以趁着这波活动向大家推荐一几款价格非常实惠而且质量也很过硬的腾讯云服务器,刚好有需要的朋友可以点击下面
的连接购买!不瞒各位粉丝朋友,每个客户通过我的推广链接确实能让我赚点微博的推广佣金,也算是支持一下笔者不辞辛苦写下这篇技
术长文,也能有更多动力坚持创作,在这里感谢各位下单的老铁!
【腾讯云】11.11云上盛惠,云服务器首年1.8折起,买1年送3个月!境外云服务器15元/月起,买更多省更多!
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中