Spring项目主应用HUB启动时如何正确启动附属服务及H2数据库并监控
Eureka能力说明
Eureka是纯服务发现组件,仅负责服务注册、心跳检测、实例状态同步,原生不支持服务启停控制能力,你只能通过Eureka查询服务实例的在线状态、地址端口等信息,无法通过Eureka直接启动或停止服务。
最优实现方案
1. 服务启停与进程管控方案
你原来的Process启动方案只需要做少量改造就能解决进程无管控的问题:
- 启动流程优化:
- HUB启动时改用
ProcessBuilder拉起connector、H2等附属进程,启动成功后立即记录每个进程的元数据:进程PID、服务名、绑定端口、启动时间、Process实例引用,存储在HUB的本地内存Map中,需要持久化可写入本地配置文件 - 所有附属服务在Eureka注册时,在实例元数据中新增
PID、launcher两个字段,launcher标注是HUB自动拉起还是用户手动外部启动
- HUB启动时改用
- 停止流程优化:
- 对于HUB主动拉起的服务:直接通过持有的
Process实例调用destroy()方法终止,或者通过记录的PID执行系统命令终止:Windows执行taskkill /PID {pid} /F,Linux/Mac执行kill -9 {pid},终止完成后同步从Eureka下线对应实例 - 对于外部手动启动的服务:在每个附属服务中引入Spring Boot Actuator,开启带权限校验的
shutdown端点(配置仅允许HUB的IP访问),HUB从Eureka拿到服务实例地址后,调用该端点即可实现远程终止
- 对于HUB主动拉起的服务:直接通过持有的
2. H2内存监控方案
根据你H2的启动方式选择对应方案:
- 若H2为嵌入式随HUB启动:
直接执行H2内置SQL查询实时内存占用:SELECT * FROM INFORMATION_SCHEMA.SESSION_STATE WHERE KEY = 'MEMORY_USED',也可以通过JVM的MemoryMXBean过滤H2相关的堆内存占用 - 若H2为独立Server进程启动:
通过进程PID调用com.sun.management.OperatingSystemMXBean的getProcessMemoryUsage(long pid)方法直接获取H2进程的物理内存、虚拟内存占用,跨平台兼容
进阶优化(可选)
如果后续附属服务数量增多,不想自己维护进程管控逻辑,可以引入轻量级本地进程管理组件Spring Cloud Deployer Local,原生支持jar包的生命周期管理、进程监控、异常自动重启,可直接对接你的Eureka注册中心,无需额外改造成本。
内容的提问来源于stack exchange,提问作者WBLord
相关产品推荐
相关产品推荐

