《Netty权威指南(第2版)》章节试读

出版日期:2015-4-20
ISBN:9787121258013
作者:李林锋
页数:572页

《Netty权威指南(第2版)》的笔记-第6页 - 第1章 Java的I/O演进之路

目前支持I/O多路复用的系统调用有select、pselect、poll、epoll,在Linux网络编程过程中,很长一段时间都使用select做轮询和网络事件通知,然而select的一些固有缺陷导致了它的应用受到了很大的限制,最终Linux不得不在新的内核版本中寻找select的替代方案,最终选择了epoll。

《Netty权威指南(第2版)》的笔记-第115页 - 第6章 编解码技术

Facebook的Thrift介绍
对于当时的Facebook来说,创造Thrift是为了解决Facebook各系统间大数据量的传输通信以及系统之间语言环境不同需要跨平台的特性,因此Thrift可以支持多种程序语言,如C++、C#、Cocoa、Erlang、Haskell、Java、Ocami、Perl、PHP、Python、Ruby和Smalltalk。

《Netty权威指南(第2版)》的笔记-第27页 - 第2章 NIO 入门

探索多路复用器Selector,它是Java NIO编程的基础,熟练地掌握Selector对于NIO编程至关重要。多路复用器提供选择已就绪的任务的能力。简单来讲,Selector会不断地轮询注册在其上的Channel,如果某个Channel上面发生读或者写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。

《Netty权威指南(第2版)》的笔记-第110页 - 第6章 编解码技术

我们评判一个编解码框架的优劣时,往往会考虑以下几个因素:
1)是否支持跨语言,支持语言种类是否丰富。
2)编码后的码流大小。
3)编解码的性能。
4)类库是否小巧,API使用是否方便。
5)使用者需要手工开发的工作量和难度。

《Netty权威指南(第2版)》的笔记-第45页 - 第2章 NIO 入门

使用NIO编程的优点总结如下:
1、客户端发起的连接操作是异步的,可以通过在多路复用器注册OP_CONNECT等待后续结果,不需要像之前的客户端那样被同步阻塞。
2、SocketChannel的读写操作都是异步的。如果没有可读写的数据它不会同步等待,直接返回,这样I/O通信线程就可以处理其他的链路,不需要同步等待这个链路可用。
3、线程模型的优化:由于JDK的Selector在Linux等主流操作系统上通过epoll实现,它没有连接句柄数的限制(只受限于操作系统的最大句柄数或者对单个进程的句柄限制),这意味着一个Selector线程可以同时处理成千上万客户端连接,而且性能不会随着客户端的增加而线性下降。因此,它非常适合做高性能,高负载的网络服务器。

《Netty权威指南(第2版)》的笔记-第79页 - 第4章 TCP粘包/拆包问题的解决之道

4.1 TCP粘包/拆包
TCP是个“流”协议,所谓流,就是没有界限的一串数据。大家可以想想河里的流水,它们是连成一片的,其间并没有分界线。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。

《Netty权威指南(第2版)》的笔记-第7页 - 第4章 TCP粘包/拆包问题的解决之道

熟悉TCP编程的读者可能都知道,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制。

《Netty权威指南(第2版)》的笔记-第4页 - Linux网络IO模型简介

## 阻塞IO模型
## 非阻塞IO模型
## 复用IO模型
## 信号驱动IO模型
## 异步IO

《Netty权威指南(第2版)》的笔记-第114页 - 第6章 编解码技术

Protobuf另一个比较吸引人的地方就是它的数据描述文件和代码生成机制,利用数据描述文件对数据结构进行说明的优点如下:
文本化的数据结构描述语言,可以实现语言和平台无关,特别适合异构系统间的集成。
通过标识字段的顺序,可以实现协议的前向兼容。
自动代码生成,不需要手工编写同样数据结构的C++和Java版本。
方便后续的管理和维护。相比于代码,结构化的文档更容易管理和维护。

《Netty权威指南(第2版)》的笔记-第107页 - 第6章 编解码技术

6.1 Java序列化的缺点
在远程服务调用(RPC)时,很少直接使用Java序列化进行消息的编解码和传输:
1、无法跨语言。
无法跨语言,是Java序列化最致命的问题。对于跨进程的服务调用,服务提供者可以能会使用C++或者其他语言开发,当我们需要和异构语言进程交互时,Java序列化就难以胜任了。
由于Java序列化技术是Java语言内部的私有协议,其他语言并不支持,对于用户来说它完全是黑盒。对于Java序列化后的字节数组,别的语言无法进行反序列化,这就严重阻碍了它的应用。
目前几乎所有流行的Java RPC通信框架,都没有使用Java序列化作为编解码框架,原因就是在于它无法跨语言,而这些RPC框架往往需要支持跨语言调用。

《Netty权威指南(第2版)》的笔记-第2页 - 前言

Java的NIO编程并没有流行起来,究其原因如下。
1、大多数高性能服务器,被C和C++语言盘踞,由于它们可以直接使用操作系统的异步I/O能力,所以对JDK的NIO并不关心。
2、移动互联网尚未兴起,基于Java的大规模分布式系统极少,很多中小型应用服务对于异步I/O的诉求不是很强烈。
3、高性能、高可靠性领域,例如银行、证券、电信等,依然以C++为主导,Java充当打杂的角色,NIO暂时没有用武之地。
4、当时主流的J2EE服务器,几乎全都基于同步阻塞I/O构建,例如Servlet、Tomcat等,由于它们应用广泛,如果这些容器不支持NIO,用户很难具备独立构建异步协议栈的能力。
5、异步NIO编程门槛比较高,开发和维护一款基于NIO的协议栈对很多中小型公司来说像是一场噩梦。
6、业界NIO框架不成熟,很难商用。
7、国内研发界对NIO的陌生和认识不足,没有充分重视。
如果说个人能够改变自己命运的话,对于程序员来说,唯有通过不断地学习和实践,努力提升自己的技能,才有可能找到更好的机会,充分发挥和体现自己的价值。

《Netty权威指南(第2版)》的笔记-第2页 - 第1章 Java的I/O演进之路

根据UNIX网络编程对I/O模型的分类,UNIX提供了5种I/O模型,分别如下。
1、阻塞I/O模型:最常用的I/O模型就是阻塞I/O模型,缺省情况下,所有文件操作都是阻塞的。
我们以套接字接口为例来讲解此模型:在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区或者发生错误时才返回,在此期间一直会等待,进程在从调用recvfrom开始到它返回的整段时间内都是被阻塞的,因此被称为阻塞I/O模型。
2、非阻塞I/O模型:recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接返回一个EWOULDBLOCK错误,一般都对非阻塞I/O模型进行轮询检查这个状态,看内核是不是有数据到来。
3、I/O复用模型:Linux提供select/poll,进程通过将一个或多个fd传递给select或poll系统调用,阻塞在select操作上,这样select/poll可以帮我们侦测多个fd是否处于就绪状态。select/poll是顺序扫描fd是否就绪,而且支持的fd数量有限,因此它的使用受到了一些制约。Linux还提供了一个epoll系统调用,epoll使用基于事件驱动方式代替顺序扫描,因此性能更高。当有fd就绪时,立即回调函数rollback。
4、信号驱动I/O模型:首先开启套接接口信号驱动I/O功能,并通过系统调用sigaction执行一个信号处理函数(此系统调用立即返回,进程继续工作,它是非阻塞的)。当数据准备就绪时,就为该进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据,并通知主循环函数处理数据。
5、异步I/O:告知内核启动某个操作,并让内核在整个操作完成后(包括将数据从内核复制到用户自己的缓冲区)通知我们。这种模型与信号驱动模型的主要区别是:信号驱动I/O由内核通知我们何时可以开始一个I/O操作;异步I/O模型由内核通知我们I/O操作何时已经完成。

《Netty权威指南(第2版)》的笔记-第1页 - 第1版 前言

异步高性能内部协议栈、异步HTTP、异步SOAP、异步SMPP,所有的协议栈都是异步非阻塞。
基于Reactor模型统一调度的长连接和短连接协议栈,无论是性能、可靠性还是可维护性,都可以秒杀传统基于BIO开发的应用服务器和各种协议栈,这种差异本质上是一种代差。

《Netty权威指南(第2版)》的笔记-第6页 - IO多路复用

1. 支持一个进程打开的socket描述符(FD)不受限制(仅限制于操作系统的最大文件句柄数)
1G内存的机器大约支持10万个句柄。
$ cat /proc/sys/fs/file-max 可查系统支持我句柄数
2. IO效率不会随着FD数目的增加而线性下降。
3. 使用mmap加速内核与用户空间的消息传递。
epoll通过内核和用户空间mmap共享同一块内存来实现。
4. epoll的API更简单。

《Netty权威指南(第2版)》的笔记-第116页 - 第6章 编解码技术

JBoss Marshalling
优点如下:
1、可拔插的类解析器,提供更加便捷的类加载定制策略,通过一个接口即可实现定制。
2、可拔插的对象替换技术,不需要通过继承的方式。
3、可拔插的预定义类缓存表,可以减少序列化的字节数组长度,提升常用类型的对象序列化性能。
4、无须实现java.io.Serializable接口,即可实现Java序列化。
5、通过缓存技术提升对象的序列哈性能。


 Netty权威指南(第2版)下载 更多精彩书评


 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024