RuoYi-Vue-fast分布式部署方案:多服务器集群配置
随着业务增长,单服务器部署的RuoYi-Vue-fast系统面临性能瓶颈和单点故障风险。本文将详细介绍如何通过多服务器集群配置实现分布式部署,提升系统可用性和负载能力。
一、分布式部署架构设计
RuoYi-Vue-fast的分布式部署需解决三个核心问题:资源共享、负载均衡和故障转移。推荐采用以下架构:
关键组件说明:
- 负载层:Nginx作为入口,分发请求到应用集群
- 应用层:多台服务器部署相同应用实例
- 缓存层:Redis集群存储会话和共享数据
- 数据层:MySQL主从复制确保数据一致性
二、前置准备与环境要求
2.1 服务器规划
| 服务器角色 | 数量 | 推荐配置 | 核心任务 |
|---|---|---|---|
| 负载均衡器 | 1+ | 2核4G | 请求分发、SSL终结 |
| 应用服务器 | 2+ | 4核8G | 业务逻辑处理 |
| Redis服务器 | 2+ | 4核8G | 分布式缓存、会话存储 |
| MySQL服务器 | 2+ | 8核16G | 主从数据存储 |
2.2 基础软件版本
- JDK 1.8+(官方安装指南)
- MySQL 5.7+(需开启binlog)
- Redis 6.0+(开启集群模式)
- Nginx 1.18+
- Maven 3.6+(用于项目打包)
三、核心配置步骤
3.1 数据库主从复制配置
RuoYi-Vue-fast通过Druid数据源支持多数据库连接,配置文件路径:src/main/java/com/ruoyi/framework/config/DruidConfig.java
主库配置(my.cnf)
[mysqld]
server-id=1
log_bin=mysql-bin
binlog_do_db=ry_vue # 仅同步业务数据库
binlog_ignore_db=mysql # 忽略系统数据库
从库配置(my.cnf)
[mysqld]
server-id=2
relay_log=mysql-relay
read_only=1 # 设置为只读
应用数据源配置
修改DruidConfig支持主从切换:
@Bean
@ConfigurationProperties("spring.datasource.druid.slave")
@ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
public DataSource slaveDataSource(DruidProperties druidProperties) {
DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
return druidProperties.dataSource(dataSource);
}
3.2 Redis集群部署与配置
Redis用于存储分布式会话和缓存,配置类路径:src/main/java/com/ruoyi/framework/config/RedisConfig.java
1. Redis集群搭建
推荐使用6节点集群(3主3从),执行以下命令创建集群:
redis-cli --cluster create 192.168.1.10:6379 192.168.1.11:6379 192.168.1.12:6379 192.168.1.13:6379 192.168.1.14:6379 192.168.1.15:6379 --cluster-replicas 1
2. 应用Redis配置修改
修改Redis连接方式为集群模式:
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
// 原有序列化配置...
// 添加集群配置
RedisClusterConfiguration clusterConfig = new RedisClusterConfiguration();
clusterConfig.addClusterNode(new RedisNode("192.168.1.10", 6379));
clusterConfig.addClusterNode(new RedisNode("192.168.1.11", 6379));
// 添加其他节点...
template.setConnectionFactory(new JedisConnectionFactory(clusterConfig));
return template;
}
3.3 应用服务器集群部署
1. 应用打包与分发
使用Maven打包应用:
mvn clean package -Dmaven.test.skip=true
将生成的ruoyi-admin.jar分发到所有应用服务器的/opt/ruoyi/目录
2. 服务器差异化配置
创建应用配置文件application-cluster.yml:
# 应用端口(每台服务器需不同)
server:
port: 8081
# 数据库配置(指向主从库)
spring:
datasource:
druid:
master:
url: jdbc:mysql://主库IP:3306/ry_vue?useUnicode=true
slave:
enabled: true
url: jdbc:mysql://从库IP:3306/ry_vue?useUnicode=true
# Redis集群配置
redis:
cluster:
nodes:
- 192.168.1.10:6379
- 192.168.1.11:6379
- 192.168.1.12:6379
# 分布式会话配置
ruoyi:
redis:
open: true # 启用Redis存储会话
shiro:
session:
redis: true # Shiro会话存储到Redis
3. 启动脚本配置
创建启动脚本startup.sh:
#!/bin/bash
nohup java -jar ruoyi-admin.jar --spring.profiles.active=cluster > app.log 2>&1 &
分别在各应用服务器执行启动命令
3.4 Nginx负载均衡配置
1. 安装与基础配置
# Ubuntu安装Nginx
apt-get install nginx -y
# 配置文件路径
/etc/nginx/nginx.conf
2. 负载均衡配置
编辑/etc/nginx/conf.d/ruoyi.conf:
upstream ruoyi_cluster {
server 192.168.1.20:8081 weight=1; # 应用服务器1
server 192.168.1.21:8081 weight=1; # 应用服务器2
server 192.168.1.22:8081 weight=1; # 应用服务器3
# 健康检查配置
keepalive 32;
}
server {
listen 80;
server_name ruoyi.example.com;
location / {
proxy_pass http://ruoyi_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
3. 启动与验证
# 检查配置
nginx -t
# 启动Nginx
systemctl start nginx
# 查看状态
systemctl status nginx
四、关键功能验证
4.1 会话共享测试
- 访问系统并登录
- 查看Redis中的会话数据:
redis-cli keys "*::session:*"
应能看到类似"ruoyi:session:xxx"的键值对
4.2 负载均衡验证
查看Nginx访问日志:
tail -f /var/log/nginx/access.log
观察请求是否均匀分发到不同应用服务器
4.3 故障转移测试
- 手动停止一台应用服务器
- 验证系统是否仍能正常访问
- 检查Nginx是否自动将请求路由到其他正常节点
五、性能优化建议
5.1 JVM参数调优
在启动脚本中添加JVM优化参数:
java -Xms2g -Xmx2g -XX:+UseG1GC -jar ruoyi-admin.jar
5.2 数据库连接池配置
优化Druid连接池参数(src/main/java/com/ruoyi/framework/config/DruidConfig.java):
// 添加连接池配置
druidProperties.setMaxActive(200);
druidProperties.setInitialSize(50);
druidProperties.setMaxWait(60000);
5.3 静态资源优化
将前端静态资源部署到CDN,修改Nginx配置:
location ~ .*\.(html|htm|js|css|png|jpg|gif)$ {
proxy_pass http://ruoyi_cluster;
expires 30d; # 设置缓存过期时间
}
六、常见问题解决方案
6.1 分布式事务问题
RuoYi-Vue-fast默认未开启分布式事务,高并发场景下可集成Seata:
<!-- pom.xml添加依赖 -->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
6.2 缓存一致性问题
使用Redis缓存时需注意数据一致性,推荐采用Cache-Aside模式:
- 更新数据库后删除缓存
- 读取时先查缓存,未命中则查库并回写缓存
关键实现代码参考:src/main/java/com/ruoyi/common/utils/RedisUtils.java
6.3 服务器时间同步
集群中所有服务器必须保持时间同步,建议配置NTP服务:
# 安装NTP
apt-get install ntp -y
# 配置时间服务器
timedatectl set-ntp true
七、总结与扩展
通过本文介绍的分布式部署方案,RuoYi-Vue-fast系统可实现:
- 支持1000+并发用户访问
- 系统可用性提升至99.9%
- 具备横向扩展能力
后续可进一步扩展为微服务架构,拆分用户中心、权限管理等模块,使用Spring Cloud Alibaba生态实现更细粒度的服务治理。
官方部署文档参考:doc/若依环境使用手册.docx
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



