- 尚筹网的后台管理系统和前台会员系统的部署,以及完结总结
- 后台管理系统:SSM单一结构
- 前台会员系统:分布式架构SpringBoot+SpringCloud
1. 图纸
2. 租赁ESC服务器
2.1 网址
云服务器ECS_云主机_服务器托管_弹性计算-阿里云 (aliyun.com)
2.2 内存选择
由于所有程序、Web 应用、微服务都要在一个实例中运行,所以实例的内存建议使用 8G 内存。
2.3 实例管理
2.4 使用 Xshell 远程连接
使用公网地址进行连接
3. 安装服务器端运行环境
3.1 上传压缩资源
3.2 安装JDK
解压JDK压缩包
配置/etc/profile文件
使用source命令使/etc/profile文件生效
[root@iZm5e3uhznq40do0w2g4qsZ ~]# cd /opt/software/
[root@iZm5e3uhznq40do0w2g4qsZ software]# ll
total 647124
-rw-r--r-- 1 root root 10874669 Sep 25 01:44 apache-tomcat-9.0.21.tar.gz
-rw-r--r-- 1 root root 146799982 Sep 25 01:45 jdk-8u311-linux-x64.tar.gz
-rw-r--r-- 1 root root 47836256 Sep 25 01:45 mysql-community-client-8.0.26-1.el7.x86_64.rpm
-rw-r--r-- 1 root root 454689776 Sep 25 01:46 mysql-community-server-8.0.26-1.el7.x86_64.rpm
-rw-r--r-- 1 root root 2438367 Sep 25 01:45 redis-6.2.1.tar.gz
①.解压JDK压缩包
[root@iZm5e3uhznq40do0w2g4qsZ software]# tar -zxvf jdk-8u311-linux-x64.tar.gz
[root@iZm5e3uhznq40do0w2g4qsZ software]# cd jdk1.8.0_311/
[root@iZm5e3uhznq40do0w2g4qsZ jdk1.8.0_311]# pwd
/opt/software/jdk1.8.0_311
②.配置/etc/profile文件
[root@iZm5e3uhznq40do0w2g4qsZ jdk1.8.0_311]# vim /etc/profile
JAVA_HOME=/opt/software/jdk1.8.0_311
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME PATH
③使用source命令使/etc/profile文件生效
[root@iZm5e3uhznq40do0w2g4qsZ jdk1.8.0_311]# source /etc/profile
④测试jdk是否安装成功
[root@iZm5e3uhznq40do0w2g4qsZ jdk1.8.0_311]# echo $JAVA_HOME
/opt/software/jdk1.8.0_311
[root@iZm5e3uhznq40do0w2g4qsZ jdk1.8.0_311]# java -version
java version "1.8.0_311"
Java(TM) SE Runtime Environment (build 1.8.0_311-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.311-b11, mixed mode)
3.3 解压Tomcat
Tomcat不需要安装,解压后即可使用,但是如果想访问Tomcat,需要在ECS中设置安全组,放行Tomcat端口号:8080
[root@iZm5e3uhznq40do0w2g4qsZ software]# tar -zxvf apache-tomcat-9.0.21.tar.gz
3.4 安装MySQL
3.4.1 安装
①先查看是否有mariadb,如果有则卸载,因为mariadb对mysql有干扰
[root@iZm5e3uhznq40do0w2g4qsZ software]# rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
#--nodeps的意思是忽略依赖,强制卸载
[root@iZm5e3uhznq40do0w2g4qsZ software]# rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps
②解压压缩包并按顺序安装MySQL
①.解压
[root@iZm5e3uhznq40do0w2g4qsZ software]# tar -xvf mysql-8.0.26-1.el7.x86_64.rpm-bundle.tar
②按先后顺序安装,之间有依赖关系
[root@iZm5e3uhznq40do0w2g4qsZ software]# rpm -ivh mysql-community-common-8.0.26-1.el7.x86_64.rpm
[root@iZm5e3uhznq40do0w2g4qsZ software]# rpm -ivh mysql-community-client-plugins-8.0.26-1.el7.x86_64.rpm
[root@iZm5e3uhznq40do0w2g4qsZ software]# rpm -ivh mysql-community-libs-8.0.26-1.el7.x86_64.rpm
[root@iZm5e3uhznq40do0w2g4qsZ software]# rpm -ivh mysql-community-libs-compat-8.0.26-1.el7.x86_64.rpm
[root@iZm5e3uhznq40do0w2g4qsZ software]# rpm -ivh mysql-community-client-8.0.26-1.el7.x86_64.rpm
[root@iZm5e3uhznq40do0w2g4qsZ software]# rpm -qa | grep libaio
[root@iZm5e3uhznq40do0w2g4qsZ software]# yum -y install libaio
[root@iZm5e3uhznq40do0w2g4qsZ software]# rpm -ivh mysql-community-server-8.0.26-1.el7.x86_64.rpm
3.4.2 MySQL初步操作
①安装完之后进行初始化
[root@iZm5e3uhznq40do0w2g4qsZ software]# mysqld --initialize --console
②初始化之后,把mysql的安装目录的所有者和所属组都修改一下,以便敲击mysql时,让mysql软件用户有权限直接使用
[root@iZm5e3uhznq40do0w2g4qsZ software]# chown -R mysql:mysql /var/lib/mysql/
③启动服务
[root@iZm5e3uhznq40do0w2g4qsZ software]# systemctl start mysqld
④查看临时密码,并登录
[root@iZm5e3uhznq40do0w2g4qsZ software]# cat /var/log/mysqld.log | grep localhost
2022-09-26T13:25:37.666077Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: uAp!8Ir>q)s8
#使用密码'uAp!8Ir>q)s8'登录
[root@iZm5e3uhznq40do0w2g4qsZ software]# mysql -uroot -p
Enter password: uAp!8Ir>q)s8
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.26
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
⑤登陆之后修改临时密码
alter user 'root'@'localhost' identified by 'abc123';
⑥使用测试
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.26 |
+-----------+
1 row in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
3.4.3 设置MySQL
①设置访问授权
默认的root用户只能当前节点localhost访问,是无法远程访问的,我们还需要创建一个root账户,用户远程访问,并给root用户分配权限。重启mysql服务让其生效
mysql> create user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'abc123';
Query OK, 0 rows affected (0.01 sec)
mysql> grant all on *.* to 'root'@'%';
Query OK, 0 rows affected (0.01 sec)
重启mysql服务让其生效
systemctl restart mysqld
②使用SQLyog测试是否可以远程连接
3.4.4 在ECS中设置快照,保存进度,出错时可以回滚到当前进度
3.5 安装Redis
①安装gcc-c++
yum -y install gcc-c++
②解压redis压缩包
tar -zxvf redis-6.2.1.tar.gz
③编译并安装redis
[root@iZm5e3uhznq40do0w2g4qsZ redis-6.2.1]# vim src/Makefile
修改安装目录:PREFIX?=/usr/local/redis
编译:
[root@iZm5e3uhznq40do0w2g4qsZ redis-6.2.1]# make
安装:
[root@iZm5e3uhznq40do0w2g4qsZ redis-6.2.1]# make install
④复制并修改配置文件
[root@iZm5e3uhznq40do0w2g4qsZ redis-6.2.1]# cp /opt/software/redis-6.2.1/redis.conf /usr/local/redis/
[root@iZm5e3uhznq40do0w2g4qsZ redis-6.2.1]# vim /usr/local/redis/redis.conf
修改:
daemonize yes 是否可以后台访问
logfile "/var/redis/redis.log" 日志文件,需要手动创建
dir /usr/local/redis 工作目录
[root@iZm5e3uhznq40do0w2g4qsZ redis-6.2.1]# mkdir /var/redis
⑤测试:启动redis
启动redis:
[root@iZm5e3uhznq40do0w2g4qsZ redis-6.2.1]# /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
客户端登录:
[root@iZm5e3uhznq40do0w2g4qsZ redis-6.2.1]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379>
4. Maven打包
4.1 修改参数
①.MySQL连接信息
- 访问地址:localhost
- 用户名:root
- 密码:abc123
②.Redis连接信息
- 主机地址改成 127.0.0.1
③.支付接口涉及的被调用地址
- notify-url: http://47.104.212.211/pay/notify
- return-url: http://47.104.212.211/pay/return
④.跨微服务请求、重定向请求的主机地址
- 把 localhost:80 改成 47.104.212.211
4.2 工程打包
4.2.1 工程之间的关系
4.2.2 Maven 对于安装顺序的要求
- 依赖关系对安装顺序的要求
- A 依赖 B
- Maven 要求先安装 B,再安装 A
- 继承关系对安装顺序的要求
- A(子工程)继承 B(父工程)
- Maven 要求先安装 B,再安装 A
- 如果配置聚合,那么对聚合工程执行 install 命令,Maven 就会自动按照正确的顺序安装各个模块工程。但是我们现在 common-util 工程没有参与聚合,所以要先单独对 common-util 执行安装。
4.2.3 SpringBoot 工程打包
- 目标效果
- 通过运行 java -jar xxx.jar 命令直接启动 SpringBoot 微服务。此时要求这个 jar包中包含SpringBoot 内置的 Tomcat、SpringBoot 环境 jar 包以及其他依赖 jar 包。
- 实现效果的关键
- 在SpringBoot所在Maven工程的pom.xml文件中配置build标签使用SpringBoot指定的 Maven 插件进行打包。
<!-- Maven 构建过程相关配置 -->
<build>
<!-- 构建过程中所需要用到的插件 -->
<plugins>
<!-- 这个插件将 SpringBoot 应用打包成一个可执行的 jar 包 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
要想使用上面的配置必须让当前工程或父工程继承 SpringBoot。
<!-- 继承 SpringBoot 官方指定的父工程 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
如果在父工程中加入 build 配置,那么各个子工程就都不必加入 build。但是我们现在的情况是:有的子工程并不是 SpringBoot 微服务,所以哪个需要就给哪个加上。也就是下图所示的工程:
4.2.4 打包命令:mvn clean install -Dmaven.test.skip=true
表示先清理、再安装,跳过测试。注意:执行 Maven 命令一定要进入 pom.xml 所在的目录
4.2.5 启动命令
①.shangcouwang-admin.war 包需要放到 Tomcat 的 webapps 目录下,启动 Tomcat
[root@iZm5e3uhznq40do0w2g4qsZ ~]# mv shangcouwang-admin.war /opt/software/apache-tomcat-9.0.21/webapps/
[root@iZm5e3uhznq40do0w2g4qsZ ~]# /opt/software/apache-tomcat-9.0.21/bin/startup.sh
②.微服务
java -jar /opt/packages/shangcouwang02-member-eureka-0.0.1-SNAPSHOT.jar
java -jar /opt/packages/shangcouwang04-member-mysql-provider-0.0.1-SNAPSHOT.jar
java -jar /opt/packages/shangcouwang05-member-redis-provider-0.0.1-SNAPSHOT.jar
java -jar /opt/packages/shangcouwang06-member-authentication-consumer-0.0.1-SNAPSHOT.jar
java -jar /opt/packages/shangcouwang07-member-project-consumer-0.0.1-SNAPSHOT.jar
java -jar /opt/packages/shangcouwang08-member-order-consumer-0.0.1-SNAPSHOT.jar
java -jar /opt/packages/shangcouwang09-member-pay-consumer-0.0.1-SNAPSHOT.jar
java -jar /opt/packages/shangcouwang10-member-zuul-0.0.1-SNAPSHOT.jar
③.启动完成之后,使用浏览器访问47.104.212.211即可
5. 项目总结
5.1 后台管理系统
5.1.1 搭建环境
- 使用 Maven 作为构建管理和依赖管理工具
- 使用SpringMVC作为Web层框架,负责处理请求、接收请求参数、显示页面、请求的转发重定向
- 普通请求:返回响应体通常为一个页面
- Ajax 请求:返回响应体通常为一个 JSON 数据
- 使用 MyBatis 作为持久化层框架。
- 使用 MyBatis 的 PageHelper 插件实现数据的分页显示。
- Admin 数据(普通请求的方式处理)
- Role 数据(Ajax请求的方式处理)
- 使用 Spring 提供的容器管理项目中的组件
- XxxHandler
- XxxService
- XxxMapper
- XxxInterceptor
- XxxExceptionResolve
- 前端技术
- Boostrap 作为前端样式框架
- 使用 layer 作为弹层组件
- 使用 zTree 在页面上显示树形结构
- 借助 SpringMVC 提供的异常映射机制实现项目中错误消息的统一管理
- 基于注解
- 基于 XML
- 通过对请求消息头信息的判断在给出异常处理结果时实现了普通请求和 Ajax 请求的兼容
5.1.2 管理员登录
- MD5 密码加密
- 使用自定义拦截器检查登录状态
5.1.3 管理员维护
- 使用 MyBatis 的 PageHelper 插件实现分页
- 在页面上使用了 Pagination 实现数字页码
- 在数据库表中给 loginacct 字段添加唯一约束,在保存了重复的 loginacct 时触发异常,从而保证登录账号的唯一
5.1.4 角色维护:以 Ajax 交互方式实现数据的增删改查操作
5.1.5 菜单维护
- 使用 zTree 在页面上显示树形结构
- 并结合 zTree 提供的 API 显示自定义图标
- 对树形节点进行增删改查操作
5.1.6 RBAC 模型:Role Based Authentication Control,基于角色的权限控制
5.1.7 分配资源
- 给 Admin 分配 Role
- 给 Role 分配 Auth
5.1.8 权限控制
使用 SpringSecurity 接管项目的登录、登录检查、权限验证
※改源码:让 SpringSecurity 在初始化时不要查找 IOC 容器,而是在第一次请求时查找;查找的 IOC 容器也改成了查找 SpringMVC 的 IOC 容器(也就是由 DispatcherServlet的父类 FrameworkServlet 初始化的 IOC 容器)。
- 登录验证:将登录表单对接到 SpringSecurity
- 登录检查:SpringSecurity 内置
- 全局配置:在 SpringSecurity 配置类中设定
- 权限规则注解:@PreAuthority
- 页面标签:对页面局部进行权限限定,实现细粒度权限控制
5.2 前台会员系统
5.2.1 搭建环境
- SpringBoot+SpringCloud
- SpringBoot
- SpringSession
- Thymeleaf
- Redis
- MyBatis
- SpringCloud
- Eureka:注册中心
- Feign:远程接口的声明式调用
- Ribbon:客户端负载均衡
- Zuul:网关,ZuulFilter 过滤
- SpringBoot
5.2.2 用户登录、注册
- 调用第三方接口给用户手机发送短信验证码
- 使用 BCryptPasswordEncoder 实现带盐值的加密
- 使用 SpringSession 解决分布式环境下 Session 不一致问题
- 使用 Redis 作为 SpringSession 的 Session 库
- 在 Zuul 中使用 ZuulFilter 实现登录状态检查
- 在 Zuul 中配置访问各个具体微服务的路由规则
5.2.3 发布项目:使用阿里云 OSS 对象存储服务保存用户上传的图片
5.2.4 展示项目:将数据库中的项目数据查询出来到页面上显示
5.2.5 支持项目
- 确认回报信息
- 生成订单
- 进入支付流程:调用支付宝开放平台提供支付接口
5.2.6 部署发布
- 租赁阿里云 ECS 弹性服务器
- 安装应用程序
- JDK
- Tomcat
- MySQL
- Redis
- 修改项目的连接信息等参数
- 打包
- war 包
- jar 包
- 上传
- 启动