ruoyi-cloud微服务架构下业务模块的增量开发实践

📅 发布时间:2026/7/10 13:38:10 👁️ 浏览次数:
ruoyi-cloud微服务架构下业务模块的增量开发实践
1. 理解ruoyi-cloud的模块化设计哲学如果你刚接触ruoyi-cloud可能会被它那一大堆模块目录搞得有点懵。别慌这恰恰是它设计精妙的地方。我刚开始用的时候也犯怵但摸清楚它的套路后你会发现这种结构清晰得让人感动特别适合我们做增量开发。简单来说ruoyi-cloud把整个系统像乐高积木一样拆开了每个模块职责单一我们新增业务模块其实就是照着它的规范新造一块兼容的“乐高”拼上去。整个项目的骨架核心是几个“功能区”。ruoyi-gateway是总大门所有请求都从这里进ruoyi-auth是保安室负责验明正身ruoyi-modules就是各个业务部门比如已有的系统管理、代码生成。我们要做的就是在ruoyi-modules这个“业务大楼”里新开一个办公室比如“订单部”或者“商品部”。这样做的好处太明显了你的新模块不会污染老代码老模块的稳定运行也完全不受影响出了问题也容易定位就是典型的“高内聚、低耦合”。这里有个关键点也是我踩过坑的地方约定大于配置。ruoyi-cloud通过一系列命名和路径的约定把很多繁琐的配置都省了。比如你的模块名要是ruoyi-modules-xxx配置文件的名字、Nacos里的Data ID都得按它的规矩来。一开始我总想自己另搞一套结果不是服务注册不上就是配置读不到。后来老老实实跟着它的“约定”走一路顺畅。所以在动手之前花点时间把现有模块的结构特别是ruoyi-system系统模块这个样板间看明白能省下后面大量的调试时间。2. 从零开始创建你的第一个业务子模块好理论说再多不如动手。假设我们现在要给系统加一个“订单管理”模块名字就叫ruoyi-modules-order。我用的是IDEA其他IDE操作也大同小异。第一步在项目根目录找到ruoyi-modules文件夹右键 - New - Module。这里有个小细节创建Maven模块时不要直接选择父模块。我们手动在下一步的Parent里点击Add...然后从列表里选择com.ruoyi:ruoyi-modules:3.6.0版本号根据你的项目来。这样做是为了确保POM文件的parent配置绝对准确避免一些诡异的依赖继承问题。模块的ArtifactId就填ruoyi-modules-order。模块建好只是个空壳接下来是配依赖这是保证新模块能融入大家庭的关键。最稳妥的办法就是“抄作业”。打开现有的ruoyi-system模块的pom.xml把它的整个dependencies部分复制过来。然后你只需要修改两个地方artifactId改成你自己的ruoyi-modules-orderdescription里写点模块说明。其他的依赖比如Nacos服务发现与配置、Sentinel流控、Swagger、数据库驱动以及ruoyi的各种通用组件datasource, log, swagger等原封不动保留。这些依赖是ruoyi-cloud微服务生态的“标准件”少了哪个都可能跑不起来。复制完依赖记得去父模块也就是ruoyi-modules目录下的pom.xml里在modules节点下把你的新模块ruoyi-modules-order加进去。这样Maven才能识别和管理它。做完这步刷新一下Maven如果之前有报红现在应该就解决了。3. 模块的“身份证”配置与启动类模块有了依赖齐了接下来得给它办“身份证”让它能作为一个独立的Spring Boot应用启动。首先在src/main/java下创建包结构。这里强烈建议遵循ruoyi的惯例com.ruoyi.modules.order。这个包路径很重要后面代码生成和MyBatis扫描都会用到。然后创建启动类。还是在ruoyi-system里抄把RuoYiSystemApplication复制过来改名为RuoYiOrderApplication放在你刚建的包下。启动类里的SpringBootApplication注解的scanBasePackages通常不需要改它会自动扫描当前包及其子包。接下来是配置文件。把ruoyi-system里src/main/resources下的bootstrap.yml和logback.xml复制到新模块的相同位置。bootstrap.yml是微服务配置的核心需要仔细修改spring: application: name: ruoyi-modules-order # 应用名务必唯一 cloud: nacos: discovery: server-addr: 127.0.0.1:8848 # Nacos地址 namespace: public # 命名空间默认public config: server-addr: 127.0.0.1:8848 namespace: public file-extension: yml # 配置文件后缀 group: DEFAULT_GROUP name: ${spring.application.name} # 这里决定了去Nacos找哪个配置重点看spring.application.name我把它设成了ruoyi-modules-order。这里有个超级重要的约定Nacos配置中心里对应的Data ID默认就是${spring.application.name}-${spring.profiles.active}.${file-extension}。假设我们环境是dev那么应用启动时就会去Nacos找ruoyi-modules-order-dev.yml这个配置。端口号server.port也要改一个没被占用的比如9204。logback.xml主要是日志路径要改把里面涉及到ruoyi-system的路径替换成ruoyi-modules-order避免日志都混在一起。4. 在Nacos中安家服务注册与动态配置模块自己准备得差不多了现在得让它被大家庭发现和管理。首先确保你的Nacos服务已经跑起来了。打开Nacos控制台默认localhost:8848/nacos在配置管理 - 配置列表里你会看到一堆像ruoyi-system-dev.yml这样的文件。我们需要为订单模块创建专属配置。最省事的方法是“克隆”。找到ruoyi-system-dev.yml点击“克隆”按钮。在克隆页面把Data ID改成ruoyi-modules-order-dev.yml必须和bootstrap.yml里的约定一致Group和配置格式保持YAML不变。然后点击“克隆”。克隆成功后进入这个新配置进行编辑。最主要修改两个地方数据库连接把url、username、password指向你的订单模块数据库。你可以新建一个ry-order库也可以和系统库ry-cloud放在一起但用不同前缀的表根据业务量来定。MyBatis扫描路径找到mybatis-plus.mapper-locations和#mybatis.type-aliases-package通常在注释里需要取消注释并修改将里面的包路径从com.ruoyi.modules.system改成com.ruoyi.modules.order。这样Mapper XML文件和实体类才能被正确扫描。改完后发布。接下来配置网关路由让外部请求能访问到我们的新服务。进入服务管理 - 服务列表等会儿你的订单服务启动后就会出现在这里。然后去网关管理如果使用了Nacos作为网关配置源或者直接修改ruoyi-gateway项目的路由配置文件。增加一条路由规则spring: cloud: gateway: routes: - id: ruoyi-modules-order uri: lb://ruoyi-modules-order # lb:// 表示负载均衡到该服务名 predicates: - Path/order/** # 匹配所有以/order开头的请求 filters: - StripPrefix1 # 去掉路径前缀中的第一段/order这条规则意思是所有访问网关/order/xxx的请求都会被转发到名为ruoyi-modules-order的服务实例上并且去掉路径中的/order前缀。这样你的订单模块内部控制器只需要写/order/create这样的映射对外暴露的却是/order/order/create实现了路径的转换和屏蔽。5. 让模块“活”起来启动与基础代码生成激动人心的时刻到了。在IDE里找到你的RuoYiOrderApplication启动类右键运行。如果一切配置正确你会在控制台看到Spring Boot的启动日志最后出现“Started RuoYiOrderApplication in x.xxx seconds”的字样。同时去Nacos控制台的服务列表里刷新一下应该能看到一个名为ruoyi-modules-order的服务健康状态为“UP”。服务跑起来但还没任何功能。接下来我们用ruoyi强大的代码生成器来快速搭建CRUD基础代码。首先确保ruoyi-gen代码生成模块已经启动。登录系统管理后台进入“系统工具 - 代码生成”。点击“导入表”从你的订单数据库里选择事先设计好的表比如oms_order。导入后在列表里操作“编辑”。基本信息生成模块名写order业务名写订单实体类名会自动推导。这里要注意“包路径”必须填写com.ruoyi.modules.order这样生成的代码才会放到我们模块的正确位置。字段信息检查每个字段的“插入”、“编辑”、“列表”、“查询”等权限是否勾选正确。这里有个血泪教训数据库表字段的注释一定要写清楚因为代码生成器会读取字段注释作为前端页面的列名和表单标签。如果注释为空生成的页面就会显示奇怪的字段名你还得手动去改前端Vue文件非常麻烦。信息填好后提交并生成代码。生成的是一个ZIP包解压后你会看到标准的Maven项目结构controller、domain实体和Mapper、service、mapper.xml。把这些文件夹里的内容分别复制到你模块的src/main/java和src/main/resources下对应的目录中。同时生成器还会提供一个SQL文件里面是创建菜单和权限的语句在ry-cloud系统数据库里执行它后台管理界面就会出现“订单管理”的菜单入口。6. 深度集成权限、数据源与联调实战代码生成给了你一把“毛坯房”的钥匙但要住得舒服还得搞装修。首先是权限集成。ruoyi-cloud使用ruoyi-common-security和ruoyi-common-datascope来做权限控制。你生成的Controller方法上会自动带上PreAuthorize注解比如PreAuthorize(ss.hasPermi(order:order:list))。这个order:order:list就是在SQL里插入的权限标识符。你需要检查生成的菜单SQL确保权限字符串和代码里的注解匹配。有时候生成器可能因为表名复杂导致拼接的权限标识不对需要手动调整一下。其次是多数据源问题。如果你的订单数据存在另一个独立的数据库比如叫ry-order而不是默认的ry-cloud库就需要配置多数据源。ruoyi通过ruoyi-common-datasource模块提供了优雅的支持。在你订单模块的bootstrap.yml里除了默认数据源可以增加一个# 多数据源配置 (示例具体看项目版本) datasource: order: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ry-order?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLtrueserverTimezoneGMT%2B8 username: root password: 123456然后在你需要操作订单库的Service或Mapper上使用DataSource(value DataSourceType.ORDER)注解来切换数据源。注意事务管理器也需要对应调整这部分可以参照ruoyi-system里关于多数据源事务的用法。最后是联调测试。启动你的订单模块、网关、认证中心和其他依赖服务。通过网关地址访问系统登录后应该能看到“订单管理”菜单。点进去进行增删改查测试。这里最容易出问题的是网关路由和Feign调用。如果页面能打开但接口报404检查网关路由配置的Path和StripPrefix是否正确。如果订单模块需要调用已有的system模块的用户信息你需要创建一个api接口模块在ruoyi-api下新建ruoyi-api-order定义Feign Client并在订单模块中引入这个api依赖进行调用。这体现了ruoyi-cloud前后端分离和微服务间通信的完整闭环。7. 避坑指南与进阶优化走完整个流程你可能已经成功了但也可能踩了我当年踩过的坑。这里集中列几个常见问题服务注册不上Nacos99%是bootstrap.yml里spring.application.name或Nacos地址写错了或者网络不通。检查命名空间namespace是否一致默认都是public。配置读取不到确认Nacos中Data ID的命名完全符合${spring.application.name}-${spring.profiles.active}.yml的格式。检查bootstrap.yml中spring.cloud.nacos.config.file-extension是yml不是yaml。代码生成后页面报错或字段名不对回头检查数据库表字段注释这是前端显示的名称来源。另外检查生成代码的包路径是否准确复制到了模块里。事务不生效特别是在多数据源场景下注意Transactional注解默认使用主数据源的事务管理器。如果要在从数据源上开启事务需要显式指定事务管理器。启动报Bean找不到通常是依赖缺失或版本冲突。确保你的模块POM文件里的ruoyi-common-*依赖版本与父POM保持一致。对于有更高要求的项目还可以考虑一些进阶优化。比如为你的订单模块配置独立的Sentinel流控规则在Nacos里为它创建独立的namespace或group以实现环境隔离。如果业务量很大可以考虑将订单模块的数据库进一步分库分表并在ruoyi-common-datasource基础上集成ShardingSphere。此外生成的代码结构是基础的你可以根据业务复杂性引入DTO、VO进行对象转换使用MapStruct提升转换效率或者在Service层引入更精细化的设计模式。整个过程下来我的体会是ruoyi-cloud这套架构为增量开发提供了非常坚实的“轨道”。只要你顺着它的设计思路和约定去走新增一个业务模块从无到有、再到集成上线其实是一条标准化、可重复的路径。最难的不是技术而是最开始理解并遵守它的“规矩”。一旦掌握了这个节奏后续再添加会员模块、库存模块都只是重复这个愉快的过程而已。