1.2 Introducing Netty
在不久之前,我们一开始提出的场景设想------支持成千上万个的并发客户端请求,当时看起来是不可能实现的,但是现在看来,这种需求被系统用户看来是理所当然的,作为开发者而言,我们期待完成这种需求,甚至可以支持更多的并发,我们深知:以最低的代价来提供更大吞吐量和稳定的网络通信需求是永远存在的,且这些需求是渴望被满足的
不要低估我们刚才提出最后的那一点的重要性,我们已经从长时间的惨痛经历中学习到直接使用原生的API会暴露出各种复杂性,并且会发现你对技术的理解和掌握供不应求,因此,我们的一个最基本的目标就是面向对象的原则,隐藏底层实现的复杂性,提供更加简单的抽象
这个原则已经刺激了很多网络框架的发展壮大,框架封装了底层实现来完成更多的普通编程任务,这些网络编程与分布式系统的发展是密不可分的,我们可以毫无疑义地断言很多专业资深的java开发者们很熟悉这些编程中的至少一种实现,例如spring,spring是整个生态框架中最为出名的,对于我们而言,这些技术是不可或缺的,它们可以很好的满足我们技术的需求和我们开发的需要
在网络编程领域,Netty是Java语言中最为卓越的网络框架之一,利用java的一些原生的高级APIs(例如线程池,NIO等)我们进行封装提供普通开发者一些简单使用的APIs,Netty框架封装了网络底层实现,使你有足够的时间去专注你应用程序中那特有的让你真正感兴趣的模块的开发
在我们准备研究Netty之前,请先查看一下我们下表1.1总结出来的Netty的核心特性,有些是技术方面的,有些是架构层次或者是宏观上的设计,在这本书里我们将要多次讲解分析这些特性,表1.1
类别 | NETTY特性实现 |
设计 | 为多种网络传输类型提供统一的APIs,包括阻塞IO和非阻塞IO 简单但高效的线程模型 真实的无连接的数据包socket的支持 逻辑组件通过链接的链式方式使用,使每个组件可以重复使用 |
易用性 | 丰富的JAVA文档和大量的代码示例 仅仅依赖于JDK1.6,部分特性可能需要依赖JDK1.7或者其他的额外jar包 |
性能 | 有更大的吞吐量和低延迟性相比于直接使用JAVA 的原生APIs 引用了池的概念和重复利用的理念来减少资源的消耗 最大限度的减少内存拷贝 |
健壮性 | 不会因为连接的缓慢,连接的损耗产生OOM 在优质的网络环境中消除Netty应用的不公平的读写比 |
安全性 | 完成对SSL\TLS和StartSSL的支持 可以在Applet或者OSGI等这些受限制的环境中运行 |
社区驱动 | 社区成立早,且活跃度高,版本更新频繁 |
1.2.1 Who uses Netty?
Netty拥有充满活力的用户社区,并且这个社区的用户越来越多,其中包括一些很大的公司,例如:Apple,Twitter,Facebook,Google, Square, and Instagram,其中也包括一些很著名的开源项目,例如Infinispan, HornetQ, Vert.x, Apache Cassandra, and Elasticsearch,这些以上的所有应用都对其网络核心模块进行了抽象,还有一些新兴创业公司,例如irebase 和Urban Airship公司都正在使用Netty,前者是为了基于长时间的Http协议的连接,后者是为了推送各种不同的通知
当你使用Twitter的时候,你肯定会使用Finagle,一个基于Netty的用于系统间通信的框架,Facebook公司则将Netty用于Nifty,Nifty是他们用于ApacheThrift项目中的网络模块的解决方案,稳定性和高性能是这两家公司为最重要的宗旨,这两个宗旨最终使这两家公司都选择了Netty
换个角度,Netty也是从这些项目中获取了莫大的好处,在这些项目中,Netty也扩展了它的适用范围,也增加了它的灵活性和可塑性,通过实现了例如FTP,SMTP,HTTP和web SOCKET协议等,并且支持文本和二进制数据
1.2.2 Asynchronous and event-driven
我们已经很大篇幅多次出现“asynchronous”这个单词了,现在是澄清解释这个单词的最佳时候了,异步就是不同步,"事件"我们还是相当熟悉的,例如收发邮件,你可能会收到你发送邮件的回信也有可能收不到任何回信,甚至有时候正在你发送的时候,你会收到一些发送异常的一些信息,异步事件依旧也会有一定的顺序关系,顺序关系理解是这样的:一般只有你去主动去问一个问题才会获取到这个问题的答案,但是等你问完问题的时候,在等待答案的过程中你可以做些其他的事情
在我们的日常生活中,异步是经常出现的,我们不必深究,但是如果把这种理念用在计算机编程中也许会出现很多各种不同的问题,从本质上讲,如果计算机支持异步和事件驱动那么对于我们来说这是一件很有价值很有意义的事情,这种模型可以对任何时间按照任何顺序发生的任何事件作出响应
这种模型是达成高扩展性的关键,扩展性可以这么理解,当业务或者任务爆炸式的扩展的时候,你的程序或者网络能够有能力去容纳这些变更,这种能力就是可扩展性
那么可扩展性和异步的关系是什么?
异步网络调用可以使我们解放,使我们不需要不得不去等待一个操作的完成,完整的异步IO调用可以使我们的程序到达一个新的高度:异步方法调用立刻返回,在稍后的时间,在其完成的时候会提醒用户,实现了解耦的功能
Selectors可以让我们用很少的线程监控处理很多的连接事件
将这些特性整合在一起,再加上非阻塞IO,我们可以快速和低消耗地处理数量多到难以想象的连接事件请求,从网络的角度上思考,这就是我们要建造的系统的关键,诚如,也这是Netty设计的初衷
在下一个章节,我们将走进Netty框架的一些核心组件,现在请将这些java的class文件想象成组件或者一个个鲜活的对象,然后,我们一起探究他们是如何一起协作的,看他们是如何在网络处理成功后如何通知这些事件的