Netty消息分发

作者: Spirit_wolf | 来源:发表于2017-07-15 00:11 被阅读277次

socket的路由机制是怎么实现的 - 开源中国社区

www.oschina.net/question/2744623_2238825

类似这种的问题,总有一些新人朋友在问。这篇文章分享一下我所知道的思路。

我所想到的有4种解题方法:

协议格式

第一种方式,最简单的方法就是写switch,两组switch嵌套,来分发消息到哪个类的哪个函数处理,具体就不多解释了,显然这不是我们想要的写法。

第二种方式,使用XML配置判断消息去哪个类来处理,到处理的具体类里面还是写switch来判断去哪个函数处理。

处理大协议号的XML 小协议号switch处理

上图的XML配置是我之前做的项目里用的,去哪个类来处理消息,使用该配置文件,在服务器启动的时候根据XML反射创建处理类对象,然后在某个具体类里面处理消息还是使用的switch来判断。显然这种也不是我们想要的处理方式,能不能更优雅一点,比如整成类型SpringMVC那样的操作方式,在类和函数分别上面加上注解来处理消息的分发呢?答案是可以的。

第三中方式,借助spring自定义注解来实现消息的分发,类似SpringMVC的处理方式。

定义大协议号注解

定义小协议号注解 handler扫描器

实现BeanPostProcessor接口,在Bean初始化后对其进行扫描,找出大小协议号。

命令执行器 命令执行器管理者

使用就和SpringMVC的方式类似了,在接口和函数上分别添加注解。

添加注解
实现接口,处理消息

完整代码:

git.oschina.net/Spirit_wolf/chat_netty4

上面使用Spring的方式使用反射可能在内存性能方面的问题。

第四种方式,使用JDK8的method reference新特性,性能上可能比第3种方式好,但是开发效率上没第3种方式方便。

interface Handler{

void handler(ISession session, IByteBuffer data);

}

Map map

map.put(CREATE, this::createRole)

相关文章

网友评论

  • 054c9195dfe2:你好,请问第四种方式能详细点吗?感觉有点乱。

本文标题:Netty消息分发

本文链接:https://www.haomeiwen.com/subject/qpywhxtx.html