求关注
如果你觉得你对文章有兴趣可以点击上方关注哦!
如果想要内推阿里或其他主流公司请带简历私我邮箱(still-fantasy-jay@qq.com)
编者语
如果把java的世界比作是江湖的话,真可谓是百家争艳,豪杰云集。笔者是java研发出生,但是写的博文尽可能站在科技与人文的角度去品评java世界。代码的世界里,从来没有黑夜,上线、迭代、debug、写bug、修bug……如此循环往复,构成了如今纷繁复杂的java宇宙。
Netty:天下武功,唯快不破
李小龙曾经有句名言:天下武功,无坚不破,唯快不破。在java江湖里,快不仅意味着高并发,低延迟更意味着高可用,高吞吐。
java江湖里有一位神通广大却非常接地气的神仙,就像《西游记》里掌管一方风水的土地公公,不仅大圣随叫随到、从不怠慢,而且无所不知,神通广大。这个神通广大的神仙就是大名鼎鼎的Netty。
何方神圣
1、Netty是基于Java NIO的网络应用框架,client-server框架;
2、Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果;
3、作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,
一些业界著名的开源组件也基于Netty的NIO框架构建;
netty立足于互联网的通讯端,采用基于NIO的高吞吐设计,封装了网络通讯常用的TCP、UDP等各项协议。由于其卓越的性能和对网络编程良好的支持,使得其应用场景非常之广泛。
两大武功
传统的java网络交互方式存在以下两大弱势:
1.网络传输(网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式);
2.对象持久化(对象必须在JVM中存活,不可能超过JVM的生命周期);
而netty恰恰针锋相对地解决了以上两个痛点:
1.基于NIO的I/O方式极大地提高了网络传输的吞吐量,并且灵活支持各种网络通讯协议,易于拓展和维护;
2.对象持久化技术的拓展能力:有别于java的序列化方式的性能和资源占用等问题,netty支持对象序列化技术的拓展,开发者可以灵活地选用各类序列化框架;
java NIO示意图
主流的编解码框架:
1.JBoss的Marshalling包:
对jdk默认的序列化进行了优化,又保持跟java.io.Serializable接口的兼容,同时增加了一些可调的参数和附加特性,
并且这些参数和特性可通过工厂类的配置
1.1 可拔插的类解析器,提供更加便捷的类加载定制策略,通过一个接口即可实现定制。
1.2 可拔插的对象替换技术,不需要通过继承的方式。
1.3 可拔插的预定义类缓存表,可以减少序列化的字节数组长度,提升常用类型的对象序列化性能。
1.4 无须实现java.io.Serializable接口
1.5 通过缓存技术提升对象的序列化性能。
1.6 使用非常简单
2.google的Protobuf
3.基于Protobuf的Kyro
4.MessagePack框架
Netty最佳实践
说道netty的最佳实践,最为出名的就是RPC了。
1、要解决通讯的问题
坦率的讲,主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。
2、要解决寻址的问题
也就是说,A服务器上的应用怎么告诉底层的RPC框架,
如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。
比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。
如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。
3、要解决编解码的问题
当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。
同样的,B服务器收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。
参考资料
CSDN - Netty概述 [https://blog.csdn.net/javadhh/article/details/66477423]
CSDN - 《Netty 权威指南》—— 选择Netty的理由 [http://ifeve.com/netty-2-6/]
本文暂时没有评论,来添加一个吧(●'◡'●)