您的位置 首页 java

java易用框架 第二弹「Netty」

求关注

如果你觉得你对文章有兴趣可以点击上方关注哦!

如果想要内推阿里或其他主流公司请带简历私我邮箱(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的理由 [

文章来源:智云一二三科技

文章标题:java易用框架 第二弹「Netty」

文章地址:https://www.zhihuclub.com/196899.shtml

关于作者: 智云科技

热门文章

网站地图