JDK httpClient 详解(源码级分析)——概览及架构篇-编程思维

1. 前言

2018年9月,伴随着java 11的发布,内置的httpclient正式登上了历史的舞台。此前,JDK内置的http工具URLConnection性能羸弱,操作繁琐,饱受诟病,也因此令如Apache 的 Httpclient, Square的 OKHttp 这样的第三方客户端大放异彩。新生的JDK Httpclient,拥抱了响应式流(Reactive Stream)模型,使用了JAVA 9引入的Flow api,并运用completableFuture使调用流程异步化(在IO层面实现非阻塞化),带来了性能的提升和焕然一新的使用体验。

然而,时至如今,网络上对JDK Httpclient的分析基本是泛泛而谈,多止步于基本的使用样例,缺乏对实现的分析。或许是因为目前(2021年末)JAVA8还是主流版本,又或许是开发者已习惯了使用熟悉的Http客户端。然而,尽管我们将要看到JDK内置的httpClient并不完善,但它的实现仍有许多值得学习的地方。理解Httpclient,有助于我们更好地掌握面向对象编程和异步编程,理解NIO模型,对网络编程有更深刻的理解。

从使用到源码,让我们走进JDK HttpClient的内心,见证它从初始化、建立和维护连接、收发请求、结束回收的生命历程。

本系列文章的源码分析基于 (Zulu) Open JDK 17。截止2021年末,主要分析Http1请求的主要流程。

2. 文章链接

HttpClient使用和性能测试
HttpClient客户端的构建和启动
HttpClient对多重请求——响应的处理
HttpClient 单次请求的生命周期

3. 预备知识

Reactive Streams 及 Java Flow api

响应式编程是一种面向数据流和变化传播的编程范式,可以在编程语言中很方便地表达静态或动态的数据流,相关的计算模型会自动将变化的值通过数据流进行传播。

Reactive Streams 是一项倡议,旨在为具有非阻塞背压的异步流处理提供标准。 http://www.reactive-streams.org/。某种程度上,响应式流的编程方式是观察者模式和迭代器模式的结合,但其更注重的是“非阻塞”的特性。

JDK9将Reactive Streams标准所规范的相关接口,集成到官方类库中,位于java.base模块中的java.util.concurrent包下。JDK官方实现的HttpClient完全建立在响应式流模型上,结合completableFuture,使Http请求的流程完全非阻塞化。

https://zhuanlan.zhihu.com/p/41342507

Http/Https/Http2

HTTP(1/2)是基于客户端请求——服务器响应模型的相关协议。Https是在http(1/2)协议之上多套一层SSL(TLS)协议后的协议。

IO模型(BIO/NIO)

HttpClient的实现,使用了JAVA自身的NIO类库(Selector,Channel等)来完成连接建立、数据传输等功能,其背后的底层原理是操作系统提供的(同步)I/O多路复用机制:操作系统提供系统调用,调用后内核来轮询各个文件描述符是否可读或可写;当相关系统调用返回可读或可写时,此时应用程序从便可从用户缓冲器写数据到内核缓冲区,或者从内核缓冲器读数据到用户缓冲区。

怎样理解阻塞非阻塞与同步异步的区别? - 知乎 https://www.zhihu.com/question/19732473

IO多路复用到底是不是异步的? - 闪客sun的回答 - 知乎 https://www.zhihu.com/question/59975081/answer/1932776593

4. 架构图及功能简述

下面是本人阅读HttpClient源码后,总结出的架构图

简要介绍下各层的作用:

  • 客户端层:分为外观层和实现层,主要作用是的提供调用的api,发起同步或异步的Http请求

  • 交换层:分为多重交换层MultiExchange和单次交换层Exchange,单次交换层又委托给下面具体实现的Http1.1/Http2交换层

    • MultiExchange:处理一个用户请求可能衍生出的多个请求——响应交换
    • Exchange:处理单次请求——响应交换
  • 连接层:管理Http连接,负责建立和复用Http连接的过程

  • 管道层:负责建立、维护Socket连接及收发数据。分为Socket管道和可能存在的建立于其上的SSL管道

    • Socket管道:负责向Socket通道发送或从其接收数据
    • SSL管道:负责https请求的SSL认证及数据的加密、解密

见识了HttpClient的分层架构,那么它如何使用,性能如何呢?我们下回分解。

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/cavern-builder-zyx/p/15754627.html

JDK Httpclient 使用和性能测试-编程思维

Httpclient 使用和性能测试 上篇,通过简介和架构图,我们对HttpClient有了初步的了解。 本篇我们展示HttpClient的简单使用,同时为了说明httpclient的使用性能,我们将Httpclient的同步和异步模式与apache的Httpclient4作比较。。 1. HttpClient示例代码

JDK HttpClient客户端的构建和启动-编程思维

HttpClient客户端的构建和启动 目录HttpClient客户端的构建和启动1. 简述2. HttpClient客户端构建:建造者模式、代理模式3. 选择器线程的运行3.1 源码分析3.2 基本流程3.3 外观客户端的意义4. 小结 1. 简述 上篇简单测试过,Http Client 的性能相对高效。那么,这样一

JDK HttpClient 多重请求-响应的处理-编程思维

HttpClient 多重请求-响应的处理 目录HttpClient 多重请求-响应的处理1. 简述2. 请求响应流程图3. 用户请求的复制4. 多重请求处理概览5. 请求、响应过滤的执行:cookie,认证和重定向6. 小结 1. 简述 上篇介绍了JDK HttpClient客户端的构建和启动。在客户端构建完成时,后