1.okio Դ?源码?
2.基于OkHttp的Http监控
3.I/O 简要分析
okio Դ??
OkHttp是一个广泛应用于Android开发中的网络请求库,其支持HTTP1、源码HTTP2等多种协议,源码为日常开发提供强大支持。源码本文基于OkHttp4.9.0版本代码,源码从其创建开始,源码register源码分析深入探究OkHttp如何发起网络请求。源码
使用OkHttp的源码第一步是创建OkHttpClient实例,这实质上是源码一个配置类,用于管理请求时的源码各种参数设置,通过Builder模式实现灵活的源码配置。
Request类作为基础请求构造类,源码用于描述请求参数,源码包括域名、源码请求方式、源码请求头、请求体等信息。Builder方法提供链式调用,优雅地配置请求细节。会议通讯源码
Call类作为请求的入口,通过OkHttpClient的实例方法发起请求。Call是一个接口,内部实现了OkHttpClient配置的Dispatcher来处理请求。
enqueue方法处理异步请求,创建AsyncCall实例,并调用Dispatcher进行请求处理。execute方法用于同步请求,加入请求队列,创建响应责任链发起请求。
getResponseWithInterceptorChain方法是OkHttp发起请求的核心,构建拦截器列表并按顺序调用,处理请求并返回。
cancel方法用于请求取消,停止后续IO操作和连接断开,进行事件通知。
RealInterceptorChain类追踪请求流程,最终调用proceed方法处理请求。源码汇3.4.2Dispatcher类管理异步请求执行逻辑,控制并发请求数量。
RetryAndFollowUpInterceptor拦截器负责错误重试和重定向,ExchangeFinder类在连接池中寻找可用连接,ConnectInterceptor类负责连接服务器。
CallServerInterceptor类执行IO操作与服务器交互,BridgeInterceptor类处理请求和响应数据,CacheInterceptor类进行缓存管理。
RealConnection类实现实际网络连接,底层使用Socket连接服务器。
CallServerInterceptor类处理请求和响应数据,实现网络IO操作。
BridgeInterceptor类作为应用与网络交互的桥梁,处理请求头和Cookie信息。
Response对象最终提供用户访问请求信息和响应结果。
总结,OkHttp的请求流程从创建OkHttpClient开始,通过Request描述请求信息,ehcache源码编译Call发起请求,由Dispatcher管理异步请求执行逻辑,实现代理和重试等功能。底层使用Socket进行网络连接,OkIO进行IO操作,通过责任链模式有序处理请求。阅读OkHttp源码可以深入了解设计模式、功能抽象等知识,提高编程能力。
基于OkHttp的Http监控
在HTTP监控中,关键指标包括入队到请求结束的耗时、DNS查询耗时、socket连接耗时、TLS连接耗时、请求发送耗时、响应传输耗时、首包耗时、响应解析耗时以及HTTP错误,指数源码公式区分业务错误和请求错误。通过可视化工具,可以直观地监控HTTP各阶段的耗时与错误分布,为优化业务HTTP请求提供数据支持。
获取指标数据首先需要定位关键代码,然后插入收集代码。在没有源码或不重新打包源码的情况下,利用实现AOP的工具,通过注解和配置文件在指定函数中插入相关代码。这样可以确保监控代码与业务代码分离。
OkHttp是Android中广泛使用的HTTP请求框架,其最新版本已升级到4.0.x,实现全部由Java替换为Kotlin,API使用也有不同。4.x设备不默认支持TLSV1.2,因此需在API level +和Java 1.8环境下开发,但OkHttp为支持4.x设备单独创建了3..x分支。本文使用的OkHttp版本为3..3。
OkHttp的请求流程如下:首先调用OkHttpClient.Builder设置默认值,然后生成OkHttpClient实例,之后通过OkHttpClient.Builder.build创建RealCall对象。接着,调用RealCall.getResponseWithInterceptorChain方法,再调用RealInterceptorChain.proceed(Request request)发起请求。Interceptor是OkHttp的核心功能类,将网络请求、缓存和压缩等功能统一起来,每个功能都实现为一个Interceptor,形成责任链。关键Interceptor包括ConnectInterceptor和CallServerInterceptor,分别负责连接池管理和与服务器交互。
ConnectInterceptor在连接池中查找可复用连接,若无则创建新socket,进行TLS握手,将socket包装成Okio并创建HttpCodec。CallServerInterceptor使用HttpCodec进行协议传输和解析。
获取指标的实现方式如下:针对HTTP请求耗时、异常、数据大小和状态码,通过MAOP(面向方面编程)拦截OkHttpClient.Builder的build方法加入统计Interceptor和EventListenerFactory。DNS查询耗时、连接耗时、SSL耗时,通过设置EventListener.Factory直接收集。解析耗时需在上层框架如Retrofit的parseReponse方法中收集。首包时间通过拦截读请求数据的方法来实现,即在OkHttp调用CallServerInterceptor时,关注readResponseHeaders的时机。
使用MAOP功能,在AOP配置文件中添加拦截OkHttpClient.Builder的build()方法、Http1Codec的readHeaderLine方法、okhttp3.internal.http2.Http2Stream的takeResponseHeaders方法的配置。首包时间通过拦截方法认为首次返回响应头时计算。对于Retrofit parse耗时收集,需要在AOP配置文件中添加对retrofit2.OKHttp.parseResponse方法的拦截配置,并在Method回调中处理相关数据。
综上所述,该方案能基本实现HTTP基本指标的获取,但在细节上还需完善。欢迎关注知识星球进行深入交流。
I/O 简要分析
本文将从文件IO、网络IO和Java IO接口三个方面来分析IO操作。
一、文件IO
一般情况下,我们通过调用read/write接口来进行IO操作,这种操作被称为标准IO,其会先经过页面缓存提高性能。直接IO则会直接作用到磁盘,优点是减少数据拷贝和系统调用消耗,降低CPU使用率和内存占用。还有一种mmap方法,即将文件或对象映射到进程地址空间,减少一次数据拷贝和系统调用。
二、网络IO
网络IO由Linux内核统一处理,包括socket读写、数据准备和数据复制两个阶段。网络IO模型包括同步阻塞、同步非阻塞、多路复用、信号驱动和异步IO。同步阻塞IO导致进程阻塞直到数据准备好。同步非阻塞IO则允许进程在等待数据时执行其他操作。多路复用IO则允许同时监听多个连接。信号驱动IO允许在数据准备时发送信号,而异步IO允许在调用后直接获得结果。
三、Java IO接口
Java IO接口包括BIO(同步阻塞IO)、NIO(同步非阻塞IO)、AIO(异步非阻塞IO)和Okio。BIO使用InputStream/OutputStream进行IO操作,NIO基于多路复用原理,使用channel、selector和Buffer处理多个连接。AIO在NIO基础上实现数据准备和拷贝的异步操作。Okio是Java IO的封装和优化,提供Sink、Source、TimeOut和Segment等核心类简化IO操作。
总的来说,通过文件IO、网络IO和Java IO接口的不同模型,我们可以实现高效且灵活的IO操作。不同场景下选择合适的IO模型能够显著提高程序性能和效率。对于Okio的具体使用和详细架构,读者可以进一步探索其源码以深入了解。
2024-11-23 11:54
2024-11-23 11:34
2024-11-23 11:34
2024-11-23 11:23
2024-11-23 11:02
2024-11-23 10:46
2024-11-23 10:12
2024-11-23 10:11