百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索

suiw9 2024-10-29 16:41 174 浏览 0 评论

背景

SpringCloud OpenFeign 支持3种 HTTP client 来发送请求,分别是:

  • HttpURLConnection 默认形式,Java提供。
  • Apache HttpClient 5
  • okhttp

我们使用的 HttpURLConnection 即默认形式,预期提升请求时效,结合推荐,替换成 okhttp 测试效果。

okhttp 介绍

okhttp 有如下特性优势:

  • 支持 HTTP/2
  • 使用 HTTP 连接池 (HTTP/2 不可用)
  • 使用GZIP 压缩
  • 对响应缓存
  • 连接恢复,如果访问的服务有多个地址,那么连接一个地址失败后,重试其他地址

我们可使用到的特性是 HTTP 连接池和连接恢复。

实现

代码设置

1.在 pom.xml 文件中引入 okhttp 的包。

<dependency>
		<groupId>io.github.openfeign</groupId>
		<artifactId>feign-okhttp</artifactId>
	</dependency>

2.在 Spring 的配置文件中,设置开启 okhttp

feign:
  okhttp:
    enabled: true

测试验证

调试 Feign 请求的代码,可以看到请求发送已经使用了 okhttp。

性能比较

对一个请求,其中实现中包含对另一个服务接口的 Feign 调用,进行 ab 压测,使用100个并发,发送10000次请求,比较其耗时。

1. HttpURLConnection 耗时情况

2. okhttp 耗时情况

可以看到请求时效的提升。

遇到的问题

1. method GET must not have a request body

Caused by: java.lang.IllegalArgumentException: method GET must not have a request body.
	at okhttp3.Request$Builder.method(Request.kt:258)

是因为 okhttp 框架要求 GET 请求不能有 requestbody 。当方法设置 `@RequestMapping` 而未设置 method 时,使用 GET 请求。

修改方案:1. POST 方法时,在 @RequestMapping 上设置 method 参数。2. GET 方法时,参数使用 @RequestParam 而不是 @RequestBody。

okhttp 关于 GET 请求是否支持 requestbody ,可在 github issue 区查看讨论。

2. jar 包版本冲突报错

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [okhttp3.OkHttpClient$Builder]: Factory method 'okHttpClientBuilder' threw exception; nested exception is java.lang.NoSuchFieldError: Companion
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
	... 111 common frames omitted
Caused by: java.lang.NoSuchFieldError: Companion
	at okhttp3.internal.Util.<clinit>(Util.kt:70)
	at okhttp3.internal.concurrent.TaskRunner.<clinit>(TaskRunner.kt:309)
	at okhttp3.ConnectionPool.<init>(ConnectionPool.kt:41)
	at okhttp3.ConnectionPool.<init>(ConnectionPool.kt:47)

是因为有其他 jar 包引入了 okhttp ,版本不同,底层实现的方法有不同。通过 IDE 查看各依赖。

修改方案:因为其他 jar 包引入的 okhttp 版本较低,升级高版本不可用。该服务采用不开启 okhttp,修改服务的 pom 文件不引入 okhttp 包。因为我们是基础的通用依赖,使用 exclusion 排除。

<exclusions>
	<exclusion>
		<groupId>io.github.openfeign</groupId>
		<artifactId>feign-okhttp</artifactId>
	</exclusion>
</exclusions>

Feign 请求开启 HTTP/2 探索

okhttp 支持 HTTP/2,那么我们使用 HTTP/2 有什么好处呢?在 HTTP/2 中,当客户端请求数据时,服务器会一次性将多个数据流发送到客户端,而不是逐个依次发送,这种数据传输方法成为多路复用。同一个主机的所有请求共用一个 socket 连接。

HTTP/2 的类型

1.h2 (HTTP/2 over TLS)

2.h2c (HTTP/2 over TCP)

h2 必须要开启 SSL,也就是基于 HTTPS。而 h2c 可以不开启 SSL。

server 端开启 HTTP/2

Spring 对 h2 和 h2c 都支持。开启 HTTP/2 通过配置文件开关即可。添加如下配置:

server:
  http2:
    enabled: true

服务启动后,发送请求查看到,验证服务端开启了 HTTP/2 。

`curl -I --http2 localhost:8885/***`



Feign请求的客户端开启 HTTP/2

1.okhttp 支持 HTTP/2,但是只支持 h2 的形式。目前我们项目并未引入 SSL,所以不可行。框架也无支持 h2c 的计划,相关讨论在github issue 区。

2.HttpURLConnection 在 HTTP/2 协议全面改动后,这个类无法升级支持。Java 是提供了一套新的类来支持 HTTP/2,它们是 HttpClient。而 OpenFeign 的接入还在 snapshot 版本,SpringCloud 接入还需要等待。

GitHub github = Feign.builder()
                     .client(new Http2Client())
                     .target(GitHub.class, "https://api.github.com");


<parent>
    <groupId>io.github.openfeign</groupId>
    <artifactId>parent</artifactId>
    <version>12.2-SNAPSHOT</version>
  </parent>

3.Apache HttpClient 5 启用该 http client 后,打开 Spring 的 HTTP/2 开关,发起请求并不是 HTTP/2 的形式,h2c 形式未成功。

如上 SpringCloud OpenFeign 开启 HTTP/2 均未成功,打算等 OpenFeign 12.2发布后再测试。

相关推荐

谁说 Vim 不好用?送你一个五彩斑斓的编辑器!

相信大家在使用各种各样强大的IDE写代码时都会注意到,代码中各种类型的关键字会用独特的颜色标记出来,然后形成一套语法高亮规则。这样不仅美观,而且方便代码的阅读。而在上古神器Vim中,我们通常看...

Python 基础教程 九之cron定时执行python脚本

前言在Linux或Unix系统中,你可以使用cron任务来定时执行Python脚本。cron是一个基于时间的作业调度器,允许你安排命令或脚本在系统上自动执行。...

RK3588主板Ubuntu 22.04固件刷机后需要进行哪些操作?

RK3588主板Ubuntu22.04固件刷机完成后,您需要进行以下操作:1、验证固件版本:确认您刷入的Ubuntu22.04固件版本是否正确,并且系统正常运行。...

Ubuntu16.04搭建VNC Server远程桌面服务器

1.前言本文主要讲解Ubuntu16.04怎么安装VNCServer远程桌面服务器。VNC全称为VirtualNetworkComputing(虚拟网络计算)是一种图形化桌面共享工具,允许...

开源&amp;Docker:何必nextcloud,新晋神级私人云盘,在线office编辑

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:可爱的小cherry前言大家好,这里是可爱的Cherry。...

Ubuntu系统,常用命令、IP配置等教程

Ubuntu系统常用命令与IP配置教程一、常用命令在Ubuntu系统中,掌握一些常用的命令对于日常操作非常重要,以下是常见的命令及其用法说明:1.ls—列出当前目录内容...

Ubuntu 24.10安装体验(ubuntu 20.04.1安装教程)

内核版本...

Zed编辑器:Rust之力,Linux之翼,VS Code劲敌新篇章

Zed是一款支持多人协作...

如何在Ubuntu系统中进行系统级的代理设置

Ubuntu系统级代理设置步骤详解在Ubuntu系统中进行系统级的代理设置是一种常见的网络配置方式,尤其适用于需要通过代理访问互联网的场景。通过配置代理,你可以让系统中的所有应用程序(如浏览器、终端、...

Linux Vim文本编辑器(linux用vi编辑文本)

在使用Linux操作系统的过程中,经常需要对文本文件进行操作,如新建、编辑等,常用的方法有以下几种:...

从零入门Linux(五)文本编辑器(linux好用的文本编辑器)

Linux系统提供了多种文本编辑器,每种编辑器都有其独特的功能和使用场景。以下按功能和复杂程度分类介绍:1.简单文本编辑器...

照片选择器,使用简单,几行代码就可以完成集成

照片选择器,使用简单,几行代码就可以完成集成来源:极客头条用于发表图片时候选择相册图片和拍照这样的需求,虽然网上也有很多类似的控件,写的挺不错的,但是深入使用就有些问题,还是自己写算了;网上的一些轮...

探索iOS 9适配(iphone适配)

CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面。如果您想投稿,或寻求《近匠》报道,请发送邮件至tang...

“旅行者”回望30载 一点淡蓝“焕新颜”

据美国国家航空航天局(NASA)网站12日报道,为纪念著名的“暗淡蓝点”(PaleBlueDot)照片问世30周年,NASA重新制作了这张照片,使其“焕新颜”,NASA喷气推进实验室于近日发布了新...

「底层技术原理体系」深入探索Java服务器性能监控Metrics框架

承接上文承接上文中的【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Counter篇),我们知道和了解了对应的Counter计数器的作用...

取消回复欢迎 发表评论: