若依(前后端分离版)实战:从零部署到Java-Python混合开发全攻略

📅 发布时间:2026/7/7 22:52:07 👁️ 浏览次数:
若依(前后端分离版)实战:从零部署到Java-Python混合开发全攻略
1. 环境准备从零开始的服务器与宝塔面板搭建大家好我是老张一个在Java和Python混合开发里摸爬滚打了十来年的老码农。最近公司有个新项目要用若依RuoYi这个快速开发框架搭个后台管理系统还得集成一些我们团队用Python写的AI识别算法。听起来是不是挺酷但实际操作起来特别是从零在服务器上部署那坑是一个接一个。为了让大伙儿少走弯路我把这次从买服务器到项目跑起来的完整过程特别是那些容易栽跟头的地方都详细记录下来。首先你得有一台服务器。我这次为了测试选了个性价比高的小厂云服务器系统是CentOS 7.8。为啥选CentOS稳定企业里用得多教程也全。对于新手来说直接在服务器上敲命令行配置环境门槛有点高。所以我强烈推荐使用宝塔面板它就像给你的服务器装了个图形化的“遥控器”管理网站、数据库、文件都变得跟玩电脑一样简单。你只需要在购买服务器后通过SSH工具比如Xshell、FinalShell连上去执行一行宝塔的安装命令等个几分钟就能得到一个带网址、用户名和密码的管理后台。这里有个小经验在安装宝塔时它会让你选择安装套件我一般会勾选LNMPNginxMySQLPHP或者LAMPApacheMySQLPHP。别担心我们虽然是Java项目但Nginx以后可以用来做反向代理或者部署前端MySQL更是必不可少。PHP组件可以不用管但装了也无妨。安装完成后第一件事就是去宝塔面板的安全组设置里放行你SpringBoot项目要用到的端口比如默认的8080端口还有MySQL的3306端口如果打算远程连接的话。很多朋友项目启动后死活访问不了八成就是防火墙或者安全组端口没开。2. 后端打包本地开发到服务器部署的关键一跃项目在本地比如你的Windows电脑跑得好好的怎么把它搬到服务器上呢核心就是打包。我用的是若依前后端分离版后端是基于SpringBoot的。打包本身不复杂但打包前的配置是决定成败的关键因为jar包一旦生成里面的配置文件就很难再改了。2.1 配置文件修改提前避坑在IDEA里打开你的若依项目找到ruoyi-admin模块下的resources文件夹这里有几个yml配置文件需要重点关注。首先是application-druid.yml这里配置数据库连接。你需要把里边的url、username、password都改成你服务器上MySQL的信息。比如url很可能从jdbc:mysql://localhost:3306/ry?useUnicodetrue改成jdbc:mysql://你的服务器IP:3306/ry?useUnicodetrue。记住localhost指的是本机在服务器上运行localhost就是服务器自己所以如果你MySQL装在服务器上用localhost或127.0.0.1也行这样更安全。密码千万别再用本地的测试密码了。然后是application.yml这里内容比较多要找到Redis的配置部分。若依默认用Redis做缓存和会话管理所以这块必须配对。同样把host改成你服务器的IP如果Redis也在同一台服务器用127.0.0.1password改成你打算为Redis设置的密码。我建议一开始就把密码设上养成好习惯。2.2 Maven打包与上传配置改好后就可以打包了。在IDEA右侧找到Maven工具栏展开ruoyi根项目先执行clean清理一下再执行package进行打包。这个过程会下载依赖需要一点时间。打包成功后在ruoyi-admin/target目录下就能找到那个宝贵的ruoyi-admin.jar文件。其他模块的jar包会被自动依赖进去我们只需要操作这个主jar包就行。接下来通过宝塔面板的文件管理器在你服务器的某个目录下比如/www/wwwroot/ruoyi新建一个文件夹然后把本地的ruoyi-admin.jar上传进去。你也可以用FTP工具或者SCP命令上传看个人习惯。传上去之后可以先别急着运行因为数据库环境还没准备好运行了也会报错。3. 服务器数据库配置MySQL与Redis的安装与填坑项目跑起来离不开数据库。在宝塔面板里配置数据库比纯命令行舒服太多了。3.1 MySQL安装与版本陷阱进入宝塔的“软件商店”搜索MySQL选择一个版本安装。这里我踩了第一个大坑版本一致性问题。我本地开发用的是MySQL 8.0但当时宝塔推荐安装的是5.7版本。我图省事直接装了5.7结果在导入本地导出的SQL文件时遇到了字符集错误。MySQL 8.0默认使用utf8mb4字符集和utf8mb4_0900_ai_ci排序规则而MySQL 5.7对utf8mb4_0900_ai_ci这个规则是不支持的。错误信息可能不明显但导入的数据就是不对。解决方法有两个一是在宝塔面板里卸载5.7重新安装8.0版本的MySQL推荐一劳永逸。二是如果你必须用5.7就需要在本地用文本编辑器打开你导出的.sql文件把所有的utf8mb4替换成utf8把所有的utf8mb4_0900_ai_ci替换成utf8_general_ci然后再上传导入。安装好MySQL后在宝塔的“数据库”页面创建一个新的数据库名字和你在SpringBoot配置文件里写的一致比如ry。然后点击“导入”选择你从本地导出的、并且处理好字符集问题的SQL文件。导入成功后最好用本地的Navicat之类的工具连一下服务器的数据库看看表和数据是不是都完整过来了。3.2 Redis配置与安全加固Redis的安装同样在“软件商店”完成。安装好后配置才是重点。默认的Redis配置只允许本机访问且没有密码这在生产环境是极不安全的。你需要修改Redis的配置文件。在宝塔的Redis管理页面通常有“配置修改”的选项。找到以下几行bind 127.0.0.1这行表示只允许本机连接。我们需要让Java程序能连上它所以可以把它改成bind 0.0.0.0允许所有IP连接有一定风险需配合防火墙或者更安全的做法是如果Java项目和Redis在同一台服务器就保持127.0.0.1不动这样最安全。protected-mode yes保护模式。如果bind注释了或改成了0.0.0.0保护模式必须关掉即设为protected-mode no否则还是连不上。# requirepass foobared找到这一行去掉开头的注释#并把foobared改成你自己设定的复杂密码。这个密码要和前面application.yml里配置的Redis密码一致。daemonize no确保这一项是daemonize yes这样Redis才能以守护进程方式在后台运行。改完配置一定要重启Redis服务使其生效。之后你可以在宝塔的“安全”页面设置防火墙规则只允许特定的服务器内网IP访问Redis的6379端口这样安全性就高多了。4. 启动与守护让SpringBoot服务稳如泰山数据库都就位了现在可以启动我们的SpringBoot项目了。通过宝塔的“终端”或者你的SSH工具进入到刚才上传ruoyi-admin.jar的目录。直接运行java -jar ruoyi-admin.jar如果看到控制台输出若依那个经典的“佛祖”启动图案并且没有报错最后显示“Started Application in X seconds”那么恭喜你后端服务启动成功了你可以用浏览器访问http://你的服务器IP:8080试试注意防火墙放行8080端口。但是这样启动有个问题一旦你关闭SSH终端这个Java进程也就跟着结束了。我们需要让它能在后台持续运行。这里推荐两个方法方法一使用nohup命令这是Linux下最常用的后台运行方式。nohup java -jar ruoyi-admin.jar app.log 21 解释一下nohup让命令忽略挂断信号 app.log把标准输出重定向到app.log文件21是把标准错误也重定向到标准输出也就是同一个日志文件最后的表示后台运行。运行后你可以用tail -f app.log来实时查看启动日志。方法二配置为系统服务推荐这种方式更专业可以设置开机自启用systemctl命令管理启动、停止、重启、查看状态。创建一个服务文件sudo vim /etc/systemd/system/ruoyi.service写入以下内容根据你的实际路径修改[Unit] DescriptionRuoYi Service Afternetwork.target [Service] Typesimple Userroot WorkingDirectory/www/wwwroot/ruoyi ExecStart/usr/bin/java -jar ruoyi-admin.jar Restarton-failure RestartSec10 [Install] WantedBymulti-user.target保存后执行sudo systemctl daemon-reload sudo systemctl start ruoyi sudo systemctl enable ruoyi # 设置开机自启现在你可以用sudo systemctl status ruoyi来查看服务状态管理起来非常方便。5. CentOS上的Python环境搭建为AI能力铺路若依后端跑起来了但我们的目标是Java-Python混合开发。服务器是CentOS自带的Python版本通常是2.7或较低的3.x而我们做AI开发往往需要Python 3.7甚至3.9。所以第一步就是安装一个独立的、干净的Python高版本。我强烈建议使用pyenv来管理Python版本或者直接编译安装。为了简单直观这里演示编译安装Python 3.9。首先安装编译所需的依赖包yum groupinstall -y Development Tools yum install -y openssl-devel bzip2-devel libffi-devel sqlite-devel然后下载Python源码并编译cd /usr/src wget https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tgz tar xzf Python-3.9.16.tgz cd Python-3.9.16 ./configure --enable-optimizations --enable-shared make altinstall注意这里用的是make altinstall而不是make install是为了防止替换掉系统自带的python命令避免引起系统工具依赖问题。安装完成后新的Python 3.9解释器位于/usr/local/bin/python3.9。你可以通过python3.9 --version来验证。为了让系统能找到这个Python的共享库还需要设置一下环境变量echo /usr/local/lib /etc/ld.so.conf.d/python3.conf ldconfig6. Python依赖库安装攻克dlib等“硬骨头”AI脚本常用的库比如opencv-python、numpy、pandas这些用pip3.9 install安装通常比较顺利。但dlib这个库是个著名的“钉子户”因为它依赖C编译环境和一些系统库。在CentOS上安装dlib需要先满足它的依赖yum install -y cmake gcc-c boost-devel如果项目需要人脸识别相关功能可能还需要安装图像处理库yum install -y libjpeg-turbo-devel libpng-devel依赖装好后终于可以安装dlib了。我实测下来直接用pip安装预编译的wheel文件最容易成功但需要找到对应系统Linux和Python版本cp39的whl文件。如果找不到那就只能从源码编译命令如下pip3.9 install dlib这个过程会比较慢因为它在本地编译。如果遇到内存不足可以尝试在编译前临时增加交换空间swap。安装成功后写个简单的Python脚本import dlib测试一下不报错就成功了。为了管理项目的依赖最好在服务器上也使用虚拟环境venvcd /path/to/your/python_project python3.9 -m venv venv source venv/bin/activate (venv) pip install -r requirements.txt # 把你的依赖列表放在这个文件里虚拟环境能很好地隔离不同项目间的包版本避免冲突。7. Java调用Python脚本跨语言通信实战环境都配好了最后一步就是让Java程序能调用写好的Python脚本。这里有几个主流方案我挨个说说我的使用感受。方案一Runtime.exec() 直接调用最简单直接这是Java最原生的方式适合调用简单的、一次性的脚本。Process process Runtime.getRuntime().exec(new String[]{ /www/wwwroot/venv/bin/python, // Python解释器路径如果是虚拟环境 /www/wwwroot/scripts/your_script.py, arg1, arg2 // 传递给Python脚本的参数 }); // 获取脚本输出 BufferedReader reader new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line reader.readLine()) ! null) { System.out.println(line); } int exitCode process.waitFor(); // 等待脚本执行完成这种方式好处是简单但缺点也很明显每次调用都启动一个全新的Python进程开销大数据传输只能通过标准输入输出或文件效率低错误处理也比较麻烦。方案二使用ProcessBuilder更灵活ProcessBuilder比Runtime.exec()提供了更精细的控制比如设置工作目录、环境变量等特别适合需要特定环境如虚拟环境的脚本。ProcessBuilder pb new ProcessBuilder( /www/wwwroot/venv/bin/python, your_script.py, arg1 ); pb.directory(new File(/www/wwwroot/scripts)); // 设置工作目录 MapString, String env pb.environment(); env.put(PYTHONPATH, /www/wwwroot/venv/lib/python3.9/site-packages); // 设置Python路径 Process process pb.start(); // ... 后续读取输出和waitFor与上面类似方案三使用Jython不推荐用于AI项目Jython是一个让Python运行在JVM上的实现。听起来很美好但它的版本通常落后于CPython而且最关键的是它无法使用基于C扩展的第三方库比如numpy,opencv,dlib。这对于AI项目来说是致命的所以基本可以排除。方案四使用Socket/HTTP通信解耦推荐对于复杂的、需要频繁调用的AI服务我强烈推荐将Python脚本包装成一个独立的HTTP服务比如用Flask或FastAPI然后Java端通过HTTP客户端如Spring的RestTemplate或OkHttp来调用。 Python端Flask示例from flask import Flask, request, jsonify import your_ai_module app Flask(__name__) app.route(/predict, methods[POST]) def predict(): data request.json result your_ai_module.process(data[input]) return jsonify({result: result}) if __name__ __main__: app.run(host0.0.0.0, port5000)Java端SpringBoot中RestController public class AiController { Autowired private RestTemplate restTemplate; PostMapping(/call-ai) public String callAiService(RequestBody InputData data) { String url http://localhost:5000/predict; // 将数据发送给Python服务 ResponseEntityResult response restTemplate.postForEntity(url, data, Result.class); return response.getBody().getResult(); } }这种方式好处太多了语言完全解耦Python和Java可以独立部署、升级通信协议标准可以利用HTTP的负载均衡、服务发现等成熟生态。是生产环境的首选。8. 混合开发中的典型问题与调优在实际跑起来之后你可能会遇到一些共性问题。我这里分享几个我踩过的坑和解决办法。问题一Python脚本执行超时或内存溢出。AI模型推理尤其是图像识别可能很耗时间和内存。在Java中调用时一定要设置超时限制并监控进程资源。对于Runtime.exec可以使用process.waitFor(long timeout, TimeUnit unit)设置超时。对于HTTP调用可以在RestTemplate或HTTP客户端配置中设置连接超时和读取超时。在服务器上使用top或htop命令监控Python进程的内存和CPU占用必要时对算法或模型进行优化如量化、使用更轻量级的模型。问题二中文乱码问题。Java和Python之间通过控制台或文件传递数据时经常出现中文乱码。确保两端使用统一的字符编码如UTF-8。在Java中创建Process时指定环境变量LANGen_US.UTF-8或zh_CN.UTF-8。在Python脚本开头显式指定编码# -*- coding: utf-8 -*-。读写文件时明确指定encodingutf-8。问题三依赖库版本冲突。你的本地开发环境可能是WindowsAnaconda和服务器环境CentOS手动安装的库版本可能不一致导致脚本在本地正常在服务器报错。使用pip freeze requirements.txt精确导出本地所有包的版本。在服务器的虚拟环境中用pip install -r requirements.txt安装确保版本一致。对于像OpenCV、TensorFlow这类对系统库有依赖的包在Linux上可能需要安装额外的系统包如libgl1-mesa-glx具体看错误提示。问题四性能瓶颈。频繁启动Python进程开销巨大。如果必须采用进程调用方式可以考虑使用进程池预启动几个Python进程或者采用上面提到的HTTP服务常驻内存方式。对于计算密集型任务确保服务器有足够的CPU和内存资源。也可以考虑使用消息队列如RabbitMQ、Kafka将任务异步化Java发送任务到队列Python worker从队列取任务执行再返回结果这样可以平滑流量高峰提高系统整体吞吐量。整个流程走下来从纯净的CentOS服务器到宝塔面板管理再到SpringBoot项目部署、Python环境搭建、混合调用调试每一步都需要耐心和细心。尤其是环境配置和跨语言调用部分最容易出问题。我的经验是做好每一步的验证比如装完Python马上import测试配完Redis就用命令行redis-cli连一下Java调用前先用简单的print(“hello”)脚本测试通道是否畅通。把大问题分解成一个个小步骤每个步骤确认无误后再往下走这样即使遇到错误也更容易定位和解决。混合开发听起来复杂但拆解之后其实就是各个组件的熟练拼接。希望这篇超详细的记录能帮你顺利搭起自己的系统。