微服务版mall电商项目本地开发环境启动前后端服务详细指导教程

前言

去年就开始关注mall-swarm开源微服务项目,也尝试着从gitee上克隆代码到本地后在本地启动项目,但是当时因为项目启动过程中一直报各种奇怪的错误,尤其本地Java客户端连接Nacos注册和配置中心报错和ElasticSearch服务安装失败困扰着自己继续深入研究这个开源项目的源码。最近自己换了性能更好的新电脑,个人云服务器上也使用Docker安装好了ElasticSearch, 于是又重新尝试在本地启动这个微服务项目,这次启动过程依然报了连接Nacos服务失败的异常,但是自己搜索博客参考别人的解决思路总算解决了,后面笔者会交代具体踩坑过程的解决方案。

关于mall-swarm项目的具体用到了哪些技术栈,大家可以参考我去年写过的一篇文章重点推荐一个基于SpringCloud的电商微服务项目mall-swarm, mall-swarm项目的作者Macrozheng持续维护了这个开源项目,并为此写下了很多篇技术文章,甚至还开通了知识星球mall电商项目实战交流圈用来与付费粉丝互动并帮助解决粉丝的在学习和实践这个项目中遇到的各种问题。

1 克隆mall-swarm 电商项目源码

后端mall-swarm项目仓库地址

前端商城项目仓库地址

商城后台前端项目仓库地址

读者最好先将以上三个项目的源码fork到自己的gitee仓库,然后从自己的gitee个人仓库克隆到本地磁盘,这样就可以愉快地做二次开发了。

首先需要使用git clone 命令将三个仓库的代码克隆到本地磁盘

mall_git

2 安装启动mall-swarm项目需要的第三方服务

mall-swarm微服务项目用到了Mysql(关系型数据库服务)、Nacos(微服务注册中心与配置中心服务)、Redis(分布式缓存服务)、RabbitMq(消息队列服务)、ElasticSearch(搜索引擎服务)、MongoDB(文档数据库服务)以及 Minio(开源对象存储服务)等第三方服务,下面我们一一介绍它们的下载安装与启动。

扫描二维码关注公众号,回复: 17284939 查看本文章

2.1 安装MySql8 并初始化数据

进入Mysql官网下载社区版mysql8: Mysql下载地址

MysqlDownload
点击下面的MySQL installer for Windows 进入下载Windows系统的Mysql8社区版服务,选择下面的288.6M的安装msi文件下载到本地磁盘

Mysql8.0.35
下载完成后双击该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

-- 创建数据库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字体右边的+号创建一个新的连接
mysql_new_connection
Connection Name 随意输入符合规范的连接名称,这里输入mysql_mall, Hostname 参数输入 localhost, Port参数默认为3306(如果Mysql是安装在Linux服务器上还需要开通3306端口防火墙才能连接Mysql服务), Username参数输入我们新创建的用户名druid, 输入Password参数前点击右边的Store in Vault 按钮在打开的小对话框中输入druid用户的登录密码druid705, 输入密码后会以掩码的形式显示,然后点击下面的Ok按钮保存密码
MysqlPassword
输入完druid用户的密码并保存后,继续输入Default Schema参数,也就是默认的数据库,这里输入mall,

然后点击下面的Test Connection按钮测试连接是否可用弹出一个Successfully Made the Mysql Connection的提示框则表示连接可用。然后依次点击提示框和Setup New Connection对话框中的两个ok按钮回到Mysql Workbench欢迎页面可以看到多了一个如下图所示的mysql_mall的连接
MysqlDruid
双击mysql_mall连接,连接成功后会自动进入一个自动命名为Query 1sql终端控制台,在该控制台中可执行sql脚本。
mysql_quey_console
然后将mall-swarm项目中document/sql/mall.sql文件中的sql脚本将其中的CHARSET=utf8统一改为CHARSET=utf8mb4后按住Ctrl+A全选复制拷贝到Mysql WorkbenchQuery 1 sql终端控制台中,然后按住Ctrl+A全选后点击图中的闪电符号执行选中的建表和插入数据sql脚本
mysql_execute_sql
执行完建表sql脚本后点击左边菜单栏中mall数据库下面的Tables可以看到多出了很多张以cms、oms、pms、sms 和 ums 开头的表,如下图所示
mall_tables

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源码的脚本

git clone https://github.com/alibaba/nacos.git

克隆完成后进入nacos子目录执行Maven编译打包脚本

cd nacos
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U 

打包完成后执行查看编译包命令

ls -al distribution/target/

nacos_version
可以看到有个nacos-server-2.3.0-BETA 版本的nacos可用,切换到该版本nacos的bin目录,然后执行单机启动命令

cd distribution/target/nacos-server-2.3.0-BETA/nacos/bin
startup.cmd -m standalone

nacos 启动成功后可以在控制台看到如下日志信息:
nacos_startup
然后再浏览器中输入http://localhost:8848/nacos 进入nacos管理控制台查看集群与微服务注册信息,首次登录的用户名和密码都是nacos
nacos_client
上图是进入单机启动的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目录后执行单机启动脚本

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稳定版本二进制安装包下载页面

nacos2.1.0
下载后解压该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命令控制台, 然后在控制台中执行如下命令

minio.exe server D:\ProgramFiles\minio\data --console-address ":9001"

minio安装成功之后会在控制台中出现如下信息:
minio_console_log
Minio服务启动成功后,MinIO的API将运行在9000端口,MinIO Console管理页面将运行在9001端口;

然后在浏览URL栏中其中输入: http://localhost:9001

回车后进入到Minio登录页面
minio_login
输入用户名: minioadmin 和密码 minioadmin 点击下面的 Login 按钮 登录成功后进入 minio控制台首页
minio_home_broswer
点击Administrator下面的 Buckets 菜单按钮进入Buckets界面
minio_buckets
点击右边的Create Buckets 按钮可打开创建Bucket存储桶的界面
minio_ceate_bucket
在Bucket Name 输入框中输入bucket名称mall-swarm, 然后点击下面的Create Bucket按钮即可完成一个存储桶的创建。

到这里启动mall-swarm后台项目需要的第三方服务就安装和启动完成了。

3 启动mall-swarm后台项目

打开IntellJ IDEA 开发软件, 然后依次点击File->New->Project from Existing Sources, 在打开的对话框中选择mall-swarm所在的位置
idea_import_project
点击下面的OK按钮完成将mall-swarm项目导入到IDEA中,导入后依次选择File->Project Structure 打开对话框设置Java SDK
set_java_sdk
选中本地安装的JDK8, 然后点击OK完成设置。

IntellJ IDEA 导入项目源码后会根据pom.xml中的Maven依赖去阿里云Maven公共仓库和Maven中央仓库下载本项目所需要的依赖jar包到本地Maven仓库,下载完所有的依赖jar包会需要一段时间,时间长短取决于你的网络带宽。

1)修改 mall-gateway, mall-auth, mall-portal, mall-searchmall-admin 5个子模块项目的pom.xml中的nacos客户端版本

统一排除spring-cloud-starter-alibaba-nacos-discoveryspring-cloud-starter-alibaba-nacos-config依赖中的1.4.1版本的nacos-client, 并换上2.1.1版本的nacos-client依赖

        <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会在项目启动时报各种如下面这种因类不存在而导致的反射异常导致项目启动失败

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-searchmall-admin 5个子模块项目中src/main/resource目录下的application.yml文件

mall-gateway子模块项目的application.yml配置文件新增支持循环引用

spring:
  main:
    allow-circular-references: true

因为不配置支持循环引用项目启动过程会报RedisTemplate bean在启动过程中不支持循环引用而初始化失败的错误,从而导致项目启动失败。

mall-portal 子模块项目的application.yml配置文件中数据源配置变量中的用户名和密码换成我们创建的druid用户名和认证密码,url变量后面增加&allowPublicKeyRetrieval=truemongodb连接配置也换成我们自己的连接hostdatabaseusernamepasswordrabbitmq连接的用户名和密码也换成我们自己的,同时也要增加支持循环引用的配置变量。

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 中的数据源配置变量中的usernamepassword 换成druid用户名和认证密码,url变量后面增加&allowPublicKeyRetrieval=trueelasticsearch 的连接uri也换成自己服务器上安装的ES对应的uri

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;同时也配置支持循环引用。

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-gatewaymall-authmall-portalmall-searchmall-admin 5个子模块项目中启动类中的main方法, 启动成功后我们可以在nacos注册中心的服务列表页面看到这5个微服务的基础信息,这也表示以上5个子模块对应的应用启动成功。
microServiceList
还有一个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
uniAppId
笔者这里生成的appid为__UNI__E9EFFB0

然后在HBuilder X中使用运行->运行到浏览器->Chrome运行项目,运行成功后会自动打开下面地址(将浏览器改为手机模式):http://localhost:8060,如果浏览器没有启动的话,可以直接访问如下地址访问:http://localhost:8060

初次进入系统会自动跳转到的登录页面
mall_app_web_login
初次登录我们使用ums_member表中的test账户,由于表中的password密码时加密的,我们通过注册接口的后台源码发现用户注册时密码加密时使用的是BCrypt#hashpw静态方法。于是我们在后台mall-portal子模块项目src/test目录下的com.macro.mall.portal包中新建测试类UserTest, 并在该类中写一个main方法用来生成test用户的登录密码test123的加码字符串

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字段

update ums_member set password='$2a$10$eiuT/mpVqD6s5A.aV1oDQOruakyGvHYBX9WHBYf7/y8T6Cv3oxRFS'
where username='test';

执行成功后我们就可以在登录页面的密码输入框中输入test用户的密码test123, 然后点击登录按钮,登录成功后进入系统首页
mall_app_web_home
进入首页之后用户就可以点击底部导航栏中的分类购物车我的等菜单按钮进入对应的页面,也可以在每个页面的右侧通过鼠标下滑浏览页面详细内容,这里就不过多演示了,读者可以自己去页面上操作。不过项目里还有一些功能尚未完善,比如用户注册功能和支付功能就还没有实现,笔者打算在这个项目的基础上做二次开发完成这些未实现功能的开发,等功能完善后再部署到自己的云服务器上

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,启动成功后可以在命令控制台看到如下日志内容:
mall_admin_wep_startup
然后在谷歌浏览器URL栏中输入http://localhost:8090 后回车进入mall电商后管系统登录页面
mall_admin_web_login
对于admin用户的登录密码我们可以按照启动mall-app-web项目中修改test用户登录密码一样的方式修改ums_admin表中admin用户的登录密码

首先修改UserTest类中main方法的源码,将password变量值修改为admin123

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用户的登录密码:

update ums_admin set password='$2a$10$KTZFXSdz/SZEb3noBHTe7ON5QxiVYdhG.XLM70uYBOlMHbFVg3uAC'
where username='admin';

修改好admin用户的登录密码后我们就可以使用修改后的密码admin123进行登录了,登录后管系统成功后进入后管系统首页
mall_admin_web_home
点击商品菜单下面的商品列表按钮可以在右边主页看到商品列表信息,同时后台管理员用户还可以通过点击添加商品菜单按钮添加自己想要发布的商品。

web_admin_product_list
点击订单菜单下面的订单列表按钮可以在右边主页看到订单列表数据
web_admin_order_list
其他的页面笔者就不一一演示了,大家可自行操作玩转mall-admin-web后管系统。

到这里我们就可以愉快地研究mall电商项目的源码并在此基础上进行二次开发扩展自己的新功能了!

5 双十一腾讯云服务器推广

对于这样一个多模块微服务项目来说,不仅自己部署各种自己开发的项目jar包服务和使用Nginx部署前端Web服务需要云服务器,

而且各种Mysql如数据库、MongoDB、ElasticSearch、Redis、RabbitMQ 和 Nacos等第三方服务都很消耗机器的CPU资源和内存,

为了减轻机器因为负载过重而导致宕机停服的概率发生,笔者还是建议大家把第三方服务和自己的项目jar包分开部署在不同的服务器上。

如果全部在自己的个人电脑上跑这么多服务,很容易造成电脑非常卡顿,为了方便具备独立开发的能力,也顺便掌握一些运维的知识,笔

者一直用的是腾讯云服务器,感觉一直非常好用。最近临近双十一,腾讯云也在做各种优惠打折活动,2核2G的服务器一年才只要88元,

真的是太划算了!所以趁着这波活动向大家推荐一几款价格非常实惠而且质量也很过硬的腾讯云服务器,刚好有需要的朋友可以点击下面

的连接购买!不瞒各位粉丝朋友,每个客户通过我的推广链接确实能让我赚点微博的推广佣金,也算是支持一下笔者不辞辛苦写下这篇技

术长文,也能有更多动力坚持创作,在这里感谢各位下单的老铁!
rhino-design
【腾讯云】11.11云上盛惠,云服务器首年1.8折起,买1年送3个月!境外云服务器15元/月起,买更多省更多!
云产品特惠专区
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

猜你喜欢

转载自blog.csdn.net/heshengfu1211/article/details/134343400