求关注
如果你觉得你对文章有兴趣可以点击上方关注哦!
如果想要内推阿里或其他主流公司请带简历私我邮箱(still-fantasy-jay@qq.com)
编者语
如果把 java 的世界比作是江湖的话,真可谓是百家争艳,豪杰云集。笔者是java研发出生,但是写的博文尽可能站在科技与人文的角度去品评java世界。代码的世界里,从来没有黑夜,上线、迭代、debug、写bug、修bug……如此循环往复,构成了如今纷繁复杂的java宇宙。
netty :天下武功,唯快不破
李小龙曾经有句名言:天下武功,无坚不破,唯快不破。在java江湖里,快不仅意味着高并发,低延迟更意味着高可用,高吞吐。
java江湖里有一位神通广大却非常接地气的神仙,就像《西游记》里掌管一方风水的土地公公,不仅大圣随叫随到、从不怠慢,而且无所不知,神通广大。这个神通广大的神仙就是大名鼎鼎的Netty。
何方神圣
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概述 [
CSDN – 《Netty 权威指南》—— 选择Netty的理由 [