文档章节

Netty的UDP多线程源码改造分析

强子大叔的码田
 强子大叔的码田
发布于 2015/12/03 17:57
字数 502
阅读 811
收藏 1

参考:

http://m.oschina.net/blog/527583?from=timeline&isappinstalled=1

https://lwn.net/Articles/542629/

http://www.tuicool.com/articles/Rry6biF

http://www.blogjava.net/yongboy/archive/2015/02/25/423037.html  !!!

 

默认情况下,用Netty-4.0.33 ,启动的线程只有1个。

但是现网的流量确实比较大怎么办?

就需要去改造源码。

==========

经过分析,注册udp channel的线程栈如下所示:

经过源码排查,

at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:48)
 at io.netty.channel.MultithreadEventLoopGroup.register(MultithreadEventLoopGroup.java:64)

问题在这里,如果去看源码就知道

找到原因,就好办了,前进的方向也就有了!

=================================

修改方案:

1 添加一个参数

io.netty.channel.ChannelOption添加如下: 

public static final ChannelOption<Boolean> SO_REUSEPORT = valueOf("SO_REUSEPORT");

 

2使用起来这个参数

启动框架里添加这么一行

.option(ChannelOption.SO_REUSEPORTtrue

同时也添加

.option(ChannelOption.SO_REUSEADDRtrue)

 

 

 

3 触发多次绑定操作

主函数修改后的代码如下: 

public void start() {

int totalThreads = SystemPropertyUtil.getInt("io.netty.eventLoopThreads",

Runtime.getRuntime().availableProcessors() * 2);

EventLoopGroup group = new NioEventLoopGroup(totalThreads);

try {

Bootstrap b = new Bootstrap();

b.group(group).channel(NioDatagramChannel.class)

.option(ChannelOption.SO_BROADCASTtrue)

.option(ChannelOption.SO_REUSEADDRtrue)

.option(ChannelOption.SO_REUSEPORTtrue)

.handler(new UDPServerHandler());

 

ChannelFuture futures[] = new ChannelFuture[totalThreads];

for (int i = 0; i < totalThreadsi++) {// 为了启动相应的线程

futures[i] = b.bind(port).sync();

}

for (int i = 0; i < totalThreadsi++) {// 为了等待相应的线程关闭

futures[i].channel().closeFuture().await();

}

 

catch (InterruptedException e) {

logger.error(""e);

finally {

group.shutdownGracefully();

}

}

 

4 异常处理

此时报异常:

这个异常倒是很奇怪。

这个问题怎么解决呢。。。

 

把主函数的代码修改下

.handler(new UDPServerHandler());这个是必须要保留的,否则会报错。

 

然后在类io.netty.bootstrap.Bootstrap.init(Bootstrap.java:182)

这里的代码从p.addLast(handler());修改成

p.addLast(new UDPServerHandler());

 

再来测试看看:成功启动了。

至少线程启动了。

 

客户端发点数据看看结果:

发现始终是同一个线程处理,这个问题就比较麻烦,我们的客户机是同一个主机。

 

这个问题怎么解决呢?

看到一个文章: http://blog.csdn.net/dog250/article/details/17061277

至少可以在发送端设置不同的端口解决这个问题,性能可以提升,有兴趣的自己试验下。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

强子大叔的码田

强子大叔的码田

粉丝 910
博文 1439
码字总数 1221048
作品 9
南京
架构师
私信 提问
Java系列文章(全)

JVM JVM系列:类装载器的体系结构 JVM系列:Class文件检验器 JVM系列:安全管理器 JVM系列:策略文件 Java垃圾回收机制 深入剖析Classloader(一)--类的主动使用与被动使用 深入剖析Classloader(二...

www19
2017/07/04
0
0
Netty 源码分析之 三 我就是大名鼎鼎的 EventLoop(一)

目录 源码之下无秘密 ── 做最好的 Netty 源码分析教程 Netty 源码分析之 番外篇 Java NIO 的前生今世 Java NIO 的前生今世 之一 简介 Java NIO 的前生今世 之二 NIO Channel 小结 Java NIO...

永顺
2017/11/29
0
0
NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

前言 NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2、而Netty的主要版本是Netty3和Netty4(Netty5已经被...

JackJiang-
2016/06/24
587
0
NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo。服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了。同时...

JackJiang-
2016/06/28
689
0
Netty实战入门详解——让你彻底记住什么是Netty(看不懂你来找我)

一、Netty 简介 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层...

爱码小士
06/14
169
0

没有更多内容

加载失败,请刷新页面

加载更多

《JAVA核心知识》学习笔记 (21. JAVA 算法)

21. JAVA 算法

Shingfi
30分钟前
4
0
redis 命令

redis 秒杀用到的 原子锁 :$redis->decr('jili_reward_goods_stock_' . $gifts_id) redis 秒杀用到的原子锁在秒杀过程中库存量增加 $redis->incrBy('key1', 10); redis 键查看重复:$redis-......

小小小壮
30分钟前
4
0
像智能手机一样管理云端应用:阿里云联合微软全球首发开放应用模型(OAM)

2019 年 10 月 17 日上午 9 点 15 分,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟在 QCon 上海《基于云架构的研发模式演进》主题演讲中,正式宣布: “今天,我们同微软联合发布...

阿里巴巴云原生
39分钟前
4
0
SpringBoot配置数据源

默认数据源 Springboot默认支持4种数据源类型,定义在 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 中,分别是: org.apache.tomcat.jdbc.pool.DataSource......

Gx_ww
42分钟前
4
0
Java应用在docker环境配置容器健康检查

在《极速体验docker容器健康》一文已体验了docker容器健康检查功能,今天就来给java应用的容器加入健康检查,使应用的状态随时都可以被监控和查看。 实战环境信息 操作系统:macOS Catalina ...

程序员欣宸
44分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部