Netty 中的流控与统计
Contents
Netty 流量相关的包
io.netty.handler.traffic
ChannelTrafficShapingHandler
: Channel 级别的GlobalChannelTrafficShapingHandler
: 全局级别的(无论打开多少Channel) 以及 每条 Channel 级别的GlobalTrafficShapingHandler
: 全局级别的
具体构造, 可以参考它们的相关构造函数和参数.它们都有与之相关的说明
使用示例
package hello;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.handler.codec.http.HttpRequestDecoder;
import io.netty.handler.codec.http.HttpResponseEncoder;
import io.netty.handler.traffic.GlobalTrafficShapingHandler;
import io.netty.handler.traffic.TrafficCounter;
import io.netty.util.concurrent.DefaultEventExecutorGroup;
import io.netty.util.concurrent.EventExecutorGroup;
import java.util.concurrent.TimeUnit;
public class AppChannelInializer extends ChannelInitializer {
private static final EventExecutorGroup EXECUTOR_GROUOP = new DefaultEventExecutorGroup(Runtime.getRuntime().availableProcessors() * 2);
static {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
TrafficCounter trafficCounter = trafficHandler.trafficCounter();
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
final long totalRead = trafficCounter.cumulativeReadBytes();
final long totalWrite = trafficCounter.cumulativeWrittenBytes();
System.out.println("total read: " + (totalRead >> 10) + " KB");
System.out.println("total write: " + (totalWrite >> 10) + " KB");
System.out.println("流量监控: " + System.lineSeparator() + trafficCounter);
}
}
}).start();
}
private static final GlobalTrafficShapingHandler trafficHandler = new GlobalTrafficShapingHandler(EXECUTOR_GROUOP, 30, 30);
@Override
protected void initChannel(final Channel ch) {
ChannelPipeline p = ch.pipeline();
p.addLast(trafficHandler);
p.addLast(new HttpRequestDecoder());
p.addLast(new HttpResponseEncoder());
p.addLast(EXECUTOR_GROUOP, new HelloHandler());
}
}