RuoYi-Cloud-Plus 实战案例
RuoYi-Cloud-Plus 是一个功能强大的微服务通用权限管理系统,适用于企业级应用的开发。本节将通过实战案例,展示如何利用 RuoYi-Cloud-Plus 快速构建一个企业级应用,涵盖从项目初始化到功能开发的完整流程。
企业级应用开发实战
RuoYi-Cloud-Plus 是一个功能强大的微服务通用权限管理系统,适用于企业级应用的开发。本节将通过实战案例,展示如何利用 RuoYi-Cloud-Plus 快速构建一个企业级应用,涵盖从项目初始化到功能开发的完整流程。
1. 项目初始化与配置
1.1 环境准备
在开始之前,确保以下环境已配置完成:
- JDK 17 或更高版本
- Maven 3.6+
- MySQL 8.0+
- Redis 5.0+
- Nacos 2.0+
1.2 克隆项目
git clone https://gitcode.com/dromara/RuoYi-Cloud-Plus.git
cd RuoYi-Cloud-Plus
1.3 数据库初始化
执行以下 SQL 脚本初始化数据库:
-- 创建数据库
CREATE DATABASE IF NOT EXISTS `ry-cloud` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 导入数据
USE `ry-cloud`;
SOURCE /path/to/ry-cloud.sql;
1.4 配置文件修改
修改 application.yml 文件中的数据库和 Redis 配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: your_password
redis:
host: localhost
port: 6379
password: your_password
2. 核心功能开发
2.1 用户管理模块
RuoYi-Cloud-Plus 提供了完善的用户管理功能,包括用户增删改查、角色分配等。以下是一个用户查询的代码示例:
@RestController
@RequestMapping("/system/user")
public class SysUserController {
@Autowired
private ISysUserService userService;
@GetMapping("/list")
public TableDataInfo list(SysUser user) {
startPage();
List<SysUser> list = userService.selectUserList(user);
return getDataTable(list);
}
}
2.2 权限控制
通过 Sa-Token 实现权限控制,支持注解式权限校验:
@SaCheckPermission("system:user:list")
@GetMapping("/list")
public TableDataInfo list(SysUser user) {
// 业务逻辑
}
2.3 数据权限
使用 Mybatis-Plus 插件实现数据权限过滤:
@DataScope(deptAlias = "d", userAlias = "u")
public List<SysUser> selectUserList(SysUser user) {
return userMapper.selectUserList(user);
}
3. 高级功能扩展
3.1 分布式事务
通过 Seata 实现分布式事务:
@GlobalTransactional
public void transfer(Long fromUserId, Long toUserId, BigDecimal amount) {
// 扣减余额
accountService.decrease(fromUserId, amount);
// 增加余额
accountService.increase(toUserId, amount);
}
3.2 文件存储
使用 Minio 实现文件上传:
@PostMapping("/upload")
public AjaxResult uploadFile(MultipartFile file) {
String fileName = minioService.upload(file);
return success(fileName);
}
4. 部署与监控
4.1 Docker 部署
使用 docker-compose.yml 快速部署:
version: '3'
services:
ruoyi-auth:
image: ruoyi-auth:latest
ports:
- "8080:8080"
ruoyi-gateway:
image: ruoyi-gateway:latest
ports:
- "9999:9999"
4.2 监控配置
通过 Prometheus 和 Grafana 监控系统运行状态:
spring:
application:
name: ruoyi-monitor
metrics:
export:
prometheus:
enabled: true
5. 总结
通过以上步骤,我们完成了从项目初始化到核心功能开发的完整流程。RuoYi-Cloud-Plus 提供了丰富的功能和灵活的扩展性,能够满足企业级应用开发的需求。
复杂审批流程实现
在RuoYi-Cloud-Plus中,复杂审批流程的实现基于工作流引擎,支持多种审批场景,如转办、委派、加减签、会签、或签、票签等。以下将详细介绍其核心实现逻辑和关键代码示例。
1. 审批流程核心组件
1.1 流程定义与实例管理
审批流程的核心组件包括流程定义(FlowDefinition)、流程实例(FlowInstance)和任务(FlowTask)。这些组件通过以下类实现:
public class FlowDefinition {
private Long id;
private String name;
private String key;
private String tenantId;
// 其他字段
}
public class FlowInstance {
private Long id;
private String businessId;
private Long definitionId;
private String status;
// 其他字段
}
public class FlowTask {
private Long id;
private Long instanceId;
private String assignee;
private String status;
// 其他字段
}
1.2 审批操作
审批操作通过TaskOperationBo类封装,支持多种操作类型:
public class TaskOperationBo {
private Long taskId;
private String operationType; // 审批、转办、委派等
private String comment;
private Map<String, Object> variables;
// 其他字段
}
2. 审批流程实现逻辑
2.1 流程启动
流程启动通过StartProcessBo类触发,支持动态参数传递:
public class StartProcessBo {
private Long definitionId;
private String businessId;
private Map<String, Object> variables;
// 其他字段
}
启动流程的核心代码如下:
@Transactional(rollbackFor = Exception.class)
public RemoteStartProcessReturn startWorkFlow(StartProcessBo startProcessBo) {
// 校验参数
// 创建流程实例
// 启动流程
return new RemoteStartProcessReturn(instanceId, taskId);
}
2.2 任务审批
任务审批通过CompleteTaskBo类封装,支持动态变量传递:
public class CompleteTaskBo {
private Long taskId;
private String action; // 通过、拒绝等
private Map<String, Object> variables;
// 其他字段
}
审批逻辑的核心代码如下:
@Transactional(rollbackFor = Exception.class)
public void completeTask(CompleteTaskBo completeTaskBo) {
// 校验任务状态
// 更新任务状态
// 触发下一节点
}
3. 复杂审批场景
3.1 会签与或签
会签和或签通过FlowNextNodeBo类实现,支持动态配置:
public class FlowNextNodeBo {
private String nodeCode;
private String assigneeType; // 会签、或签等
private List<String> assignees;
// 其他字段
}
3.2 转办与委派
转办和委派通过TaskAssigneeEnum枚举类定义:
public enum TaskAssigneeEnum {
TRANSFER("转办"),
DELEGATE("委派");
// 其他枚举值
}
4. 状态机与事件监听
审批流程的状态变更通过事件监听机制实现,核心代码如下:
@EventListener(condition = "#processEvent.flowCode.startsWith('leave')")
public void processHandler(ProcessEvent processEvent) {
// 处理流程事件
}
@EventListener(condition = "#processTaskEvent.flowCode.startsWith('leave')")
public void processTaskHandler(ProcessTaskEvent processTaskEvent) {
// 处理任务事件
}
5. 示例流程图
以下是一个审批流程的Mermaid流程图示例:
6. 总结
RuoYi-Cloud-Plus的复杂审批流程实现基于灵活的工作流引擎,支持多种审批场景和动态配置。通过核心组件和事件监听机制,开发者可以快速构建符合业务需求的审批流程。
高并发场景优化
在高并发场景下,系统的性能和稳定性是至关重要的。RuoYi-Cloud-Plus 通过多种技术手段优化了高并发场景下的性能表现,包括缓存策略、限流机制、分布式锁等。以下是一些关键优化点及其实现方式:
1. 缓存策略优化
RuoYi-Cloud-Plus 使用多级缓存(如 Redis + Caffeine)来减少数据库访问压力,提高响应速度。
缓存配置示例
@Configuration
public class CacheConfiguration {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(Caffeine.newBuilder()
.initialCapacity(100)
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES));
return cacheManager;
}
}
缓存使用示例
@Service
public class UserServiceImpl implements UserService {
@Cacheable(value = "userCache", key = "#userId")
public User getUserById(Long userId) {
return userMapper.selectById(userId);
}
}
缓存流程图
2. 分布式限流
为了防止系统被突发流量压垮,RuoYi-Cloud-Plus 集成了 Sentinel 和自定义限流注解 @RateLimiter,支持基于 IP、用户或接口的限流。
限流配置示例
@RateLimiter(key = "user:login", limit = 5, expire = 60, message = "操作过于频繁,请稍后再试")
public R<String> login(LoginBody loginBody) {
// 登录逻辑
}
限流流程图
3. 分布式锁
在高并发场景下,分布式锁可以避免资源竞争问题。RuoYi-Cloud-Plus 使用 Redisson 实现分布式锁。
分布式锁示例
public void updateStock(Long productId, int quantity) {
String lockKey = "product:" + productId;
RLock lock = redissonClient.getLock(lockKey);
try {
if (lock.tryLock(10, TimeUnit.SECONDS)) {
// 业务逻辑
}
} finally {
lock.unlock();
}
}
锁机制流程图
4. 线程池优化
通过自定义线程池配置,避免线程资源耗尽导致系统崩溃。
线程池配置示例
@Configuration
public class ThreadPoolConfig {
@Bean
public ExecutorService asyncExecutor() {
return new ThreadPoolExecutor(
10,
50,
60L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(1000),
new ThreadPoolExecutor.CallerRunsPolicy());
}
}
线程池参数表
| 参数 | 说明 | 推荐值 |
|---|---|---|
| corePoolSize | 核心线程数 | 10 |
| maxPoolSize | 最大线程数 | 50 |
| keepAliveTime | 空闲线程存活时间(秒) | 60 |
| queueCapacity | 任务队列容量 | 1000 |
| rejectionPolicy | 拒绝策略 | CallerRunsPolicy |
5. 数据库优化
通过分库分表、读写分离和索引优化,提升数据库在高并发场景下的性能。
分库分表示例
-- 分库分表规则
CREATE TABLE `order_0` (
`id` BIGINT PRIMARY KEY,
`user_id` BIGINT,
`amount` DECIMAL(10,2)
) ENGINE=InnoDB;
索引优化示例
-- 添加索引
ALTER TABLE `user` ADD INDEX `idx_username` (`username`);
数据库优化流程图
通过以上优化手段,RuoYi-Cloud-Plus 能够有效应对高并发场景,确保系统的稳定性和高性能。
项目迁移与升级经验
RuoYi-Cloud-Plus 是一个功能强大的微服务通用权限管理系统,其架构和功能相较于原版 RuoYi-Cloud 有了全方位的升级。在实际项目中,迁移和升级是一个复杂的过程,需要综合考虑代码兼容性、数据库迁移、配置调整等多方面因素。以下是一些关键的经验和建议,帮助开发者顺利完成迁移与升级。
1. 数据库迁移与兼容性
RuoYi-Cloud-Plus 支持多种数据库(MySQL、Oracle、PostgreSQL、SQLServer),并提供了详细的 SQL 脚本用于数据迁移。以下是迁移步骤:
- 备份原数据库:在进行任何迁移操作前,务必对原数据库进行完整备份。
- 执行迁移脚本:根据目标数据库类型,选择合适的 SQL 脚本执行。例如:
- 对于 PostgreSQL,使用
script/sql/postgres目录下的脚本。 - 对于 Oracle,使用
script/sql/oracle目录下的脚本。
- 对于 PostgreSQL,使用
- 验证数据完整性:迁移完成后,检查数据是否完整,确保关键表(如用户、角色、权限等)的数据正确。
示例:PostgreSQL 迁移脚本
-- 示例脚本:postgres_ry_cloud.sql
CREATE TABLE sys_user (
user_id BIGSERIAL PRIMARY KEY,
user_name VARCHAR(30) NOT NULL,
password VARCHAR(100) NOT NULL,
-- 其他字段
);
2. 代码兼容性调整
RuoYi-Cloud-Plus 的代码结构与原版 RuoYi-Cloud 不完全兼容,以下是一些常见的调整点:
- 依赖管理:检查
pom.xml文件,确保所有依赖项与 RuoYi-Cloud-Plus 的版本一致。 - 注解调整:原版中的部分注解(如
@RestController)可能需要替换为 RuoYi-Cloud-Plus 提供的扩展注解。 - 工具类迁移:RuoYi-Cloud-Plus 提供了丰富的工具类(如
MapstructUtils、DateUtils),可以直接替换原版中的自定义工具类。
示例:工具类替换
// 原版代码
String formattedDate = DateFormatUtils.format(new Date(), "yyyy-MM-dd");
// RuoYi-Cloud-Plus 代码
String formattedDate = DateUtils.dateTimeNow(FormatsType.YYYY_MM_DD);
3. 配置文件调整
RuoYi-Cloud-Plus 的配置文件结构与原版有所不同,需要特别注意以下几点:
- Nacos 配置:确保
application.yml中的 Nacos 配置与 RuoYi-Cloud-Plus 的要求一致。 - Redis 配置:RuoYi-Cloud-Plus 使用 Redisson 客户端,配置方式与原版 Lettuce 不同。
- 多数据源配置:如果项目使用多数据源,需按照
dynamic-datasource的规范进行配置。
示例:Redis 配置
# RuoYi-Cloud-Plus Redis 配置
spring:
redis:
redisson:
config: |
singleServerConfig:
address: "redis://127.0.0.1:6379"
database: 0
4. 服务网关与鉴权
RuoYi-Cloud-Plus 的网关模块(ruoyi-gateway)集成了多种过滤器(如黑名单、跨域、日志等),需确保以下配置正确:
- 路由规则:检查网关的路由规则是否与原版一致。
- 鉴权配置:RuoYi-Cloud-Plus 使用 Sa-Token 进行鉴权,需调整原版的 Spring Security 配置。
示例:网关过滤器配置
@Component
public class BlackListUrlFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 黑名单逻辑
return chain.filter(exchange);
}
}
5. 测试与验证
迁移完成后,需进行全面测试,确保以下功能正常:
- 用户登录与鉴权:验证用户登录、角色权限控制是否正常。
- 数据操作:测试增删改查功能,确保数据库操作无误。
- 服务调用:验证微服务之间的调用是否正常。
测试用例示例
@Test
public void testUserLogin() {
LoginBody loginBody = new LoginBody();
loginBody.setUsername("admin");
loginBody.setPassword("admin123");
R<String> result = authService.login(loginBody);
Assert.assertTrue(result.isSuccess());
}
6. 升级注意事项
如果是从 RuoYi-Cloud-Plus 的旧版本升级到新版本,需执行以下步骤:
- 检查升级脚本:在
script/sql/update目录下找到对应的升级脚本。 - 执行脚本:按照版本顺序依次执行升级脚本。
- 验证功能:升级后,重新测试关键功能。
示例:升级脚本
-- 示例脚本:update_2.3.0-2.4.0.sql
ALTER TABLE sys_user ADD COLUMN IF NOT EXISTS last_login_time TIMESTAMP;
通过以上步骤,可以顺利完成 RuoYi-Cloud-Plus 的迁移与升级工作。如果在过程中遇到问题,可以参考官方文档或社区支持。
总结
通过以上步骤,我们完成了从项目初始化到核心功能开发的完整流程。RuoYi-Cloud-Plus 提供了丰富的功能和灵活的扩展性,能够满足企业级应用开发的需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



