想要了解http协议,先看http协议在tcp/ip协议中的位置以及对应java层面io层的数据流方式,如上图所示,http协议位于应用层,在tcp协议之上;下图即是java层面几种通信模型简介
几种nio模型
使用BIO方式(同步阻塞IO)
使用ServerSocket绑定IP地址,启动端口,使用Socket进行握手连接,连接成功后,双方通过输入输出流进行同步阻塞式通信,每当有客户端的请求后,即启动一个线程进行处理
使用PAIO(同步阻塞IO)
使用线程池进行处理客户端的请求,因为在进行read或者write的时候,都是阻塞IO的,所以还是同步阻塞IO,只是线程的资源交由线程池进行控制
使用java.nio包的NIO方式(异步非阻塞IO)
使用NIO方式 异步IO,使用多路复用器关联通道,当通道中有事件时,即通知处理,不用阻塞IO,利用ByteBuffer进行数据缓冲,使用Channel进行数据传输,利用Selector进行通道的轮询与管理,读写均是异步的
使用AIO方式(异步非阻塞IO)
使用AIO方式,异步非阻塞IO,NIO的升级版,通过一系列的回调策略(CompletionHandler)完成应用功能,无需借助于Selector,对应于unix的异步IO
上面5种方式的code示例在----https://github.com/undergrowthlinear/netty.git
http request line和response line
了解http request line格式和response line对于后面看各个框架源码,有很大用处,可以随意打开chrome的调试器,看下访问一个请求对应的数据格式是否如上图所说
nettynetty 主从多模型
reactor 主从多线程模型 来源 https://xintu.cnblogs.com/luoxn28/p/11875340.html
大致工作流程如下:当客户端连接进来。在main线程池进行握手、鉴权等功能校验;通过后,将channel通道注册到io线程池,通过一系列的handler进行处理业务数据流。
netty逻辑架构图
承接上面的主从多模型,当客户端注册到io线程池后,netty使用管道流pipeline的方式,允许开发者复用框架已有的处理器以及自定义处理器,很多开源框架的网络层都是使用netty进行通信,例如rocketmq、dubbo等
netty中对于http协议支持核心类
HttpObject
HttpContent(大块对象支持) 、DefaultHttpContent、LastHttpContent(EMPTY_LAST_CONTENT)、HttpMessage(HttpRequest/HttpResponse的通用属性支持)、 HttpRequest、 DefaultHttpRequest
HttpObjectDecoder
(解析ByteBuf为HttpMessage和HttpContent或者LastHttpContent,取决于内容数据块的长度;如果没有内容,则是createMessage创建HttpMessage的子类;如果有固定长度内容,且小于maxChunkSize,则DefaultLastHttpContent;最后有很多内容的时候,就是DefaultHttpContent、DefaultLastHttpContent)----所以这里有HttpRequest和HttpContent内容需要业务端分开处理、HttpRequestDecoder()、HttpResponseDecoder(解析ByteBuf为HttpResponse/HttpContent)
HttpObjectEncoder
(将HttpMessage或者HttpContent转换成ByteBuf),HttpRequestEncoder(HttpRequest/HttpContent转为ByteBuf)、 HttpResponseEncoder(HttpResponse/HttpContent转为ByteBuf)、 io.netty.handler.codec.ByteToMessageDecoder#fireChannelRead----将解析出来的列表元素循环迭代对后续的处理器,对于理解http的HttpRequest与HttpContent/LastHttpContent至关重要
链接----https://github.com/netty/netty.git
okhttp流程图 来源 https://xintu.jianshu.com/p/5b886f851c59
以易用性和性能著称,上图的官方描述,支持http2.0、连接池复用、响应缓存、流式调用、支持同步和异步调用等一系列功能,在很多开源框架中,也经常看得到,链接----https://github.com/square/okhttp.git
apache httpclientapache出品,也是支持阻塞的io模型和非阻塞的nio模型,不过你要是用过okhttp,我估计你不会再用httpclient了,使用上,差距还是很明显。
HttpURLConnectionjava原生http协议,apache httpclient就是在其基础上封装而来,对开发者而言,易用性远不及httpclient和okhttp
Feignfeign 支持特性 来源 https://github.com/OpenFeign/feign
当你对http request line和response line了解后,看feign的注解就会很清楚是什么意思了,注解式开发,简化http调用,spring微服务核心组件之一,链接----https://github.com/OpenFeign/feign.git
Forest国人开源的类似feign的api框架,官方描述如下:
轻量级HTTP客户端API框架,让Java发送HTTP/HTTPS请求不再难。它比OkHttp和HttpClient更高层,是封装调用第三方restful api client接口的好帮手,是retrofit和feign之外另一个选择,链接----https://gitee.com/dromara/forest
当然,这也是我所了解过的http开源框架,可能还有更好用的,如果你知道,不妨在评论区留言,让我也学习下。程序员的学习之路,逆水行舟,不学你就落后了,落后了就没高薪水,就没法买上好的假发了,持续学习,加油吧,伙伴们。