基于Spring Boot/React的远程遗留仿真工具执行方案优化咨询
问题
我们有一个基于Spring Boot/React的Java Web应用,负责收集用户输入,通过共享JSON文件在远程机器上执行遗留仿真工具(该工具不支持HTTP调用,目前采用SSH方案),但当前设计存在以下瓶颈:
- 为避免SSH手动密钥/密码认证,实现了Kerberos票据认证,但在Windows更新、用户修改密码场景下频繁失效;
- 输入与结果以JSON文件存储在指定目录,工作流通过匹配目录名的ID进行处理;
- 监控流程繁琐低效:部分工作流需运行数小时至数天,需同步
Running/UpToDate/Completed/Error状态。当前通过SSH将远程日志/进度同步到服务器文件,用户需手动点击刷新,应用再检查目录文件更新,步骤繁琐且因跨机器文件拷贝速度慢; - 询问是否有优化当前设计的可行方案。
此外还有两个补充问题:
- 了解到TCP/IP、RPC等远程通信方案,单一应用中混合使用HTTP与TCP/IP是否可行?
- 当前使用Waffle SSO结合Spring Security,如何在不降低安全性的前提下实现TCP/IP通信?
优化方案与解答
一、SSH认证瓶颈优化
- 替换Kerberos为SSH证书认证:使用SSH CA(证书颁发机构)生成短期证书,替代票据认证。证书有效期可配置(如1天/7天),避免密码修改、系统更新导致的票据失效问题。Spring Boot中可通过
sshj或JSch库集成证书认证逻辑,无需用户手动干预密钥管理。 - 使用无密码SSH密钥对+密钥托管:生成机器级别的SSH密钥对(而非用户级),将公钥部署到远程仿真机器的
authorized_keys中,私钥加密存储在Spring Boot应用的配置中心(如Spring Cloud Config)或密钥管理服务,避免用户密码变更影响认证。
二、文件共享与工作流调度优化
- 替换共享JSON文件为轻量消息队列:用RabbitMQ或Redis队列传递工作流请求,远程机器部署一个常驻的Spring Boot服务(或轻量守护进程)监听队列,收到请求后直接触发仿真工具,无需依赖目录文件匹配。输入参数可序列化后通过队列传递,结果直接回调Web应用的HTTP接口,完全摆脱文件共享的耦合。
- 工作流ID关联优化:如果必须保留文件存储,可将工作流ID作为文件的元数据(而非目录名),用分布式文件系统(如MinIO)统一存储输入/结果文件,远程机器通过API拉取/推送文件,避免跨机器目录同步的问题。
三、监控流程优化
- 主动推送替代被动拉取:在远程仿真工具的启动脚本中集成进度上报逻辑,通过HTTP/WebSocket主动向Web应用上报状态、日志、进度百分比。Web应用用WebSocket与React前端建立长连接,实时推送状态更新,无需用户手动刷新。
- 使用轻量监控代理:在远程机器部署一个轻量代理进程,监听仿真工具的输出日志,解析进度信息后通过TCP或HTTP上报到Web应用的监控服务,避免SSH同步日志的开销。
四、混合HTTP与TCP/IP的可行性
完全可行。Spring Boot支持同时启动HTTP(Tomcat/Undertow)和TCP服务:
- 可通过
@EnableSocket或Netty集成TCP服务,处理远程机器的状态上报、命令触发等低延迟场景; - HTTP服务负责处理前端React的用户请求、页面渲染等业务;
- 两者共享Spring容器的上下文(如安全认证、配置信息),无需拆分应用。
五、Waffle SSO下的TCP通信安全实现
要在不降低安全性的前提下实现TCP通信,可采取以下方案:
- 基于令牌的认证:TCP连接建立时,远程客户端先向Web应用的HTTP接口请求一个短期访问令牌(JWT),该令牌通过Waffle SSO的认证逻辑生成(验证用户/机器身份)。TCP客户端将令牌发送给TCP服务端,服务端调用Spring Security的认证逻辑校验令牌有效性。
- TCP连接加密:用TLS加密TCP通信,证书可由企业内部CA颁发,避免明文传输敏感数据。Spring Boot的TCP服务可通过Netty配置TLS上下文,与Waffle SSO的安全策略对齐。
- 机器身份认证:如果是机器间的TCP通信,可使用客户端证书认证,将远程机器的证书加入信任列表,结合Waffle的用户认证,实现双重身份校验。
内容的提问来源于stack exchange,提问作者Chandru
相关产品推荐
相关产品推荐

