ruoyi-vue-plus 5.x官方视频教程课程介绍 #java #ruoyi #视频教程---youkeit.xyz/15952/
ruoyi-vue-plus 作为国内广受欢迎的快速开发框架,以其强大的功能、丰富的组件和完善的文档,极大地提升了中小型项目的开发效率。然而,随着业务规模的扩张,单体架构终将触及性能和可扩展性的天花板。将ruoyi-vue-plus从单体架构平滑演进到分布式架构,是许多团队面临的必然选择。
本文将基于ruoyi-vue-plus 5.x的现有基础,探讨一套面向未来的分布式改造实践方案。这不仅仅是技术的堆砌,更是一套关于架构演进、服务治理和未来扩展性的系统性思考。
第一步:服务拆分——从“巨无霸”到“精锐部队”
分布式改造的第一步,也是最核心的一步,是服务拆分。ruoyi-vue-plus本身已经按模块划分了代码,这为我们提供了良好的拆分基础。
拆分原则:
- 按业务领域拆分: 这是最推荐的方式。例如,将
ruoyi-vue-plus拆分为ruoyi-auth(认证授权服务)、ruoyi-system(系统管理服务)、ruoyi-gen(代码生成服务)、ruoyi-job(定时任务服务)等。 - 按功能拆分: 对于某些耦合度高的模块,可以进一步拆分。例如,将文件服务(
ruoyi-file)独立出来,因为它有独特的存储和访问需求。
代码实践:独立一个认证服务 (ruoyi-auth)
- 创建新模块: 创建一个新的Spring Boot项目,命名为
ruoyi-auth。 - 迁移核心代码: 从原
ruoyi-admin模块中,将com.ruoyi.web.controller.system.SysLoginController、TokenService以及相关的认证逻辑迁移过来。 - 依赖调整:
ruoyi-auth不再需要依赖所有业务模块,只需要核心的ruoyi-common和安全相关的依赖。
改造后的ruoyi-auth服务的pom.xml片段:
代码生成完成
XML代码
第二步:服务注册与发现——让服务“互相看见”
服务拆分后,服务之间如何通信?首先,它们需要能互相找到对方。这就是服务注册与发现中心的作用。我们选择业界主流的Nacos。
代码实践:集成Nacos
- 添加依赖: 在所有微服务(包括
ruoyi-auth、ruoyi-system等)的pom.xml中添加Nacos依赖。 - 配置文件: 在
bootstrap.yml中配置Nacos服务器地址。
ruoyi-auth服务的bootstrap.yml配置:
spring:
application:
name: ruoyi-auth
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: public # 命名空间,用于环境隔离
group: DEFAULT_GROUP # 服务分组
config:
server-addr: 127.0.0.1:8848
file-extension: yml
shared-configs:
- data-id: application-common.yml # 共享配置
refresh: true
3. 启动类注解: 在每个服务的启动类上添加@EnableDiscoveryClient注解。
@SpringBootApplication
@EnableDiscoveryClient
public class RuoYiAuthApplication {
public static void main(String[] args) {
SpringApplication.run(RuoYiAuthApplication.class, args);
}
}
现在,启动ruoyi-auth服务,你就能在Nacos控制台看到它注册上去了。其他服务同理。
第三步:统一配置管理——告别“配置地狱”
分布式系统配置项繁多,修改一个配置需要重启所有服务,这是灾难性的。Nacos同时提供了强大的配置中心功能。
代码实践:使用Nacos配置中心
-
在Nacos控制台创建配置:
Data ID:ruoyi-auth-dev.ymlGroup:DEFAULT_GROUP- 配置内容:
ruoyi:
auth:
token:
expire-time: 28800 # 8小时
2. 在代码中读取动态配置:
我们可以使用@RefreshScope注解实现配置的动态刷新。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
@Component
@RefreshScope // 关键注解,允许配置动态刷新
public class AuthConfig {
@Value("${ruoyi.auth.token.expire-time}")
private long tokenExpireTime;
public long getTokenExpireTime() {
return tokenExpireTime;
}
}
当你在Nacos控制台修改ruoyi-auth-dev.yml中的expire-time值并发布后,AuthConfig中的tokenExpireTime字段会自动更新,无需重启服务。
第四步:服务间通信——从“本地调用”到“远程RPC”
服务拆分后,原本的本地方法调用变成了远程服务调用。ruoyi-vue-plus 5.x已经集成了Spring Cloud LoadBalancer和OpenFeign,这使得声明式的RESTful调用变得异常简单。
代码实践:ruoyi-admin调用ruoyi-system服务
假设ruoyi-system服务提供了一个查询用户信息的接口。
- 在
ruoyi-system中定义并暴露接口:
// 在 ruoyi-system 服务中
@RestController
@RequestMapping("/system/user")
public class SysUserController extends BaseController {
@Autowired
private ISysUserService userService;
@GetMapping("/{userId}")
public R<SysUser> getUserInfo(@PathVariable("userId") Long userId) {
return R.ok(userService.selectUserById(userId));
}
}
2. 在ruoyi-admin中创建Feign客户端:
首先,确保ruoyi-admin的pom.xml有spring-cloud-starter-openfeign依赖。
// 在 ruoyi-admin 服务中创建一个Feign接口
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(contextId = "remoteUserService", value = "ruoyi-system")
public interface RemoteUserService {
@GetMapping("/system/user/{userId}")
R<SysUser> getUserInfo(@PathVariable("userId") Long userId);
}
3. 在ruoyi-admin的业务代码中注入并调用:
// 在 ruoyi-admin 的某个Controller或Service中
@Autowired
private RemoteUserService remoteUserService;
@GetMapping("/profile/{userId}")
public R<SysUser> getUserProfile(@PathVariable("userId") Long userId) {
// 像调用本地方法一样调用远程服务
R<SysUser> result = remoteUserService.getUserInfo(userId);
// ... 后续业务逻辑
return result;
}
通过@FeignClient,我们定义了服务名ruoyi-system,Feign会结合Nacos的服务发现,自动将请求路由到健康的ruoyi-system实例上,并内置了负载均衡。
第五步:网关——流量的统一入口
有了多个微服务,前端应用如何与它们交互?难道要记住每个服务的IP和端口吗?当然不。我们需要一个API网关作为统一的流量入口。Spring Cloud Gateway是理想选择。
代码实践:配置ruoyi-gateway
- 创建
ruoyi-gateway模块,并添加spring-cloud-starter-gateway和spring-cloud-starter-loadbalancer依赖。 - 配置路由规则: 在
application.yml中配置。
spring:
cloud:
gateway:
routes:
# 认证服务的路由
- id: ruoyi-auth-route
uri: lb://ruoyi-auth # lb:// 表示从Nacos进行服务发现和负载均衡
predicates:
- Path=/auth/** # 匹配 /auth/ 开头的请求
filters:
- StripPrefix=1 # 去掉前缀 /auth,例如 /auth/login -> /login
# 系统管理服务的路由
- id: ruoyi-system-route
uri: lb://ruoyi-system
predicates:
- Path=/system/**
filters:
- StripPrefix=1
现在,前端所有请求都指向网关(如http://localhost:8080)。当请求/auth/login时,网关会将其转发到ruoyi-auth服务的/login接口;当请求/system/user/1时,则转发到ruoyi-system服务。
结论:演进,而非革命
将ruoyi-vue-plus适配到分布式场景,并非一蹴而就的颠覆,而是一场平滑的、渐进式的演进。通过服务拆分、注册发现、配置中心、服务通信和API网关这五大步骤,我们可以将一个强大的单体应用,逐步改造为一个高可用、高扩展的分布式系统。
ruoyi-vue-plus 5.x的模块化设计和与Spring Cloud生态的良好兼容性,为这场演进铺平了道路。掌握这套实践,不仅能让你的项目承载更大的业务野心,更能让你在架构设计的道路上,迈出坚实而有力的一步。未来已来,而演进,就在当下。