欢送微信搜寻并关注“小猴子的技术笔记”公众号 私信我 支付丰盛的视频学习材料!
对于之前学习 Netty 始终都是处于实践阶段,并没有太多的生产教训。搜查一些实战我的项目也发现大多是弹幕或者聊天。为了测验学习效果,就编写了一套弹幕零碎放在公网上,通过理论拜访来解决和学习 Netty。
弹幕零碎应用的是 SpringBoot-2.4.3、Thymeleaf、Netty、WebSocket 目前曾经放到私有云上近一个月之久,抗住了不同级别的攻打,能够用于理论的生产之中。
我的项目地址:“http://barrage.houry.top:8080…
开源地址:“https://gitee.com/MonkeyBroth…
对于弹幕零碎的打造我这里总结几个点,心愿大家在利用其余畛域的时候也可能留神到。
首先:咱们在创立“EventLoopGroup”的时候须要自定义咱们的线程工厂。之所以要自定义咱们的线程工厂就是因为,如果未来零碎产生异样了,我心愿在日志中可能看到是哪个线程池产生的异样!“EventLoopGroup”的结构参数是反对咱们传入自定义的线程工厂的。
就像上面这样,我为 boss 和 worker 线程池别离指定了名字。
EventLoopGroup boss = new NioEventLoopGroup(1,new NettyThreadFactory("netty-boss"));
EventLoopGroup worker = new NioEventLoopGroup(2, new NettyThreadFactory("netty-worker"));
另外,咱们还须要配置一下咱们的“logback.xml”中打印日志长度的配置,如果应用默认值的话,那么就会呈现像上面这样的状况:日志信息残缺不全。
其次,咱们晓得 Websocket 和咱们的 Netty 服务是长链接,所以肯定要做心跳检测。兴许有些人会纳闷,我不做心跳检测也可能检测到连贯的断开和连贯啊?是的,的确是可能检测到的。不过更过的时候咱们的心跳检测一个是为了开释资源,一个是为了杜绝歹意连贯占用资源!
就好比这样的一个例子:网络上有人是能够通过程序扫描服务器 IP 和端口的,而后歹意建设 Socket 连贯并且不传输任何信息。短暂继续的建设连贯,服务器的文件描述符终究会被耗尽。有其余真正的业务再上来的时候就没有方法在进行连贯了,也就是说:服务器变相瘫痪了!这在生产中是一个很重大的问题,因而肯定要应用心跳检测来判断用户的连贯是否还在存活,如果不存活就间接剔除,开释资源。
我上面给出了一个简略的心跳检测的例子,也是我云服务器上目前在跑的一个代码。我这里就是判断了如果 10 秒之内没有任何的数据传输进来,我就给他敞开调相应的 channel 通道。
pipeline.addLast("idleStateHandler", new IdleStateHandler(10, 0, 0, TimeUnit.SECONDS));
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {if (evt instanceof IdleStateEvent) {IdleStateEvent event = (IdleStateEvent) evt;
switch (event.state()) {
case READER_IDLE:
log.info("[ 没有接管到:{} 的信息心跳信息,将断开连接回收资源 ]", ctx.toString());
ctx.channel().close();
break;
case WRITER_IDLE:
log.info("写闲暇");
break;
case ALL_IDLE:
log.info("读写闲暇");
break;
default:
log.info("非法状态");
throw new IllegalStateException("非法状态!");
}
}
}
而后在生产上一段时间之后,就能够发现:互联网还是不平安啊!我的服务常常被扫描,而后歹意建设连贯。如果没有心跳检测机制的话,那么零碎预计早就瘫痪了。
既然加了心跳检测,那么一旦有连贯上来,前端就须要有定时工作来进行数据的发送了。至于发送的工夫距离和发送的内容,能够依据本人的需要来定义。
与之对应的就是咱们在 Netty 读的时候须要对数据类型做一个判断,如果是心跳信息那么就间接过滤掉。
须要留神的点就这么多了,大家能够去下载源码进行钻研,也能够和我一起探索,。也心愿你从中学到货色之后分享给大家。
欢送微信搜寻并关注“小猴子的技术笔记”公众号 私信我 支付丰盛的视频学习材料!