与JavaWeb有关的故事(web请求与Java I/O) (3)

与JavaWeb有关的故事(web请求与Java I/O)

Java序列化技术

序列化就是将一个对象转为为一串二进制的字节数组,通过保存或转移这些字节数据来达到持久化的目的。接口,java.io.Serializable。
对象序列化之后,查看二进制数组,会包含序列化协议、版本、是否新对象、class完整类名、UID、标记、所含域的个数、域类型、域名城、父类信息、类各属性的实际值。
几个Java序列化要点:

父类继承Serializable接口时,所有子类可序列化

子类实现Serializable接口时,父类没有,则只有字类的属性可序列化(不报错)

如果序列化的属性是对象,则这个对象也必须实现Serializable接口,否则报错

反序列化时,如果对象属性有修改或删减,修改的属性部分会丢失,不报错

反序列化时,UID被修改,会失败

纯Java环境,序列化可以很好的工作。多语言环境见还是推荐使用通用的数据结构如XML、JSON。

网络IO机制 TCP三次握手和四次挥手

TCP建立过程,三次握手和四次挥手,过程如下:

与JavaWeb有关的故事(web请求与Java I/O)

与JavaWeb有关的故事(web请求与Java I/O)

两个问题:

为什么A还要发送一次确认呢?可以二次握手吗?
为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误

为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

TCP三次握手和四次挥手过程

Java Socket工作机制

底层TCP/IP协议,Socket和ServerSocket(accept之前是阻塞的)建立连接,通过字节流传输,传输过程中,操作系统会为InputStream和OutputStream分配一定大小缓冲区,数据读写通过缓冲区完成。

NIO概述

BIO方式,不管是网络还是磁盘,一旦有阻塞,线程都会失去CPU使用权。当需要大量HTTP长链接的情况,或者提升个别IO请求优先级,或者竞态资源同步,BIO处理起来会非常复杂,此时,NIO闪亮登场。显然,这个话题需要一个崭新的大篇幅来介绍,此处省略一万字=。=

IO调优

磁盘IO优化

- 增加缓存,减少磁盘访问次数 - 优化磁盘管理系统,设计最优的磁盘寻址策略(太底层) - 设计合理的磁盘存储数据块 - 应用合理的RAID策略提升磁盘IO

TCP网络参数调优

- 32位系统通常只有65535个端口,0~1024受保护,查看可用端口数量,较少时可以通过更改tcp_fin_timeout位更小的值来快速释放。常用信息: cat /proc/net/netstat :查看TCP统计信息 cat /proc/net/snmp :查看当前系统连接情况 netstat -s :查看网络统计信息

网络IO优化

- 减少网络交互次数 - 减少网络传输数据量大小 - 减少编码(重要,网络流是字节形式,字符转字节比较耗时,尽量以字节形式传输或提前转码) - 同步和异步的选择(同步就是一个任务的完成需要依赖另外一个任务的完成) - 阻塞与非阻塞的选择(阻塞就是CPU停下来等待一个慢的操作完成才接着完成其他的工作) - 同步、异步、阻塞、非阻塞混搭组合(根据场景来选择) IO涉及的设计模式

以下高能,需要功底:

适配器模式,关键点:Adapter完成源到目标的适配,一般是继承源或持有源(构造器注入、方法注入等),实现目标接口。
装饰器模式,关键点:在不改变源的接口的情况下,进行功能扩展。io包InputStream各种装饰器(FilterInputStream、BufferedInputStream等)通过持有源(构造器注入)来完成功能扩展。

两者都对类进行了包装,两者的本质区别在于是否改变了源的接口。

以上来自天团运营总监:坤少

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzfyg.html