前言
上篇文章中(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去下载)