IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 面试系列——OkHttp使用和原理分析 -> 正文阅读

[网络协议]面试系列——OkHttp使用和原理分析

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 解决的问题;

  1. 易于使用,抽象sink (输出流)source(输入流) 方法
  2. 优化buffer缓存,采用SegmentPool 优化内存缓存,避免频繁内存copy
  3. 超时机制,AsyncTimeout ,通过WatchDog 守护线程 触发超时;
  4. 封装了Gzip 流解压缩的细节,供OkHttp 调用;

设计模式

单例模式

平台的Platform.get()

构造者模式

OkHttpClient 构造,Request 请求的构造;

外观模式

仅通过 OkHttpClient 来封装框架内部细节 ,对外只保留对外核心API;

策略模式

不同的HttpStream 策略

责任链模式

采用拦截器建立网络连接 和管理请求响应等;

享元模式

利用连接池连接复用。;

观察者模式

HTTP 2.0 PushObserver 等。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:49:22  更:2022-03-03 16:53:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/5 13:20:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码