业务云化过程中,Web类应用通常是上云第一步。在此过程中,IT从业者们往往会遇到一个问题,如何将Web应用通过云服务解决方案进行部署与托管?此时,您需要一个合适的架构,实现Web应用在云上的正确部署和长期演进。本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。本实验从企业级应用的稳定性架构出发,模拟了在线业务可能遇到机器宕机、单节点故障等场景,通过高可用架构成功避免了单点故障风险,保障了业务稳定性和服务永续。
场景简介
业务云化过程中,Web类应用通常是上云第一步。在此过程中,IT从业者们往往会遇到一个问题,如何将Web应用通过云服务解决方案进行部署与托管?此时,您需要一个合适的架构,实现Web应用在云上的正确部署和长期演进。本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。本实验从企业级应用的稳定性架构出发,模拟了在线业务可能遇到机器宕机、单节点故障等场景,通过高可用架构成功避免了单点故障风险,保障了业务稳定性和服务永续。
实验架构介绍

本次实验,基于阿里云“高可用、稳定性”的企业级方案架构进行实践。同时,本实验使用了开源项目代码(若依框架-前后端不分离版),成功在此架构上构建了一个用户权限管理系统的网站应用。部署成功后,模拟企业业务中单机故障场景(如一台服务器宕机),此时高可用服务架构保障业务系统仍可正常访问,保障了企业服务的高可用性与稳定性。
方案部署:
方案说明:
架构中重点强调了VPC内架构的搭建,强调内容有:
强调高可用:突出2个可用区,要求资源部署在2个可用区,实现可用区级别的容灾。
强调VPC内的地址规划,首先是Public subnet,作为与公网交互的统一界面(类似于DMZ区的概念)。
负载均衡,作为外部用户访问业务系统的统一公网入口。所有用户访问web业务时,访问流都是通过DNS解析至ALB,ALB会通过监听规则,将流量分发至后端服务器组内的多台ECS。同时,负载均衡是本架构的核心,当一台服务器宕机时,负载均衡会通过健康检查,自动检测到宕机服务器,同时将流量转发至正常状态服务器,保障业务可以正常访问,实现高可用和服务永续。
NAT网关,作为VPC内ECS访问外网的统一公网出口。ECS访问公网(如download数据包、调用外网API服务)时,避免通过每台ECS绑定一个IP进行分别访问,这样会导致互联网暴露面安全性和地址管理复杂性。此时,通过NAT向VPC内ECS提供SNAT服务,所有ECS访问公网都通过NAT统一进行公网访问,可以有效收敛互联网暴露面、统一进行地址和流量管理等。
VPC还有三层subnet,分别是Web subnet、Application subnet、Database subnet。
软件开发里最经典的三层架构,就是把整个软件系统分为三个层次,分别是表示层(UI)、业务逻辑层(Business Logic Layer)、数据持久层(Data access layer),三层架构的好处有很多,比如实现高内聚、低耦合、方便团队分工。其实三层架构有一个最直白的解释,比如前端、后端、数据库,也就对应了咱们架构中的Web subnet(前端)、Application subnet(后端)、Database subnet(数据层) 。
本文中采用了前后端融合的框架,所以Web subnet(前端)+Application subnet(后端)都部署到同一层ECS中。当网站系统规模比较庞大时,往往会进行前后端分离,我们会在其他实验中讲解前后端分离版业务架构的部署教程,本实验关注中小企业业务初期前后端不分离版的架构部署。
2台云服务器ECS会预先安装前后端代码运行所需的环境(Node、JDK、Maven),然后再部署运行开源若依代码(前后端不分离版),实现项目运行启动。
2台ECS内部署若依网站代码项目时,所需访问的数据内容,统一通过数据库连接文件配置,关联至阿里云数据库RDS,数据的存储和调用统一通过RDS提供服务,使得2台服务器项目运行时,始终可以保障数据一致性。
创建实验资源
云起实践平台将在您的账号下开通本次实操资源,资源按量付费,需要您自行承担本次实操的云资源费用。
进入实操前,请确保您已通过实名认证且账户余额大于100元
云资源产生的费用需您自行承担,云起实践平台不会向您征收额外费用
所有实验操作将保留至您的账号,请谨慎操作
实操结束后,您可以选择继续付费保留资源,否则资源将自动释放
注意:本次开通可能会影响您的试用权益,请前往开发者试用中心了解具体权益。
本次实操中,建议您先领取应用型负载均衡ALB、公网NAT网关的免费试用权益。
点击右侧“开始实操”,开始创建本次实操资源。开始实操前需先同意服务协议并授权云起实践平台创建、读取及释放实操相关资源权限。
创建资源需要10分钟左右的时间,请您耐心等待。
开通云数据传输CDT
说明:CDT免费赠送200 GB/月公网流量,其中20 GB/月可用于全球地域(含中国内地),180 GB/月仅限非中国内地地域使用。关于CDT的计费详情请参见计费概述。
登录云数据传输CDT控制台。
在公网和跨地域服务页签的开通CDT区域,开通公网服务。开通成功后,或您是CDT老用户,可以在页面上看到公网已开通。

在云产品升级至CDT计费区域,找到云服务器ECS和弹性公网IP,分别单击其右侧操作列下的去升级。
说明:云服务器ECS和弹性公网IP都需要升级至CDT计费,如果已升级,您可跳过此步骤。

配置ALB,创建服务器组和监听
查看创建的服务器组
1.1 系统已为您创建ALB并配置了服务器组。点击左侧“云产品资源”页签,可以看到系统已经创建的ALB实例。点击管理进入应用型负载均衡ALB控制台。

在左侧导航栏,选择应用型负载均衡ALB > 服务器组。可以看到系统已经创建好的服务器组。服务器组的VPC与云服务器ECS的VPC相同,后端协议为HTTP。

点击编辑基本信息,点击高级配置,“会话保持”应为打开状态。

1.2 点击“编辑后端服务器”,查看已经添加好的两台后端服务器。两台后端服务器的端口为80。

创建监听。
2.1 点击左侧“云产品资源”页签,找到ALB实例,点击管理进入应用型负载均衡ALB控制台。进入监听页签,点击创建监听。

在配置监听配置向导,选择监听协议为HTTP,监听端口为80。在高级配置区域,点击修改,将连接请求超时时间改为15秒。单击下一步。

在选择服务器组配置向导,选择服务器组,查看后端服务器信息,然后单击下一步。

在配置审核配置向导,确认配置信息,然后单击提交。

返回如下页面,表示监听已创建成功。

验证NAT为第一台云服务器ECS提供访问公网的能力
云服务器ECS需要主动访问公网,进行若依项目的源码下载。在VPC内多个云服务器ECS独立公网,会增加互联网暴露面、不利于公网地址管理。所以,对VPC内云服务器ECS访问公网时,通过NAT进行统一公网出口,通过SNAT功能对VPC内的ECS提供访问公网能力,后续可以通过wget的方式下载若依源码。
重置ECS实例密码。点击左侧“云产品资源”页签,找到系统创建的第一台云服务器ECS(ecs-01),点击管理,进入实例管理页面。点击重置密码。输入新的登录密码,选择在线重置,点击确认。

登录ECS。在左侧“云产品资源”页签,找到系统创建的第一台云服务器ECS(ecs-01),点击远程连接,进入ECS Terminal页面,输入刚刚设置的密码登录ECS。
执行如下命令,验证ECS是否能访问公网。
返回如下结果,您可以看到ECS在没有绑定在EIP的情况下,可以通过NAT访问公网(ECS和NAT需要在同一VPC下)。
说明:按Ctrl+C键可以退出命令。

在第一台云服务器ECS上准备搭建项目运行环境
RuoYi是一个后台管理系统,基于经典技术组合(Spring Boot、Apache Shiro、MyBatis、Thymeleaf)主要目的让开发者注重专注业务,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。搭建若依要求系统环境:JDK >= 1.8、Maven >= 3.0、Node版本建议使用v14。
方案一:通过云助手命令快速安装依赖环境。
依赖环境安装
点击左侧“云产品资源”页签,找到系统创建的第一台云服务器ECS(ecs-01),点击管理,进入实例管理页面。点击左侧菜单中的云助手。
点击右上角创建/执行命令,复制下述命令内容,将超时时间增加到600秒以上。选择要执行命令的实例,点击执行。
重要
整体下载安装环境时间较长,需要将超时时间增加到600秒以上,以免任务超时中断。


#安装JDK
yum install -y java-1.8.0-openjdk-devel.x86_64
echo -e "export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-2.0.1.1.al8.x86_64/" >> /etc/profile
echo -e "export PATH=\$PATH:\$JAVA_HOME/bin" >> /etc/profile
source /etc/profile
#安装Maven环境
wget https://mirrors.aliyun.com/apache/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
tar -xzvf apache-maven-3.8.8-bin.tar.gz
mv apache-maven-3.8.8 /usr/share/maven
mkdir /usr/share/maven/repository
sed -i '55i\ <localRepository>/usr/share/maven/repository</localRepository>' /usr/share/maven/conf/settings.xml
sed -i '160i\ <!-- ' /usr/share/maven/conf/settings.xml
sed -i '168i\ -->' /usr/share/maven/conf/settings.xml
sed -i '169i\ <mirror>\
<id>alimaven</id>\
<name>aliyun maven</name>\
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>\
<mirrorOf>central</mirrorOf>\
</mirror>' /usr/share/maven/conf/settings.xml
echo -e "MAVEN_HOME=/usr/share/maven/" >> /etc/profile
echo -e "PATH=\$MAVEN_HOME/bin:\$PATH" >> /etc/profile
echo -e "export MAVEN_HOME PATH" >> /etc/profile
source /etc/profile
#安装Node环境
wget https://nodejs.org/dist/v14.2.0/node-v14.2.0-linux-x64.tar.gz
mkdir /usr/local/node
tar -zxvf node-v14.2.0-linux-x64.tar.gz -C /usr/local/node
ln -s /usr/local/node/node-v14.2.0-linux-x64/bin/node /usr/local/bin/node
ln -s /usr/local/node/node-v14.2.0-linux-x64/bin/npm /usr/local/bin/npm
echo -e "export NODE_HOME=/usr/local/node/node-v14.2.0-linux-x64/bin/" >> /etc/profile
echo -e "export PATH=\$PATH:\$NODE_HOME:/usr/local/bin/" >> /etc/profile
source /etc/profile
验证安装是否成功
在左侧“云产品资源”页签,找到系统创建的第一台云服务器ECS(ecs-01),点击远程连接,进入ECS Terminal页面,输入刚刚设置的密码登录ECS。
2.1 执行如下命令,查看JDK版本,检查JDK安装是否成功。

2.2 执行如下命令,查看maven版本,检查maven是否安装成功。

2.3 执行如下命令,检查node版本和npm版本。

方案二:手动安装JDK、Maven和Node环境。
安装JDK环境。
在第一台云服务器ECS系统内安装JDK环境。
1.1 执行如下命令,安装JDK。
yum install -y java-1.8.0-openjdk-devel.x86_64
1.2 执行如下命令,查看/usr/lib/jvm目录下是否已安装JDK。
说明:JDK默认安装目录在/usr/lib/jvm,

1.3 配置java环境变量。
1.3.1 执行如下命令,编辑/etc/profile文件。
1.3.2 按i键进入编辑模式,在文件的末尾加上以下代码。注意:等号两边不要有空格。
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-2.0.1.1.al8.x86_64/
export PATH=$PATH:$JAVA_HOME/bin

1.3.3 按ECS键退出编辑模式,输入:wq并回车,退出文件并保存。
1.4 执行如下命令,刷新配置文件以生效。
1.5 执行如下命令,查看JDK版本,检查JDK安装是否成功。

安装Maven环境。
在第一台云服务器ECS系统内安装Maven环境。
2.1 执行如下命令,下载maven
wget https://mirrors.aliyun.com/apache/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
2.2 解压maven并移动到指定目录/usr/share/maven。
tar -xzvf apache-maven-3.8.8-bin.tar.gz
mv apache-maven-3.8.8 /usr/share/maven
查看maven是否解压并移动成功

2.3 执行如下命令,在maven安装目录下创建maven仓库文件夹
mkdir /usr/share/maven/repository
2.4 执行如下命令,进入/usr/share/maven/conf/目录,编辑settings.xml文件。
vim /usr/share/maven/conf/settings.xml
2.5 按i键进入编辑模式,找到 <localRepository> 标签对,将其从注释 !-- xx -- 中移除,然后修改 <localRepository> 标签对,将本地仓库路径修改为/usr/share/maven/repository。
修改前:

修改后:

2.6 在 <mirrors> 标签对中删除如下内容

添加 <mirror> 标签对,指向阿里云国内maven镜像仓库,提供java下载所需依赖项。
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>

2.7 按ECS键退出编辑模式,输入:wq并回车,退出文件并保存。
2.8 配置maven环境变量。
2.8.1 执行如下命令,编辑/etc/profile文件。
2.8.2 按i键进入编辑模式,在/etc/profile文件的末尾加上以下代码。
MAVEN_HOME=/usr/share/maven/
PATH=$MAVEN_HOME/bin:$PATH
export MAVEN_HOME PATH

2.8.3 按ECS键退出编辑模式,输入:wq并回车,退出文件并保存。
2.9 执行如下命令,刷新配置文件。
2.10 执行如下命令,查看maven版本,检查maven是否安装成功。

安装Node环境。
在第一台云服务器ECS系统内安装Node环境。
3.1 执行如下命令,安装Node。
wget https://nodejs.org/dist/v14.2.0/node-v14.2.0-linux-x64.tar.gz

3.2 执行如下命令,创建node安装文件夹。
3.3 执行如下命令,解压node.js到文件夹。
tar -zxvf node-v14.2.0-linux-x64.tar.gz -C /usr/local/node
3.4 执行如下命令,查看文件夹中是否有解压后的node文件。

3.5 执行如下命令,创建软链接,使在任何路径下都可以执行node。
ln -s /usr/local/node/node-v14.2.0-linux-x64/bin/node /usr/local/bin/node
ln -s /usr/local/node/node-v14.2.0-linux-x64/bin/npm /usr/local/bin/npm
3.6 配置node环境变量。
3.6.1 执行如下命令,编辑/etc/profile文件。
3.6.2 按i键进入编辑模式,在/etc/profile文件的末尾加上以下代码。
export NODE_HOME=/usr/local/node/node-v14.2.0-linux-x64/bin/
export PATH=$PATH:$NODE_HOME:/usr/local/bin/

3.6.3 按ECS键退出编辑模式,输入:wq并回车,退出文件并保存。
3.7 执行如下命令,刷新配置文件。
3.8 执行如下命令,检查node版本和npm版本。

在第一台云服务器ECS下载若依框架源码并进行配置修改,最终成功运行项目
在云数据库RDS上创建若依项目所需的数据库和数据库账号,并获取数据库内网地址。
1.1 点击左侧“云产品资源”面板,在创建好的RDS MySQL资源处点击“管理”,进入RDS控制台实例管理页面。
1.2 在左侧导航栏进入账号管理页面,点击页面中的创建账号。
1.3 设置数据库账号、新密码和确认密码,账号类型选择高权限账号,单击确定。

1.4 在左侧导航栏进入数据库管理页面,点击页面中的创建数据库。
1.5 在创建数据库面板,数据库(DB)名称输入ry,需要与数据库连接池文件中数据库名称ry保持一致,支持字符集选择utf8,单击确定。

1.6 在左侧导航栏进入白名单与安全组页面,在白名单设置页签,单击添加白名单分组。单击加载ECS内网IP。

1.7 在添加白名单分组面板,自定义分组名称,在未设置区域中选中两台ECS实例,单击
图标,设置区域出现两台ECS实例后,单击确定。

安装Git
在第一台云服务器ECS系统内安装git,用于下载若依源码。
2.1 远程连接ECS,执行如下命令,安装git。
2.2 执行如下命令,验证是否安装成功。

通过git下载若依开源项目源码(前后端不分离版)至ECS。
3.1 执行如下命令,下载若依源码。
git clone https://gitee.com/y_project/RuoYi.git
说明:若依源码下载命令,您可前往若依官网,参考如下截图获取。


3.2 执行如下命令,查看若依代码是否成功下载至/root/RuoYi文件夹内。

关于若依源码中的数据库连接池文件说明。
4.1 下载完成后,若依项目代码包含以下文件。

4.2 执行如下命令,找到数据库连接池文件application-druid.yml。
ls /root/RuoYi/ruoyi-admin/src/main/resources/

4.3 执行如下命令,查看数据库连接池文件application-druid.yml。
cat /root/RuoYi/ruoyi-admin/src/main/resources/application-druid.yml
说明:localhost位置代表数据库地址IP/URL,3306端口号,ry是数据库名称,username/password是数据库用户名和密码。按Ctrl+C退出。

修改若依源码中的数据库连接池文件。
5.1 执行如下命令,编辑数据库连接池文件application-druid.yml。
vim /root/RuoYi/ruoyi-admin/src/main/resources/application-druid.yml
5.2 按i键进入编辑模式,将文件内的localhost修改为RDS内网地址,将username和password改为您创建的数据库账号和密码,确认文件内的数据库名称ry与RDS中创建的数据库名称一致。
说明:在左侧“云产品资源”面板可以查看本次实操开通的RDS的内网地址。您也可以进入RDS控制台,在数据库连接页面,获取数据库内网地址。
注意:yaml文件对格式有严格要求,不要引入额外空格
5.3 按ECS键退出编辑模式,输入:wq并回车,退出文件并保存。
导入若依项目数据库文件。
参照若依开源项目代码中数据库文件,将若依项目的数据文件,通过执行sql的方式导入至阿里云数据库RDS。
6.1 打开左侧“云产品资源”面板,找到RDS MySQL,点击登录,在打开的DMS窗口输入数据库账号和数据库密码,管控模式选择自由操作,单击登录。

6.2 在左侧数据库实例区域,选择已登录实例>您的RDS实例,双击ry数据库。

返回如下页面,您已登录ry数据库,现在就可以将sql语句复制到SQL Console中执行了。

6.3 前往若依开源项目代码中数据库文件,单击sql文件,您可看到quartz.sql和ry_20240112.sql文件。


6.4 在sql文件中,单击quartz.sql文件,复制sql语句,然后单击一键复制。


6.6 将复制后的quartz.sql文件中的sql语句粘贴至SQL Console中,然后删除sql代码最后一行commit;,最后单击执行。
说明:本教程使用DMS导入sql代码时,不支持commit事务,复制的sql代码最后一行"commit;"需要删除,再单击执行。

返回如下结果,表示SQL执行成功。

6.7 在sql文件内,单击ry_20240112.sql,复制sql语句,然后单击一键复制。


6.9 新建一个SQL Console标签页,将复制后的ry_20240112.sql文件中的sql语句粘贴至SQL Console中,单击执行。

返回如下结果,表示SQL执行成功。

编译打包若依项目,并运行若依代码完成项目上线。
7.1 返回至Terminal页签,执行如下命令,进入RuoYi文件夹。
7.2 执行如下命令,将文件夹内文件,编译打包成jar包。
mvn clean package -Dmaven.test.skip=true
查看打包后的jar包地址,在ruoyi-admin/target目录下会有一个ruoyi-admin.jar的jar包。

7.3 执行如下命令,运行jar包,成功启动若依框架程序
nohup java -jar ruoyi-admin/target/ruoyi-admin.jar > output.log 2>&1 &
命令解释:
nohup:确保程序在用户退出后仍继续运行。
java -jar ruoyi-admin/target/ruoyi-admin.jar:执行jar文件中的主类。
> output.log:将标准输出重定向到名为的文件中,用于保存程序运行时的输出信息。
2>&1:将标准错误输出重定向至标准输出,即也写入到output.log文件中。
&:使命令在后台运行。
7.4 执行如下命令,确认若依处于后台运行。

7.5 执行如下命令,查看运行成功的日志。
说明:运行jar包后,请等待1分钟,再查看日志。

在第二台云服务器ECS上部署代码环境和启动项目程序
登录在第二台云服务器ECS,重复上述的6、7章节,在第二台云服务器ECS中同样部署代码环境和启动项目程序。
重置ECS实例密码。点击左侧“云产品资源”页签,找到系统创建的第二台云服务器ECS(ecs-02),点击管理,进入实例管理页面。点击重置密码。输入新的登录密码,选择在线重置,点击确认。

登录ECS。在左侧“云产品资源”页签,找到系统创建的第二台云服务器ECS(ecs-02),点击远程连接,进入ECS Terminal页面,输入刚刚设置的密码登录ECS。
重复上述的6、7章节,在第二台云服务器ECS中同样部署代码环境和启动项目程序。
说明:不需要重复操作将若依项目数据库文件导入阿里云RDS数据库中的操作。
测试若依项目以及高可用
通过ALB公网DNS名称,测试若依项目是否部署成功,并测试高可用架构。
测试若依项目是否部署成功。
1.1 点击左侧“云产品资源”页签,找到ALB实例,点击管理进入应用型负载均衡ALB控制台。在实例详情页面,找到您的ALB实例的DNS名称,点击复制。

1.2在您的本机浏览器地址栏中,输入ALB实例的DNS名称,即可访问到后端ECS上部署的若依项目。

1.3 在登录页面,输入验证码,单击登录。

返回如下页面,您已成功访问若依系统。

验证高可用。
2.1 前往云服务器ECS控制台,在左侧导航栏,选择实例与镜像>实例。在实例页面,选择任意一台云服务器ECS,单击右侧操作列下的停止。在停止实例对话框中,单击确定。


2.2 返回若依系统页面,刷新页面,您可以发现依然能访问到若依系统,验证了整个实验及系统的高可用性。

资源释放与保留
如您实操结束后,希望保留本次实操资源和数据,可以在操作过程中或结束时选择“付费保留资源”,保留资源后续将产生一定的资费,需要您自行支付。若您希望实操结束后释放资源,请选择“不保留资源/释放资源”,则实操结束后系统会自动释放资源。