ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

若依部署实战:前后端分离与微服务版完整指南

若依部署实战:前后端分离与微服务版完整指南 很多朋友问过我同一个问题公司要快速搭一套带权限的后台管理系统到底是自己写还是用开源框架我的答案一直是若依。前后端分离版、微服务版两条技术路线我都从零跑到生产部署过一整个流程踩了不少坑也总结了不少经验。这篇内容我不讲官方文档里已经写烂的话就从实际动手的角度把若依从拉代码到本地启动、再到生产部署、再到二次扩展的完整路径捋一遍顺便把前后端分离版和微服务版的核心差异、架构设计、常见报错都说明白。这篇内容适合三类人第一类是刚接触若依想快速跑起来做毕设或内部系统的同学第二类是技术负责人需要评估若依是否适合作为公司基础框架第三类是已经在用若依但二次开发时遇到各种报错的开发。我会尽量把“为什么这么做”也讲清楚而不是只丢给你一堆命令和配置。1. 选型先搞清楚前后端分离版和微服务版到底差在哪1.1 两个版本的本质区别若依有几个发行版最容易被搞混的就是RuoYi-Vue和RuoYi-Cloud。简单说RuoYi-Vue是一个标准的单体应用后端虽然分了模块但最终打包成一个可执行的Jar包或War包RuoYi-Cloud则是把系统按业务边界拆成了多个独立服务每个服务单独打包、单独部署、通过注册中心互相调用。打个比方RuoYi-Vue像是一家餐厅前厅前端、后厨后端、收银数据库都在同一个场地里运营管理简单但人一多就容易互相干扰。RuoYi-Cloud更像是一个餐饮集团中央厨房做菜品系统服务、配送车队负责运输网关、财务公司单独核算认证与权限各个部门独立运作部门之间通过标准接口配合。从技术栈上看RuoYi-Vue用的是Spring Boot Spring Security JWT前端是Vue2或Vue3 Element UIRuoYi-Cloud则基于Spring Cloud Alibaba核心组件包括Nacos注册与配置中心、Gateway网关、Feign服务间调用、Sentinel限流熔断。微服务版把登录认证做成了独立服务权限校验要从redis拿token再去数据库查权限数据链路比单体复杂不少。1.2 为什么选择若依而不是从零搭框架如果你自己从零搭一套RBAC权限系统用户、角色、菜单、部门、岗位、字典、操作日志、登录日志这十几张核心表的设计就要花一两周再加上验证码、密码加密、异常处理、分页插件、操作日志切面、定时任务框架没个把月打磨不出稳定的东西。若依把这些都做完了而且代码结构非常规范Alibaba规范插件扫下来几乎没有大问题。另外若依的价值不只是“能用”而是“适合学习”。它的代码包结构清晰system模块管权限framework模块管安全配置和切面common模块是公共工具generator模块是代码生成器admin模块是启动入口。新人跟着读一遍源码对Spring Boot项目的分层、权限拦截器的工作流程、MyBatis的Mapper写法都会有实际的理解。网上经常有人拿JeecgBoot和若依比。JeecgBoot功能确实更强自带在线表单、积木报表、流程设计器适合做后台系统中重度业务场景但它的学习曲线更陡代码生成背后依赖的规则更多出了问题排查难度大。若依的优势在于简单直接权限模型经典二次开发门槛低。我的建议是中小型项目、省时间上线的选若依项目里在线流程、复杂报表是刚需的去了解JeecgBoot都不合适的话再考虑自研。选技术栈最怕的是盲目求“重”上线工期和团队熟悉度永远要排在第一位。1.3 若依各发行版的适用路径若依目前有RuoYiThymeleaf单体、RuoYi-VueVue2前后端分离、RuoYi-Vue3Vue3 TypeScript、RuoYi-Cloud微服务、RuoYi-App移动端uniapp几个版本。我的建议是直接上RuoYi-Vue或RuoYi-Vue3除非你确定团队里有微服务运维经验否则RuoYi-Cloud在部署阶段会消耗大量精力。RuoYi-Vue3目前最麻烦的点是TypeScript类型报错很多新手在npm run dev阶段就被ts报错卡住。我的处理办法后面会专门讲到这里先给个结论绝大多数ts报错不是代码逻辑问题而是依赖版本不一致或者IDE没有自动按vue-tsc的规则处理导致的配置好环境就能避开。2. 前后端分离版本从源码到本地启动的完整跑通2.1 环境准备与版本选型跑RuoYi-Vue后端需要一个JDKJDK8或JDK11都可以、Maven3.6以上、MySQL5.7或8.x、Redis6.x以上前端需要Node.js版本建议14到16太高的话依赖包容易报错。我踩过的坑是直接装Node 18去跑Vue2项目node-sass直接编译失败折腾半天只能重装Node 16。MySQL和Redis安装的时候有几个细节要注意MySQL的数据库编码要选utf8mb4排序规则utf8mb4_general_ci否则部署后字典表的中文很可能出现乱码。Redis默认端口6379密码默认为空。若依前后端分离版默认是不读redis密码的如果生产环境Redis必须设密码记得去application.yml里改。MySQL8.x的驱动已经内置在项目里了不需要额外引用但如果你用的MySQL5.7连接串里的serverTimezone参数也要跟着配置。2.2 数据库初始化脚本顺序决定成败源码拉下来后进入sql目录能看到三个文件ry_2024xxxx.sql表结构基础数据、quartz.sql定时任务表、ry_Vue_2024xxxx.sqlVue版本的前端相关菜单数据。执行顺序不能乱第一遍先执行全量脚本第二遍执行quartz第三遍再执行Vue菜单脚本。这里有个很多新手容易忽略的点执行完脚本后检查一下sys_menu表里的菜单组件路径是否和前端路由目录对应。若依的菜单表里存的是前端component路径比如system/user/index前端在views/system/user/index.vue下找页面。如果你在执行完脚本后直接改dao层的SQL导致菜单数据缺失前端登录后菜单区域就会一片空白。若依的前端路由是后端动态返回、前端动态生成的这个机制既是特色也是排障的关键点。2.3 后端启动数据库密码和Redis是第一个坎打开ruoyi-admin/src/main/resources/application-druid.yml把数据库url、用户名、密码改成自己的。默认url里有characterEncodingutf8MySQL8下如果报错Public Key Retrieval is not allowed需要在url后面加allowPublicKeyRetrievaltrue。再打开application.yml确认redis连接信息。启动RuoYiApplication主类控制台出现若依的ASCII艺术字banner说明启动成功。登录前保证Redis是通的因为若依登录接口要往Redis里存验证码和token。我第一次启动时遇到过Nacos的依赖问题——明明跑的是单体版为什么启动日志里出现nacos呢因为RuoYi-Vue的pom里注释掉了一些微服务依赖但某些版本没有完全清理干净。看到这种日志别慌确认自己没有引入ruoyi-cloud的依赖即可不影响启动。2.4 前端启动与npm依赖的坑进入ruoyi-ui目录执行npm install。这个过程有互联网环境还好内网环境就麻烦得多。这里给一个建议把镜像切成国内源再装装完后npm run dev。如果报node-sass或sass相关错误先去package.json里看sass版本Vue2项目一般用sass-loader 8.x node-sass 4.x的组合Vue3项目要确认vue-tsc版本和vue的版本兼容。npm run dev启动后页面上能看到验证码图片说明后端接口已经通了。验证码图片不出来的排查思路其实很简单打开浏览器开发工具看/prod-api/captchaImage接口返回什么如果404大概率是前端开发服务器的代理配置没生效去根目录的vue.config.js里确认/prod-api是否转发到了http://localhost:8080。若依前端有个细节登录成功后会在store里存用户信息、token、权限点。你在页面里看到的按钮增删靠的是v-hasPermi指令根据权限点判断显隐的。这个权限点是从后端菜单表里带出来的理解了这点后面新增页面的按钮权限配置就不会翻车。2.5 生产部署Nginx Jar包的经典组合本地跑通后生产环境最常见的部署方式是前端用Nginx托管静态文件后端打Jar包用systemd或脚本管理。前端打包时执行npm run build:prod产物在dist目录整个目录扔到服务器后Nginx配置的关键点有两个第一个是历史路由刷新404问题。Vue Router如果用的是history模式刷新页面时Nginx会拿不存在的路径去匹配返回404。要么改成hash模式要么在Nginx的location里加try_files $uri $uri/ /index.html。我习惯保留history模式并加上try_files美观且避免了hash模式的#号。第二个是接口反向代理。前端打包后不能直连后端8080端口需要让请求打到Nginx再转发到后端服务。我经常用的配置模版大概长这样server { listen 80; server_name yourdomain.com; root /usr/local/ruoyi/dist; index index.html; location / { try_files $uri $uri/ /index.html; } location /prod-api/ { proxy_pass http://127.0.0.1:8080/; 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_pass http://127.0.0.1:8080/;后面带斜杠会把/prod-api前缀剥掉不带斜杠则会带上前缀发给后端。若依后端的接口路径本身没有/prod-api前缀所以这里必须带斜杠否则会404。后端Jar包启动时指定--server.port8080前端配置里的VUE_APP_BASE_API设置为/prod-api即可。另外如果生产环境想用Tomcat部署War包需要修改ruoyi-admin/pom.xml把打包方式改成war同时继承SpringBootServletInitializer并在启动类重写configure方法。若依官方文档有说明依赖改完后mvn clean package就能出War包丢到Tomcat的webapps目录就行。个人推荐还是用Jar包Nginx的方式资源占用更低日志管理也更方便。3. 微服务版本若依Cloud的架构与部署实战3.1 RuoYi-Cloud的模块地图RuoYi-Cloud把后端拆成了若干独立服务我先给你一张模块清单再挨个说职责服务模块端口核心职责ruoyi-gateway8080统一入口路由转发、跨域处理、Token校验ruoyi-auth9200登录认证、令牌签发ruoyi-system9201用户、角色、菜单、部门等核心业务ruoyi-job9202定时任务ruoyi-file9300文件上传下载ruoyi-monitor9100服务监控基于Spring Boot AdminNacos8848注册中心 配置中心Redis6379缓存Token、验证码、权限数据网关是整个微服务的门面所有外部请求先到网关再做鉴权和路由。你可以把网关理解为写字楼的前台访客先到前台登记校验token然后前台通知对应办公室的人来接转发到具体服务。若依网关用的是Spring Cloud Gateway路由配置在Nacos的配置文件里管理而不是本地yml。微服务版的数据表结构和单体版几乎一样但每个服务各自连接同一个ry-cloud数据库。这里要留心虽然服务拆了但数据库没有做分库如果未来业务量大评论、订单之类的高并发表还是需要单独拆库的。若依Cloud本身不限制你拆库你可以把每个服务的数据源指向各自的库。3.2 Nacos安装与配置微服务版的命根子Nacos是微服务版最常见的故障点。首先需要下载Nacos服务端我建议使用1.4.x或2.2.x版本不要太高否则和Spring Cloud Alibaba的对应关系容易出问题。若依Cloud用的是Spring Cloud Alibaba 2.2.x对应的Nacos client端是1.4.x左右所以服务端装1.4.x最稳。下载解压后默认是单机模式启动命令startup.cmd -m standalone # Windows sh startup.sh -m standalone # Linux访问http://localhost:8848/nacos默认账号密码是nacos/nacos。这里有个坑Nacos默认使用内置derby数据库存储配置重启后你做过的配置修改可能丢失具体看集群模式生产环境一定要改成MySQL持久化。改的方法是在conf/application.properties里启用mysql数据源指定数据库连接串和初始化脚本conf/nacos-mysql.sql。接着处理配置导入。RuoYi-Cloud源码的sql/nacos_config.sql里装着所有服务运行需要的配置需要在Nacos控制台新建命名空间命名空间ID建议和官方文档一致然后在配置管理里把sql文件里的配置逐一导入。有些版本还提供了直接导入的入口导入后你会看到gateway.yml、auth.yml、system.yml等一组配置。Nacos里的每个dataId都是一个服务的配置。例如ruoyi-system-dev.yml就是system服务的开发环境配置。修改数据库密码、Redis地址等都去Nacos里改而不是改本地文件。本地服务启动时只保留bootstrap.yml里面写的是Nacos的连接地址和命名空间ID这一块一定要和Nacos控制台里的完全一致。3.3 服务启动顺序与验证微服务版启动顺序有讲究。我的建议是先启动Nacos再启动Redis、MySQL然后启动ruoyi-gateway最后启动auth、system、job、file等业务服务。网关启动时如果找不到服务会报错但服务注册有延迟所以如果启动顺序搞反了网关日志里会出现无法路由的警告——这时候不用急着重启网关等业务服务心跳上报后网关会自动刷新路由。前端部分和RuoYi-Vue部署方式一致唯一区别是请求前缀要指向网关的8080端口也就说Nginx里的proxy_pass指向http://127.0.0.1:8080/而不是后端的9200或9201。整个链路是浏览器 → Nginx → 网关(8080) → 微服务(9201等)。我在第一次启动RuoYi-Cloud遇到的典型问题是服务全部起来了Nacos服务列表里也能看到实例但访问登录接口报404。排查路径是先看网关日志有没有路由匹配再打开Nacos配置看一下gateway-dev.yml的路由规则发现system服务路由规则里的自定义路径写的是/system/**而前端请求的路径是/prod-api/system/user/list最终要保证逻辑上的前缀最终把请求转发到系统服务。如果网关显示服务没找到重点检查服务是否成功注册到Nacos、命名空间是否选对。3.4 微服务版的资源消耗与部署注意事项如果你打算在生产环境跑RuoYi-Cloud建议服务器配置至少4核8G因为一套服务下来网关、认证、系统、定时任务、文件服务每个都是独立的JVM进程。我试过用2核4G的机器搭了全套内存一上去就频繁GC排队时接口响应从几十毫秒变成几秒体验非常差。可以考虑的优化方案是把job服务合并进去或者数据库和应用分机器部署再或者直接用k8s管理服务但k8s本身也要吃资源小团队量力而行。RuoYi-Cloud也提供了Docker部署方式。官方文档里给了每个服务单独打镜像的Dockerfile通过docker-compose把所有服务编排成一个网络栈。这个方式适合有Docker基础的人好处是环境一次性配置好坏处是调试时日志分散在容器里排查问题要看docker logs。如果你习惯传统方式直接打包Jar再用systemd启动也一样微服务版和单体版的Jar包没本质区别。3.5 微服务版易踩的坑跨域、Feign调用与权限缓存第一件事是跨域。单体版开发时是前端代理解决生产Nginx代理解决微服务版网关自己会处理CORS但注意Nacos配置里有个spring.cloud.gateway.globalcors配置如果你改了网关配置导致CORS失效浏览器会看到跨域报错登录接口请求发不出去。排查时先确认Nginx有没有额外加跨域头如果加了且和网关跨域配置冲突去掉Nginx的跨域配置交给网关统一处理。第二件事是服务间调用无权限。微服务版里认证服务登录后签发JWT网关校验JWT后把用户信息放进请求头转发给下游服务。下游服务会通过请求头里的用户信息去缓存或数据库查权限这里链路比较长。如果你自己新写了一个微服务模块想让它调用system模块的接口需要给新服务加上feign依赖和EnableFeignClients注解同时注意透传token。若依的工具包里提供了HeaderInterceptor自动把请求头里的用户信息装配到SecurityContext新模块只要在拦截器配置里把对应路径放开即可。第三件事是权限缓存。若依的权限数据permissions默认会缓存到Redis如果你手动改了数据库的角色权限后用户不重新登录权限不会刷新。这是因为登录时已经把权限点写进Redis了后续请求直接读缓存。清理方式是删Redis里的登录用户缓存或者用若依自带的“刷新缓存”按钮。这个问题在单体版里也存在只是微服务版链路更长排查时更容易让人误解。4. 高频报错与排查技巧实录4.1 环境类问题版本兼容性报错现象原因解决办法java.sql.SQLNonTransientConnectionExceptionMySQL8连接串没有配置时区或公钥获取问题url后面加serverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltruenode-sass编译报错Node版本过高换Node 14/16或改sass为dart-sass前端vue-tsc类型报错无数Vue3 TS的项目里IDE没有正确识别路径别名检查tsconfig.json的paths配置确认指向src目录ERR_PNPM_RECURSIVE_RUN等pnpm互斥问题npm和pnpm混合使用统一包管理器删除node_modules后重新安装RuoYi-Vue3的TS报错我用过最稳的处理方案是把package.json里的vue-tsc版本降到和Vue3.2.x匹配的4.x然后npm run build之前只执行vite build跳过类型检查。这些类型报错大多是接口返回类型不匹配、路由meta类型不完整导致的短期内不影响运行。如果你有时间可以给接口注释完整类型但这种工作量对一个脚手架项目来说投入产出比不高。4.2 框架使用问题权限、匿名访问、新模块RuoYi的匿名访问配置在Spring Security的过滤链里核心是SecurityConfig里的permitAll路径列表。如果你新加的页面不想登录就能访问就要把这个路径加到白名单里。但是注意permitAll只是放行Web安全拦截如果你的Controller方法上没有Anonymous注解或没有关闭数据权限拦截登录后才能拿到的用户上下文就是空的下游代码调用SecurityUtils.getUserId()会报空指针。很多人在若依里新加模块时问为什么访问/dev-api/system/xxx/list一直401。原因大概率是路径没有被Spring Security放行也没有被网关路由到。单体版里你需要检查Controller上的PreAuthorize注解上面的hasPermi表达式直接对应数据库里的权限标识。比如PreAuthorize(ss.hasPermi(system:xxx:list))这个权限标识必须在菜单表里分配给你的角色。新加模块的标准流程是建表 → 执行代码生成器 → 生成前后端代码 → 放到对应模块 → 配置菜单和权限标识 → 给角色分配菜单。代码生成器通过连接你本地的数据源读取表结构先生成后端代码再生成前端vue文件。生成的代码质量很高但也不建议不加思考就全盘接受比如关联查询的SQL、字段校验规则这些还是要根据具体业务调整。4.3 部署问题Nginx刷新404、文件上传、日志与内存刷新404的问题前面讲过关键是try_files。文件上传的问题也很高频若依默认上传路径是ruoyi.profile配置的本地路径如果你部署后上传图片返回的URL是http://localhost:8080/...说明application.yml里的域名配置没改。生产环境要把ruoyi.profile指向一个绝对路径同时把文件服务域名和端口改成你的Nginx域名。微服务版上文件上传走的是ruoyi-file服务Nginx需要额外代理上传的文件访问路径。另外Jar包启动时的内存参数不能不管。java -jar -Xms512m -Xmx1024m ruoyi-admin.jar这种要写进启动脚本。我之前遇到过单体版每隔几天就变卡排查发现JVM默认堆内存只有256M日志里频繁告警GC。微服务版更要注意每个服务都给个独立的堆大小别全部走系统默认值。日志文件默认在当前目录的logs文件夹下如果磁盘满最容易被忽略的就是没清理的操作日志表和log文件。5. 二次开发扩展从“能跑”到“好用”5.1 集成Druid数据库密码加密若依默认用Druid连接池但数据库密码写死在yml里一旦服务器文件泄露密码就暴露了。Druid提供了ConfigTools工具可以生成公钥私钥对把数据库密码用私钥加密后配置里填加密串并指定公钥。做法是java -cp druid-1.2.x.jar com.alibaba.druid.filter.config.ConfigTools yourpassword生成后会输出公钥和密文然后把application-druid.yml里的连接配置改成spring: datasource: druid: connection-properties: config.decrypttrue;config.decrypt.key${publicKey} filter: config: enabled: trueurl里的密码换成加密后的密文。改完重启如果密文格式不对Druid启动会直接报DecryptException排查时先确认publicKey有没有被正确注入。生产环境可以把公钥放到环境变量或JVM的-D参数里不要明文写在仓库里。5.2 与外部Python处理服务联动拿企业级识别系统举例很多团队用若依做管理系统后端但真正的业务算法比如OCR识别、图像分类、深度学习模型推理是Python服务。实际场景中常见做法是若依负责业务编排、用户权限、任务管理算法部分独立部署一个或多个Python服务两边通过接口对接。我在实际项目里踩过一条血泪路一开始图省事把Python服务用Flask跑在若依同一个服务器上然后直接调用本地端口。单机没问题但是并发一高Python服务的阻塞操作直接把进程拖死整个管理系统跟着遭殃。后来改成异步模式若依收到识别请求后把任务写入数据库状态为待处理Python服务定时拉取任务处理完成后回调若依接口更新状态。整个过程前端用轮询展示任务进度。这个模式的优点是把计算密集型任务和业务系统解耦Python服务崩了不影响管理端正常使用。你要做的核心工作就是设计好两张表任务表和回调记录表再写一个轻量的任务分发器。若依的框架代码在这种情况下主要承担的是“人机交互层”和“数据管理层”算法部分完全独立。这对团队的启示是不要强行把所有技术栈塞进若依它擅长做权限管理、流程管理、数据展示把这些做好就够了。5.3 集成轻量级工作流warm-flow的接入思路传统工作流引擎Activiti重且复杂很多人觉得杀鸡用牛刀。warm-flow是一个国产轻量工作流引擎可以和若依集成。核心逻辑是流程定义可以存数据库通过若依的代码生成器把流程定义表、流程实例表、任务表相关的增删改查生成出来然后在业务代码里调用warm-flow的api发起流程、审批、驳回。它的好处是依赖少、学习成本低适合流程数量不多、流程节点相对固定的业务系统。接入时要注意的是工作流里的审批人最好和若依的角色体系结合不然审批人名单维护起来很痛苦。5.4 生产环境还能扩展什么若依本身已经内置了代码生成器、在线用户监控、定时任务、Excel导入导出等功能。生产环境如果你需要更多的能力扩展方向通常是前后端接口加签名校验防止篡改、登录加验证码以外的二次校验、操作日志里增加请求参数脱敏、发布时用Jenkins做流水线。这些我都在不同项目里实现过核心思路都是不改若依底层架子在扩展点做增强。比如操作日志脱敏只需要在Log注解解析逻辑里增加一个脱敏方法即可不用动任何表结构。6. 最后聊点实际的我个人用过若依做过的项目很多个从高校内部的管理系统到企业级算法平台的底座。每次部署新环境我都会把流程记录成一份checklist数据库版本、JDK版本、Node版本、Redis密码是否设置、Nacos命名空间是否匹配、Nginx的try_files是否配置、JVM参数是否写入启动脚本。这套流程跑下来环境问题基本能在一个小时内搞定。最想告诉大家的一句话是若依这类框架核心价值不是让你“永远不用写代码”而是让你在业务开发时不用操心基础能力但同时一定不要为了炫技去堆微服务和新技术。单体版能解决的问题就不要勉强上微服务微服务版跑起来了也不代表你真正理解了微服务还是要多想想服务拆分到底解决了什么问题、引入了哪些复杂性。把这些想清楚技术选型才不会翻车。如果你正在部署过程中遇到某个具体的报错先把日志完整看一遍再对照上面这几个高频场景排查大部分问题都能解决。实在搞不定的多看看若依社区和官方文档这个项目这么多年积累的踩坑记录已经非常丰富了。希望这篇内容能帮你少走几个弯路。
返回列表