当前位置:首页 > 物联网 > 智能应用
[导读]当边缘设备从几十台增长到几千台时,人工SSH登录巡检已成奢望。设备宕机、磁盘写满、进程僵死——任何一个问题若不能在30分钟内发现,就可能演变成生产事故。Java生态的Netty异步框架配合调度任务,可以在单台服务器上同时管理数千个设备连接,实现状态采集、阈值告警和批量操作。本文展示一个轻量级监控工具的架构设计与核心代码。


当边缘设备从几十台增长到几千台时,人工SSH登录巡检已成奢望。设备宕机、磁盘写满、进程僵死——任何一个问题若不能在30分钟内发现,就可能演变成生产事故。Java生态的Netty异步框架配合调度任务,可以在单台服务器上同时管理数千个设备连接,实现状态采集、阈值告警和批量操作。本文展示一个轻量级监控工具的架构设计与核心代码。

架构设计:中心化采集,去中心化Agent

采用经典的Server-Agent模式。Agent部署在每个边缘设备上,可以是Go编写的轻量级二进制,也可以是Shell脚本配合cron任务。Server端用Java实现,通过SSH或HTTP与Agent通信。

对于资源极度受限的设备,Agent只需每分钟上报一次JSON格式的状态数据:

{"cpu":45.2,"mem":68.1,"disk":82.3,"uptime":1234567,"processes":["java","nginx"]}

Server端接收后解析、存储、触发告警。

高并发连接管理:Netty + 线程池

使用Netty的EventLoopGroup处理网络IO,单机即可支撑数千个TCP长连接。设备上报的数据通过ChannelHandler解码后交给业务线程池处理,避免IO线程阻塞。

EventLoopGroup bossGroup = new NioEventLoopGroup(1);

EventLoopGroup workerGroup = new NioEventLoopGroup(4);

try {

   ServerBootstrap b = new ServerBootstrap();

   b.group(bossGroup, workerGroup)

    .channel(NioServerSocketChannel.class)

    .childHandler(new ChannelInitializer<SocketChannel>() {

        @Override

        protected void initChannel(SocketChannel ch) {

            ch.pipeline().addLast(new StringDecoder());

            ch.pipeline().addLast(new DeviceStateHandler());

        }

    })

    .option(ChannelOption.SO_BACKLOG, 1024)

    .childOption(ChannelOption.SO_KEEPALIVE, true);

   ChannelFuture f = b.bind(8080).sync();

   f.channel().closeFuture().sync();

} finally {

   workerGroup.shutdownGracefully();

   bossGroup.shutdownGracefully();

}

DeviceStateHandler中将数据写入阻塞队列,由后台线程批量入库。

定时采集:ScheduledExecutorService

对于不支持长连接的设备,可以使用SSH轮询。Java的ScheduledExecutorService配合JSch库实现定时采集:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);

List<Device> devices = deviceRepository.findAll();


for (Device d : devices) {

   scheduler.scheduleAtFixedRate(() -> {

       try {

           JSch jsch = new JSch();

           Session session = jsch.getSession(d.getUser(), d.getIp(), 22);

           session.setPassword(d.getPassword());

           session.setConfig("StrictHostKeyChecking", "no");

           session.connect(5000);

           ChannelExec channel = (ChannelExec) session.openChannel("exec");

           channel.setCommand("free -m | grep Mem");

           InputStream in = channel.getInputStream();

           channel.connect();

           BufferedReader reader = new BufferedReader(new InputStreamReader(in));

           String line = reader.readLine();

           // 解析Mem: total used free shared buff/cache available

           String[] parts = line.split("\\s+");

           int memUsed = Integer.parseInt(parts[2]);

           int memTotal = Integer.parseInt(parts[1]);

           double usage = (double) memUsed / memTotal * 100;

           if (usage > 90) {

               alertService.sendAlert(d.getId(), "内存使用率过高: " + usage + "%");

           }

           channel.disconnect();

           session.disconnect();

       } catch (Exception e) {

           logger.error("采集失败: {}", d.getIp(), e);

       }

   }, 0, 5, TimeUnit.MINUTES); // 每5分钟采集一次

}

对于上千台设备,每个设备一个定时任务会导致线程过多。更好的做法是使用“分片轮询”:将所有设备均匀分配到少量线程中,每个线程顺序执行一批设备的采集任务。

数据存储与告警

采集结果写入时序数据库(如InfluxDB),同时维护一个设备状态缓存(Redis)。告警规则可配置:

@Component

public class AlertChecker {

   @Scheduled(fixedRate = 60000)

   public void check() {

       List<DeviceState> states = stateCache.getAll();

       for (DeviceState s : states) {

           if (s.getCpuUsage() > 95) {

               notify("CPU告警", s);

           }

           if (s.getDiskUsage() > 90) {

               notify("磁盘告警", s);

           }

           if (System.currentTimeMillis() - s.getLastReport() > 180_000) {

               notify("设备离线", s);

           }

       }

   }

}

性能实测

在4核8G的云服务器上,使用Netty接收5000个设备的HTTP上报,CPU占用约35%,内存占用1.2GB。SSH轮询模式(每5分钟一轮)管理2000台设备,需要约50个线程,CPU峰值60%。两种模式均可满足千级规模。

写在最后

Java生态为边缘设备运维提供了从网络框架到调度任务、从数据存储到告警通知的完整工具链。Netty解决高并发连接问题,ScheduledExecutorService处理定时采集,InfluxDB存储时序数据,三者组合即可构建一个支撑上千台设备的自动化运维平台。当你的设备规模突破百台时,与其继续手工巡检,不如花两天时间搭建这套工具——它将为你节省未来无数个凌晨排查故障的夜晚。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭