OkHttp 框架分析
基于OkHttp 3.4.0.
支持的协议
HTTP 1.1 HTTP2 SPDY_3
重要类
OkHttpClient
构造Call 请求 , 用来发送Http请求 和 读取返回内容。
Request 和 Response
request 代表一个请求,不可变 response 代表一个响应 可变
Call 和 RealCall
负责请求的调度(同步的话走当前线程发送请求,异步的话则使用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 等。
|