1 概述

1.1 背景介绍

电商平台是一种在线交易平台,它允许商家和消费者通过互联网进行商品或服务的买卖。电商平台提供了一个集中的市场,使卖家能够展示和销售他们的产品,同时也为买家提供了一个方便、快捷、安全的购物环境。华为云开发者空间是华为云为初级开发者打造的入门级开发技能训练平台,旨在培养开发者通过使用云主机提升开发者个人能力和技能。

1.2 适用对象

  • 企业
  • 个人开发者
  • 高校学生

1.3 案例时间

本案例总时长预计120分钟。

1.4 案例流程

ca78d7ce3cc9965bef91d985f526ba40.png{{{width="40%" height="auto"}}}

说明:

①下载电商代码到云主机(前端和后端);

②在云主机上配置基础环境,安装MySQL和Redis;

③配置JAVA环境,编译安装电商程序;

④安装和配置HaProxy实现高可用;

⑤验证电商的高可用特性。

1.5 资源总览

本次案例预计花费总计0.0元。

云资源 消耗费用 时长
云主机 2H4G 硬盘40G 免费 120分

2 基础环境配置

2.1 安装配置MySQL

MySQL是一款高性能关系数据库,电商平台使用MySQL做数据持久化存储。

  1. 安装MySQL、启动并查看服务状态。
sudo apt update
sudo apt install -y mysql-server

sudo systemctl start mysql
sudo systemctl status mysql

550adbb2eee91f9082ebaaf670723816.png

确认Active为running状态,即可按q退出查看页面。

  1. 登录mysql
sudo mysql -uroot
  1. 登录成功后,执行如下命令,修改默认的MySQL密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password;
alter user root@localhost identified with mysql_native_password by '1qaz2wsx';

说明:其中 1qaz2wsx 为配置的数据库密码,后面登录的时候需要使用。

4ecf50e6a62a50ca72acf813c27adf54.png

  1. 退出MySQL

命令行中输入quit,退出MySQL客户端。

quit
  1. 重新登录数据库,设置数据库访问权限
sudo mysql -h 127.0.0.1 -uroot -p

输入命令后回车,然后输入自己设置的密码,回车后登录成功。

登录成功完成MySQL安装。

  1. 退出MySQL

命令行中输入quit,退出MySQL客户端。

quit

2.2 安装Redis

Redis是一款高性能缓存组件,在Discuz论坛中提供数据缓存能力,提升论坛的响应速度,优化用户体验。

进入云主机后,在桌面鼠标右击,在菜单中点击 “在终端中打开”(不同的桌面版本可能打开方式不一样),打开命令行工具。

b4f48407d5ef1c688ee3ebfba45ee7ee.PNG

  1. 在命令行中输入命令安装redis。
sudo apt-get -y install redis-server
  1. 输入命令确认redis已经安装并且服务正在运行。
sudo systemctl status redis-server

293aab6ac0a0e16a34ea5bbce33e7295.PNG

确认Active为running状态,然后按q退出即可。

2.3 安装Nginx

  1. 登陆云主机
sudo apt update
sudo apt install -y nginx
  1. 修改nginx配置文件

备份原始文件。

sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

编辑新的配置文件。

sudo vim /etc/nginx/nginx.conf

文件内容如下:(按i开启编辑模式,文件内容复制到文件中后,按 :wq 保存并退出)

注意:以下文档内容需要根据实际情况修改。

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    # multi_accept on;
}


http {

upstream backend {
    server 127.0.0.1:8090;
}


    sendfile on;
    tcp_nopush on;
    types_hash_max_size 2048;
    # server_tokens off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;


    include /etc/nginx/conf.d/*.conf;
    server {
        listen 8080;
        server_name 127.0.0.1;

        location / {
        root /var/www/html;
        index index.html;
            break;
        }

        location /api {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        break;
        }

    }

server {
        listen 8081;
        server_name 127.0.0.1;

        location / {
        root /var/www/html-8081;
        index index.html;
            break;
        }

        location /api {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        break;
        }

    }

}

  1. 重启服务
sudo systemctl reload nginx

2.4 安装Java环境

  1. 卸载自带jdk17

执行下面命令:

sudo apt-get update
sudo apt purge -y openjdk-17-jdk openjdk-17-jdk-headless openjdk-17-jre openjdk-17-jre-headless
  1. 安装jdk8
sudo apt-get install -y openjdk-8-jdk
  1. 安装完成验证
java -version

如下图所示:

1493d4cacab05c7e8977bda546cac35a.PNG

3 安装电商程序

3.1 前端程序安装

  1. 登陆云主机,下载前端代码

    打开终端命令行

cd 
mkdir web
cd web/
git clone https://gitcode.com/CaseDeveloper/E-Commerce-Web.git
cd E-Commerce-Web
  1. node安装
# 安装 nvm (Node 版本管理器) -网络原因,此处可能需要多尝试几次
curl -o- https://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh | bash

# 下载并安装 Node.js(如执行失败,需要重启终端或者打开第二个终端)
nvm install 22

# 验证环境中是否存在正确的 Node.js 版本
node -v # 应该打印 `v22.12.0`

# 验证环境中是否存在正确的 npm 版本
npm -v # 应该打印 `10.9.0`

  1. 前端代码编译
cd /home/developer/web/E-Commerce-Web/
npm install
npm run build

编译成功后会生成结果文件,如下图:

1fa318e8ae9104946a3457b677a7b615.PNG

  1. 部署前端程序
sudo rm -f /var/www/html/*.html
cd dist
sudo cp -a * /var/www/html/
sudo mkdir -p /var/www/html-8081
sudo cp -a * /var/www/html-8081/
  1. 重启nginx服务
sudo systemctl reload nginx

验证端口,8080,8081端口正常运行。

sudo netstat -tlnp

3caec72ffb6ec5d07c5fc04769cb76f9.PNG

3.2 后端程序部署

  1. 登陆个人云主机
https://developer.huaweicloud.com/space/devportal/desktop

打开链接后,进入个人云主机页面。

941be799629190155643677cea030252.PNG

  1. 拉取后端程序代码修改参数配置

打开CodeArts IDE for Java。

96b904efefa7221e22f65b08946234b6.PNG

0efdb3de4d5da1d6a8c6299c9b32f2f4.PNG

参数如下:

URL:https://gitcode.com/CaseDeveloper/E-Commerce-Java.git
Directory: /home/developer/demo/E-Commerce-Java

921f49abde29b71f9c52ee1549f2a0b3.PNG

修改配置文件。

98f2528c60928875a988fcff903e395b.PNG

配置文件具体修改为:

参数名 例子
spring.datasource.url jdbc:mysql://localhost:3306/e_demo_project?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.username root
spring.datasource.password 1qaz2wsx
spring.redis.host 127.0.0.1
server.port 8090
  1. 编译程序

c36a12cd11d3aa9fd7c254208da3a2bc.PNG

然后在IDE的终端中执行命令。

左侧选择 maven->Lifecycle->install 后双击执行

54911b8491f81abb44749597a06f4bb8.PNG

执行结果如下:

d9dc056fe9e52b25564d521e77d5d184.PNG

出现BUILD SUCCESS 说明编译成功。

  1. 执行SQL脚本

打开云主机命令行终端

8b50ed5eddd75cfd65f0a37745026b36.PNG

终端中输入登陆mysql命令

mysql -uroot -p

回车后输入密码:1qaz2wsx(2.1中自定义密码)

86d40ac9348378804f34a6d2fda342ec.PNG

登陆成功。

7fece437039bd4c262f5ab6841b8f132.PNG

执行如下命令:

CREATE DATABASE e_demo_project;
use e_demo_project;
source /home/developer/demo/E-Commerce-Java/db_init_test.sql;
show tables;

生成表如下:

ea6069cf39ec897c59d9ed361ae20a48.PNG

数据初始化完成。

输入quit命令,退出MySQL命令行

quit

执行脚本结束。

  1. 后端程序启动

服务器上执行如下命令:

cp /home/developer/demo/E-Commerce-Java/target/E-Commerce-Java-1.0-SNAPSHOT.jar /home/developer/demo/
cd /home/developer/demo/ 
nohup java -jar E-Commerce-Java-1.0-SNAPSHOT.jar > output.log 2>&1 &

后端程序完成启动。

  1. 环境验证

检查端口:

sudo netstat -tlnp \|grep 8090

确认8090端口已启动。

4 高可用配置

4.1 HaProxy安装

HAProxy是一款具备高并发、高性能的TCPHTTP负载均衡器‌。它能够支持万级以上的并发连接,适用于各种规模的网站和应用程序。HAProxy的主要功能包括负载均衡、会话保持、自动故障切换以及基于正则表达式的路由决策等。‌

  1. 执行安装命令:
sudo apt-get -y install haproxy
  1. 配置文件备份:
sudo mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg1
  1. 创建新的配置文件
sudo vim /etc/haproxy/haproxy.cfg

配置文件内容如下,复制内容到上面的文件中。

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

    # Default SSL material locations
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private

    # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
    log global
    mode    http
    option  httplog
    option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http
    balance source

frontend http-in
    bind *:80
    default_backend servers

backend servers
    mode http
    option redispatch
    option abortonclose
    balance source
    option httpchk GET /index.html 
    server server1 127.0.0.1:8080 weight 6 check inter 2000 rise 2 fall 3
    server server2 127.0.0.1:8081 weight 6 check inter 2000 rise 2 fall 3

复制完成后按 Esc ,输入 :wq 保存退出

b48e3c0f02520baff64d4da6602653a0.PNG

  1. 启动haproxy
sudo systemctl restart haproxy
  1. 检查服务启动状态
sudo systemctl status haproxy

服务运行正常,确定服务为running状态,按q键退出查看。

5b02568710d32d6e3d5666835c668fa9.PNG

  1. 验证访问,浏览器中输入访问地址
http://127.0.0.1/

访问结果如下:

947ec4964649ad9cc0d3b5aa1f96c6bf.PNG

4.2 验证高可用特性

要验证服务的高可用性,需要分2步走:

  1. 验证后端单独8080端口的可用性,此时8081端口关闭
  2. 验证后端单独8081端口的可用性,此时8080端口关闭
4.2.1 关闭8081端口,验证8080端口可用性
  1. 停止8081端口,在终端中执行下面命令

备份conf文件

sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.8080

复制下面代码内容到配置文件

sudo vim /etc/nginx/nginx.conf

按i开启编辑模式,复制下面内容到终端,然后按Esc键退出编辑模式,按 :wq 退出并保存

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    # multi_accept on;
}


http {

upstream backend {
    server 127.0.0.1:8090;
}


    sendfile on;
    tcp_nopush on;
    types_hash_max_size 2048;
    # server_tokens off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;


    include /etc/nginx/conf.d/*.conf;
    server {
        listen 8080;
        server_name 127.0.0.1;

        location / {
        root /var/www/html;
        index index.html;
            break;
        }

        location /api {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        break;
        }
    }
}

修改完成后,按Esc 退出编辑模式,再按 :wq 保存 退出。

重启nginx服务

sudo systemctl reload nginx
  1. 访问80端口,效果如下:

浏览器打开下面地址

http://127.0.0.1

947ec4964649ad9cc0d3b5aa1f96c6bf.PNG

以上情况说明在8080,集群可以正常访问。

4.2.2 关闭8080端口监听,启用8081端口
  1. 停止8080端口,在终端中执行下面命令

备份conf文件

sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.8081

复制下面代码内容到配置文件

sudo vim /etc/nginx/nginx.conf

按i开启编辑模式,复制下面内容到终端,然后按Esc键退出编辑模式,按 :wq 退出并保存。

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    # multi_accept on;
}


http {

upstream backend {
    server 127.0.0.1:8090;
}


    sendfile on;
    tcp_nopush on;
    types_hash_max_size 2048;
    # server_tokens off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    include /etc/nginx/conf.d/*.conf;
server {
        listen 8081;
        server_name 127.0.0.1;

        location / {
        root /var/www/html-8081;
        index index.html;
            break;
        }

        location /api {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        break;
        }

    }

}

修改完成后,按Esc 退出编辑模式,再按 :wq 保存 退出。

重启nginx服务。

sudo systemctl reload nginx
  1. 访问80端口,效果如下:

浏览器打开下面地址

http://127.0.0.1

947ec4964649ad9cc0d3b5aa1f96c6bf.PNG

以上情况说明在端口8081,集群可以正常访问。

案例验证完成。

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐