OkHttp3源码详解(二) 整体流程

简介: 阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 1.简单使用 同步: @Override public Response execute() throws IOException { synchroni.

1.简单使用

同步:

 @Override public Response execute() throws IOException {
   synchronized (this) {
     if (executed) throw new IllegalStateException("Already Executed");
     executed = true;
   }
   try {
     client.dispatcher().executed(this);
     Response result = getResponseWithInterceptorChain(false);
     if (result == null) throw new IOException("Canceled");
     return result;
   } finally {
     client.dispatcher().finished(this);
   }
 }

首先加锁置标志位,接着使用分配器的executed方法将call加入到同步队列中,然后调用getResponseWithInterceptorChain方法(稍后分析)执行http请求,最后调用finishied方法将call从同步队列中删除

异步:

1.  void enqueue(Callback responseCallback,  boolean forWebSocket)  {
2.  synchronized  (this)  {
3.  if  (executed)  throw  new  IllegalStateException("Already Executed");
4.  executed =  true;
5.  }
6.  client.dispatcher().enqueue(new  AsyncCall(responseCallback, forWebSocket));
7.  }

同样先置标志位,然后将封装的一个执行体放到异步执行队列中。这里面引入了一个新的类AsyncCall,这个类继承于NamedRunnable,实现了Runnable接口。NamedRunnable可以给当前的线程设置名字,并且用模板方法将线程的执行体放到了execute方法中

2.总体架构

上图是OkHttp的总体架构,大致可以分为以下几层:

  • Interface——接口层:接受网络访问请求
  • Protocol——协议层:处理协议逻辑
  • Connection——连接层:管理网络连接,发送新的请求,接收服务器访问
  • Cache——缓存层:管理本地缓存
  • I/O——I/O层:实际数据读写实现
  • Inteceptor——拦截器层:拦截网络访问,插入拦截逻辑

①Interface——接口层:

接口层接收用户的网络访问请求(同步请求/异步请求),发起实际的网络访问。OkHttpClient是OkHttp框架的客户端,更确切的说是一个用户面板。用户使用OkHttp进行各种设置,发起各种网络请求都是通过OkHttpClient完成的。每个OkHttpClient内部都维护了属于自己的任务队列,连接池,Cache,拦截器等,所以在使用OkHttp作为网络框架时应该全局共享一个OkHttpClient实例。

Call描述一个实际的访问请求,用户的每一个网络请求都是一个Call实例。Call本身只是一个接口,定义了Call的接口方法,实际执行过程中,OkHttp会为每一个请求创建一个RealCall,每一个RealCall内部有一个AsyncCallAsyncCall继承的NamedRunnable继承自Runnable接口。

所以每一个Call就是一个线程,而执行Call的过程就是执行其execute方法的过程。

Dispatcher是OkHttp的任务队列,其内部维护了一个线程池,当有接收到一个Call时,Dispatcher负责在线程池中找到空闲的线程并执行其execute方法。这部分将会单独拿一篇博客进行介绍,详细内容可参考本系列接下来的文章。

②.Protocol——协议层:处理协议逻辑

Protocol层负责处理协议逻辑,OkHttp支持Http1/Http2/WebSocket协议,并在3.7版本中放弃了对Spdy协议,鼓励开发者使用Http/2。

③.Connection——连接层:管理网络连接,发送新的请求,接收服务器访问

连接层顾名思义就是负责网络连接。在连接层中有一个连接池,统一管理所有的Socket连接,当用户新发起一个网络请求时,OkHttp会首先从连接池中查找是否有符合要求的连接,如果有则直接通过该连接发送网络请求;否则新创建一个网络连接。

RealConnection描述一个物理Socket连接,连接池中维护多个RealConnection实例。由于Http/2支持多路复用,一个RealConnection可以支持多个网络访问请求,所以OkHttp又引入了StreamAllocation来描述一个实际的网络请求开销(从逻辑上一个Stream对应一个Call,但在实际网络请求过程中一个Call常常涉及到多次请求。如重定向,Authenticate等场景。所以准确地说,一个Stream对应一次请求,而一个Call对应一组有逻辑关联的Stream),一个RealConnection对应一个或多个StreamAllocation,所以StreamAllocation可以看做是RealConenction的计数器,当RealConnection的引用计数变为0,且长时间没有被其他请求重新占用就将被释放。

连接层是OkHttp的核心部分,这部分当然也会单独拿一篇博客详细讲解,详细内容可参考本专题相关文章。

④.Cache——缓存层:管理本地缓存

Cache层负责维护请求缓存,当用户的网络请求在本地已有符合要求的缓存时,OkHttp会直接从缓存中返回结果,从而节省网络开销。这部分内容也会单独拿一篇博客进行介绍,详细内容可参考本专题相关文章。

⑤.I/O——I/O层:实际数据读写实现

I/O层负责实际的数据读写。OkHttp的另一大有点就是其高效的I/O操作,这归因于其高效的I/O库okio

这部分内容笔者也打算另开一个专题进行介绍。详细内容可以参考本博客相关内容。

⑥Inteceptor——拦截器层:拦截网络访问,插入拦截逻辑

拦截器层提供了一个类AOP接口,方便用户可以切入到各个层面对网络访问进行拦截并执行相关逻辑。
原文链接:https://www.bbsmax.com/A/kPzOg9lQzx/

相关文章
|
5天前
|
JSON 前端开发 Java
优化用户体验:SpringBoot统一异常处理最佳实践
优化用户体验:SpringBoot统一异常处理最佳实践
16 0
|
5月前
|
JSON 数据格式 容器
SpringMVC运行流程分析之核心流程
SpringMVC运行流程分析之核心流程
16 0
|
6月前
|
设计模式 前端开发 Java
如何实现自定义MVC框架(最终版本)
如何实现自定义MVC框架(最终版本)
25 0
|
6月前
|
敏捷开发 测试技术
推三返一开发稳定版丨推三返一项目系统开发详细指南/方案需求/步骤逻辑/流程功能/案例设计/技术架构/源码程序
推三返一系统开发是一种软件开发模式,也被称为迭代增量开发模式。它是一种敏捷开发方法的一种,通过将整个开发过程分为多个迭代周期,每个周期都会增加新的功能和特性,并在每个迭代周期结束后进行测试、反馈和修改。推三返一系统开发的核心思想是“推进三步,反馈一步”。
|
10月前
|
缓存 JSON NoSQL
低版本SpringBoot Redis缓存旁路设计改造方案实践
低版本SpringBoot Redis缓存旁路设计改造方案实践
273 0
|
缓存 Java 调度
为了更好的使用OKHttp—架构与源码分析
为了更好的使用OKHttp—架构与源码分析
为了更好的使用OKHttp—架构与源码分析
|
JavaScript Dubbo 小程序
SpringBoot 巧用 @Async 提升接口并发能力
异步调用几乎是处理高并发Web应用性能问题的万金油,那么什么是“异步调用”? “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。
|
XML 缓存 安全
从spring源码层面分析循环依赖解决方案的实现原理(上)
从spring源码层面分析循环依赖解决方案的实现原理(上)
136 0
从spring源码层面分析循环依赖解决方案的实现原理(上)