基于OkHttp 3.4.0.
支持的协议HTTP 1.1 HTTP2 SPDY_3
重要类 OkHttpClient构造Call 请求 , 用来发送Http请求 和 读取返回内容。
Request 和 Responserequest 代表一个请求,不可变
response 代表一个响应 可变
负责请求的调度(同步的话走当前线程发送请求,异步的话则使用OkHttp内部的线程池进行);同时负责构造内部逻辑责任链,并执行责任链相关的逻辑,直到获取结果。虽然OkHttpClient是整个OkHttp的核心管理类,但是真正发出请求并且组织逻辑的是RealCall类,它同时肩负了调度和责任链组织的两大重任。
Dispatcher请求调度类,管理异步请求的调度策略
最大并发数 64 单个host 最大并发数 5
异步请求执行队列
异步请求等待队列
同步请求执行队列
调度线程池Disptcher实现了高并发,低阻塞的实现采用Deque作为缓存,先进先出的顺序执行任务在try/finally中调用了finished函数,控制任务队列的执行顺序,而不是采用锁,减少了编码复杂性提高性能 ConnectionPool
请求连接池,Address相同 则可以复用连接,目的是复用socket网络连接 提升网络请求效率;
拦截器client.Interceptors-用户自定义拦截器retryAndFollowUpInterceptor——失败和重定向拦截器BridgeInterceptor——封装request和response拦截器CacheInterceptor——缓存相关的过滤器,负责读取缓存直接返回、更新缓存ConnectInterceptor——连接服务,负责和服务器建立连接 这里才是真正的请求网络CallServerInterceptor——执行流操作(写出请求体、获得响应数据) 负责向服务器发送请求数据、从服务器读取响应数据 进行http请求报文的封装与请求报文的解析 关于 OKIO
OkHttp 内部采用 OKIO 来实现 网络IO 磁盘IO 操作,OKIO 是在Java IO 的基础上 进行二次封装,并不是重新构造了一套新的IO方法
原生IO存在的问题:原生IO API 不够简洁,buffer缓存无法复用 不够高效,无超时机制,通过超时机制来实现socket的释放;
OKIO 解决的问题;- 易于使用,抽象sink (输出流)source(输入流) 方法优化buffer缓存,采用SegmentPool 优化内存缓存,避免频繁内存copy超时机制,AsyncTimeout ,通过WatchDog 守护线程 触发超时;封装了Gzip 流解压缩的细节,供OkHttp 调用;
平台的Platform.get()
构造者模式OkHttpClient 构造,Request 请求的构造;
外观模式仅通过 OkHttpClient 来封装框架内部细节 ,对外只保留对外核心API;
策略模式不同的HttpStream 策略
责任链模式采用拦截器建立网络连接 和管理请求响应等;
享元模式利用连接池连接复用。;
观察者模式HTTP 2.0 PushObserver 等。



