项目架构概览
你的项目是一个Spring Boot微服务商城系统:
- 前端: Vue 3 + Vite + Element Plus
- 后端: 4个微服务
goods_service(8090端口) – 商品服务admin_service(8091端口) – 管理员服务user_service(8092端口) – 用户服务order_service(8093端口) – 订单服务- 数据库: MySQL 8.0
- 缓存: Redis
- 注册中心: Zookeeper (Dubbo)
- Java版本: 17
┌────────────────┬────────────────────┬──────────────────────────┬─────────────────────────────┐ │ │ 127.0.0.1 │ 内网 IP(如 172.16.x.x) │ 外网 IP(如 114.55.106.49) │ ├────────────────┼────────────────────┼──────────────────────────┼─────────────────────────────┤ │ 范围 │ 仅本机 │ 同一局域网 │ 全球互联网 │ ├────────────────┼────────────────────┼──────────────────────────┼─────────────────────────────┤ │ 走网卡 │ 不走,内核直接回环 │ 走内网网卡 │ 走公网路由 │ ├────────────────┼────────────────────┼──────────────────────────┼─────────────────────────────┤ │ 速度 │ 最快 │ 快 │ 取决于带宽 │ ├────────────────┼────────────────────┼──────────────────────────┼─────────────────────────────┤ │ 需要防火墙放行 │ 不需要 │ 不需要(内网) │ 需要 │ ├────────────────┼────────────────────┼──────────────────────────┼─────────────────────────────┤ │ 暴露风险 │ 无 │ 只在局域网可见 │ 全网可见 │ └───
用场景
127.0.0.1 — 本机内部通信 数据库连接 jdbc:mysql://127.0.0.1:3306 Java → MySQL(同机) Redis 连接 redis.host: localhost Java → Redis(同机) Nginx 代理 proxy_pass http://127.0.0.1:8090 Nginx → Java(同机) Zookeeper zookeeper://127.0.0.1:2181 Java → ZK(同机) 只有部署在同一台机器上的服务之间才用。
内网 IP — 跨机器、同机房 两台服务器之间 172.16.0.1 → 172.16.0.2 走机房内网交换机 微服务拆分 订单服务 → 商品服务(不同机器) 数据库主从复制 Master → Slave(内网同步) 速度快、不消耗公网带宽、安全,是分布式部署时的首选。
外网 IP — 对外提供服务 用户访问前端 浏览器 → 114.55.106.49:80 第三方 API 回调 支付宝支付结果通知 前端 .env VITE_SERVER_ADDR=http://114.55.106.49 只有需要被外部访问的才暴露外网 IP。
一句话
你的项目目前所有服务都在一台机器,所以数据库 / Redis / ZK / Nginx upstream 全用 127.0.0.1;前端通过 114.55.106.49 访问是因为用户在浏览器端,必须走公网。
宝塔部署完整步骤
一、环境准备
服务器要求
- 系统: CentOS 7.x 或 Ubuntu 18.04+
- 内存: 至少4GB (推荐8GB)
- CPU: 至少2核
- 硬盘: 至少20GB
二、测试环境转变为生产环境 修改mysql的数据库名称和用户名那个以及密码,特别注意宝塔上的数据库版本要大于测试的版本 修改redis的密码 修改图片存储位置 注意后端/问题 修改zookeeper的网关要使用本地的网关 修改前端头地址为服务器公网ip VITE_SERVER_ADDR=http://114.55.106.49
因为三个 Java 服务(goods_service、order_service、admin_service)之间用 Dubbo RPC 互相调用,Dubbo 需要 Zookeeper 作为注册中心来发现彼此。
Zookeeper 的作用:
- 各服务启动时向 Zookeeper 注册自己(IP + 端口)
- 调用方通过 Zookeeper 发现被调用方的地址
- 服务挂了 Zookeeper 会自动剔除,服务恢复了再加回来
127.0.0.1 是因为 Zookeeper 就和 Java 服务部署在同一台服务器上,本地调用不需要走外网。
修改前端 index.js 将history变为hash模式
import {createRouter, createWebHistory} from 'vue-router'
变为
import {createRouter, createWebHashHistory} from 'vue-router'
history 模式改为 hash 模式的作用是避免页面刷新时前端路由请求被 Nginx 误转发到后端。
具体原理:
┌──────────────────────────────┬───────────────────────────────────────────────────────────────┬────────────────────────────────────────────────────────────┐ │ │ history 模式 │ hash 模式 │ ├──────────────────────────────┼───────────────────────────────────────────────────────────────┼────────────────────────────────────────────────────────────┤ │ URL 示例 │ http://114.55.106.49/user/index │ http://114.55.106.49/#/user/index │ ├──────────────────────────────┼───────────────────────────────────────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 浏览器刷新时发到服务器的请求 │ /user/index │ /(# 后面的不发送) │ ├──────────────────────────────┼───────────────────────────────────────────────────────────────┼────────────────────────────────────────────────────────────┤ │ Nginx 匹配 │ /user 命中 location /user 规则 → 转发到后端 8092 → 报令牌无效 │ 命中 location / → 返回 index.html → Vue Router 接管渲染 ✅ │ └──────────────────────────────┴───────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────┘
一句话: hash 模式下,# 后面的路径根本不会发给服务器,所以 Nginx 不会误判,所有页面路由都由前端自己处理,和 Nginx 配置解耦,刷新不报错
三种解决方案,按推荐程度排序: 方案一:路径分离(推荐) 前后端用不同的 URL 前缀,比如 /manage/ 给前端页面,/admin/ 给后端 API。干净优雅,URL 好看,但需要改前端路由和跳转逻辑。适合新项目或能改路径的场景。 方案二:hash 模式 Vue Router 改用 createWebHashHistory,URL 变成 /#/admin/login。# 之后的内容浏览器不发给服务器,所以刷新时请求永远是 /,Nginx 不会误转发。改一行代码,零配置,最省事。缺点是 URL 多了个 #。
方案三:Nginx try_files 不改前端代码,在 Nginx 中配置 try_files 让 Nginx 先检查前端目录是否有对应文件,找不到才转发后端。灵活但依赖 Nginx 配置,每个 location 都要写,容易遗漏。—
四、安装Zookeeper
1.先要安装docker ,宝塔上的Zookeeper插件不能够使用 2.在docer界面下载zookeeper,配置好镜像 网络名选择baota_net 自动调配网络 3.打包前端和后端 前端指令 npm install 之后 npm run build 后端指令 mvn clean package -DskipTests 跳过单元测试 4.vue前端直接部署php项目,php版本纯净态,配置好数据库 5.反向代理直接在前端项目中配置类如
server
{
listen 80;
server_name 114.55.106.51 114.55.106.49;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/mall.dxkua.cn;
include /www/server/panel/vhost/nginx/well-known/114.55.106.49.conf;
include /www/server/panel/vhost/nginx/extension/114.55.106.49/*.conf;
error_page 404 /404.html;
#==================== 接口代理开始 ====================
location ^~ /admin {
proxy_pass http://127.0.0.1:8091;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /category {
proxy_pass http://127.0.0.1:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /goods {
proxy_pass http://127.0.0.1:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /user {
proxy_pass http://127.0.0.1:8092;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /collect {
proxy_pass http://127.0.0.1:8092;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /cart {
proxy_pass http://127.0.0.1:8093;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#==================== 接口代理结束 ====================
# 前端dist子目录访问
location / {
root /www/wwwroot/mall.dxkua.cn/mall/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
location ~ \.well-known{
allow all;
}
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
access_log /www/wwwlogs/114.55.106.49.log;
error_log /www/wwwlogs/114.55.106.49.error.log;
}
6.后端部署java项目 选择好对应的jar包和开放端口以及jdk版本
💡 性能优化建议
- JVM调优:根据服务器内存调整
-Xms和-Xmx - MySQL优化:配置
innodb_buffer_pool_size - Redis优化:设置
maxmemory - 开启Gzip:Nginx配置gzip压缩
🔒 安全建议
- 修改SSH端口
- 配置SSL证书(宝塔可申请免费证书)
- 定期备份数据库和代码
- 设置防火墙规则
- 修改所有默认密码
部署完成后,你的商城系统就可以通过浏览器访问了!有任何问题可以随时问我。