Netty中简单的Metric的实现 | 七日打卡

808 阅读2分钟

前言

上篇文章中(Netty简单介绍 | 七日打卡),对于Netty进行了简单的一个介绍,让大家对此基础有一定的了解,接下来讲解下其中我们如何自定义的实现Metric监控(当然粘包问题也很重要,但是只要了解到传输过程中,消息体如何切分以及合并,再看看对应的解决方法即可完成)。

Metric的实现

针对于Metric的实现,我们首先需要了解到市面上有哪些基础依赖提供如此功能,这里就选择dropwizard去实现。

主要依赖部分

主要部分依赖:

        <dependency>
            <groupId>io.dropwizard.metrics</groupId>
            <artifactId>metrics-core</artifactId>
            <version>4.1.17</version>
        </dependency>

        <dependency>
            <groupId>io.dropwizard.metrics</groupId>
            <artifactId>metrics-jmx</artifactId>
            <version>4.1.17</version>
        </dependency>

        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.56.Final</version>
        </dependency>

主要代码编写

Metric类的实现:

@ChannelHandler.Sharable
public class MetricHandler extends ChannelDuplexHandler {

    private AtomicLong totalNum = new AtomicLong(0);// 连接总数

    {	
        MetricRegistry metricRegistry = new MetricRegistry();
        metricRegistry.register("totalNum",new Gauge<Long>(){
            @Override
            public Long getValue() {
                return totalNum.longValue();
            }
        });
        // 方案一
        ConsoleReporter build = ConsoleReporter.forRegistry(metricRegistry).build();
        build.start(5, TimeUnit.SECONDS);
		
        // 方案二
        JmxReporter build1 = JmxReporter.forRegistry(metricRegistry).build();
        build1.start();

    }
	
    // 连接数的增加
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        totalNum.incrementAndGet();
        super.channelActive(ctx);
    }
	
    // 连接数的减少
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        totalNum.decrementAndGet();
        super.channelInactive(ctx);
    }
}

上面的MetricHandler主要是用来进行连接数的展示,里面有个变量记录连接数的变化。同是这里实现了两种Metric展示,一种是控制台5秒自动刷新,还有一种是通过MBean进行查看。

展示效果

控制台查看:

MBean查看:

这边我就是从一个客户端连接启动的,所以这里面的数量是1(自己实现可以启动多个Client去尝试)。

总结

上面是进行一个简单的Metric实现,同时也是一个实时的追踪,本地自己可以实现一个追踪数据的存储,然后实现对应的数据图表,使得我们能够很好的看出来整个服务内部的一个情况变化。(上述的代码可以再netty-sample去下载)