广告
返回顶部
首页 > 资讯 > 前端开发 > html >OkHttp透明压缩的优点有哪些
  • 217
分享到

OkHttp透明压缩的优点有哪些

2024-04-02 19:04:59 217人浏览 薄情痞子
摘要

本篇内容介绍了“OkHttp透明压缩的优点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!要使用OkH

本篇内容介绍了“OkHttp透明压缩的优点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

要使用OkHttp,一定要知道它的透明压缩,否则死都不知道怎么死的;或者活也不知道为什么活的不舒坦。

反正不是好事。

什么叫透明压缩呢?OkHttp在发送请求的时候,会自动加入gzip请求头Accept-Encoding:gzip。所以,当返回的数据带有gzip响应头时Content-Encoding=gzip,OkHttp会自动帮我们解压数据。(Accept-Encoding和Content-Encoding是一对请求头,分别对应着请求和返回)

为什么要进行压缩呢?因为它能大幅减少传输的容量。像一些CPU资源占用不高的服务,比如kafka,我们就可以开启gzip压缩,加快信息的流转。

这个压缩比有多高呢?可以看下下面实实在在的截图,对于普通的xml或者JSON,数据可以由9MB压缩到350KB左右,压缩比足足达到了26。

OkHttp透明压缩的优点有哪些

它让系统性能飞起来

SpringCloud微服务体系,现在有非常多的公司在用。即使是一些传统企业,一些大数据量的toB企业,也想尝一尝螃蟹。

对于一个简单的SpringBoot服务,我们只需要在yml文件中配置上相应的压缩就可以了。这样,我们就打通了浏览器到WEB服务的这一环。这种压缩方式,对于大数据量的服务来说,是救命式的!

具体配置如下。

server:   port: 8082   compression:     enabled: true     min-response-size: 1024     mime-types: ["text/html","text/xml","application/xml","application/json","application/octet-stream"]

它所对应的spring配置类是org.springframework.boot.web.server.Compression。

但是不要高兴太早。由于是分布式环境,这里面调用链就会长一些。即使是在内网,动辄十几MB的网络传输,也会耗费可观的时间。

OkHttp透明压缩的优点有哪些

如上图,一个请求从浏览器到达真正的服务节点,可能要经过很多环节。

  • Nginx转发请求到微服务网关zuul

  • zuul转发到具体的微服务A

  • 微服务A通过Feign接口调用微服务B

如果我们的数据,大多数是由微服务B提供的,那么上面的任何一个环节传输效率慢,都会影响请求的性能。

所以,我们需要开启Feign接口的gzip压缩。使用OkHttp的透明代理是最简单的方式。

首先,在项目中引入feign的jar包。

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

其次,在yml文件中启用OkHttp作为feign的客户端请求工具包。稳妥起见,我们同时屏蔽了httpclient,这个东西太重太老了。

feign:   httpclient:     enabled: false   okhttp:     enabled: true

到此为止,我们就可以享受OkHttp的透明代理带来的便捷性了。

假如你的应用数据包大,调用链长,这种方式甚至会给你的服务带来数秒的性能力提升。xjjdog就曾经靠调整几个参数,就让一个蜗牛系统飞了起来。大家惊呼:原来B端也可以C一下。

OkHttp是如何实现透明压缩的?

OkHttp对于透明压缩的处理,是通过拦截器来做的。具体的类,就是okhttp3.internal.http.BridgeInterceptor。

具体代码如下,当判断没有Accept-Encoding头的时候,就自行加入一个。

// If we add an "Accept-Encoding: gzip" header field we're responsible for also decompressing // the transfer stream. boolean transparentGzip = false; if (userRequest.header("Accept-Encoding") == null && userRequest.header("Range") == null) {   transparentGzip = true;   requestBuilder.header("Accept-Encoding", "gzip"); }

最关键的代码在下面。

if (transparentGzip     && "gzip".equalsIgnoreCase(networkResponse.header("Content-Encoding"))     && HttpHeaders.hasBody(networkResponse)) {   GzipSource responseBody = new GzipSource(networkResponse.body().source());   Headers strippedHeaders = networkResponse.headers().newBuilder()       .removeAll("Content-Encoding")       .removeAll("Content-Length")       .build();   responseBuilder.headers(strippedHeaders);   String contentType = networkResponse.header("Content-Type");   responseBuilder.body(new RealResponseBody(contentType, -1L, Okio.buffer(responseBody))); }

可以看到if语句里,有三个条件。

  • 程序没有设置Accept-Encoding,启用了透明压缩

  • 服务端有Content-Encoding头,并启用了gzip压缩

  • 有数据包

只有同时满足这三个条件,OkHttp的透明压缩才会起作用,帮我们自动解压。

它挖的坑有点深

可惜的是,上面的关键代码,只有if,没有else,也就是当其中的任何一个条件不满足,后端的数据包将原封不动的返回。

2、3两个条件是没有什么问题的,原样返回后端数据并没有什么损害,问题就出在第一个条件里。

如果你在代码中,使用了下面的代码:

Request.Builder builder = chain.request()                 .newBuilder()                 .addHeader("Accept", "application/json")                 .addHeader("Accept-Encoding", "gzip");

也就是手动设置了Accept-Encoding头信息。这很常见,因为这体现了程序员思维的严谨。

正是这种严谨,造成了问题。

假如你的后端应用刚开始是没有开启gzip压缩的,这时候两者相安无事;但如果你的后端应用突然有一天开启了gzip压缩,你的这段代码将全部over。

原因就是,服务端gzip数据包会原样返回,你需要手动处理gzip数据包。

所以,不加是好事,加了反而会坏事,除非你想自己处理gzip数据。

由于OkHttp在Android上应用也非常广泛,如果你不知道这个细节,造成的后果就是灾难性的。客户端更新慢,只能老老实实回退服务端了。

智能的背后,总有些肉眼不可见的细节。就像是xjjdog纯情的背后,总有一份羞涩。只有深入了解,你才会知道它的美。

“OkHttp透明压缩的优点有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: OkHttp透明压缩的优点有哪些

本文链接: https://www.lsjlt.com/news/84631.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • OkHttp透明压缩的优点有哪些
    本篇内容介绍了“OkHttp透明压缩的优点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!要使用OkH...
    99+
    2022-10-19
  • Linux中有哪些压缩格式的压缩与解压方法
    Linux中有哪些压缩格式的压缩与解压方法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于P...
    99+
    2023-06-09
  • vue代码压缩优化方式有哪些
    小编给大家分享一下vue代码压缩优化方式有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!vue代码压缩优化设置productionSourceMap为false如果不需要生产环境的 source map,可以将其设置为...
    99+
    2023-06-29
  • linux的压缩命令有哪些
    linux中常见的压缩命令有:1.gzip命令,用于压缩文件;2.bzip2命令,用于压缩.bz2文件程序;3.tar命令,调用gzip程序对文件进行压缩;inux中常见的压缩命令有以下几种gzip命令linux中gzip命令的作用是用于压...
    99+
    2022-10-20
  • Linux中有哪些文件的压缩与解压缩命令
    本篇文章为大家展示了Linux中有哪些文件的压缩与解压缩命令,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、zip压缩与解压缩      ...
    99+
    2023-06-12
  • 不压缩HTML的原因有哪些
    这篇文章主要介绍不压缩HTML的原因有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!原因很简单: HTML 文档中,多个空白字符等价为一个空白字符。也就是说换行等空白字符的删除是不安全的,有可能导致部分元素的样式...
    99+
    2023-06-08
  • 常用的CSS透明属性有哪些
    本篇内容介绍了“常用的CSS透明属性有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码如下:.mas...
    99+
    2022-10-19
  • Linux系统有哪些常用的压缩解压方法
    本篇内容介绍了“Linux系统有哪些常用的压缩解压方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!.tar解包: tar xvf File...
    99+
    2023-06-10
  • 有关VS2003压缩代码的常识有哪些
    这篇文章给大家介绍有关VS2003压缩代码的常识有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先从这里下载0.84版本的VS2003压缩代码及示例码。下载下来之后你发现它没有VS2003的解决方案文件,没有关系...
    99+
    2023-06-17
  • java将文本压缩的方法有哪些
    Java中可以使用以下几种方法来压缩文本: 使用GZIP压缩:使用Java内置的GZIPOutputStream类来实现文本的压...
    99+
    2023-10-23
    java
  • 压缩两个集合的方法有哪些
    这篇文章主要介绍“压缩两个集合的方法有哪些”,在日常操作中,相信很多人在压缩两个集合的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”压缩两个集合的方法有哪些”的疑惑...
    99+
    2022-10-19
  • 常见的压缩文件格式有哪些
    常见的压缩文件格式包括:1. ZIP格式(.zip):最常见的压缩格式之一,可在多个操作系统和软件中使用。2. RAR格式(.rar...
    99+
    2023-06-11
    压缩文件格式
  • Linux中常用的压缩命令有哪些
    这篇文章将为大家详细讲解有关Linux中常用的压缩命令有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。打包是指将多个文件或者目录放在一起,形成一个总的包,这样便于保存和传输,但是大小是没有变化的,压缩...
    99+
    2023-06-28
  • win10任务栏变透明的作用有哪些
    Win10任务栏变透明的作用有以下几点: 美观:透明的任务栏可以增加操作系统的美观度,使整个桌面看起来更加清爽、简洁。 提升...
    99+
    2023-10-22
    win10
  • 定义透明效果的CSS3属性有哪些
    这篇文章主要为大家展示了“定义透明效果的CSS3属性有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“定义透明效果的CSS3属性有哪些”这篇文章吧。 界说通...
    99+
    2022-10-19
  • Android常见的图片压缩方式有哪些
    小编给大家分享一下Android常见的图片压缩方式有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!先给出一组数据原图:width:2976; height:2976原图实际:--->byte:2299820 Mb...
    99+
    2023-06-15
  • 数据库常用的压缩算法有哪些
    数据库常用的压缩算法有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  数据库常用的压缩算法怎么解读  最早的列式数据库S...
    99+
    2022-10-18
  • webpack中常用的JS压缩插件有哪些
    这篇文章给大家分享的是有关webpack中常用的JS压缩插件有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这里 讲解 三种JS 打包插件:(1)UglifyJS支持: babel present2015、w...
    99+
    2023-06-14
  • DevOps的优点有哪些
    这篇文章主要讲解了“DevOps的优点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“DevOps的优点有哪些”吧!DevOps(Development和Operations的组合词)是...
    99+
    2023-06-27
  • redis的优点有哪些
    这篇文章将为大家详细讲解有关redis的优点有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。redis是Nosql数据库中使用较为广泛的非关系型内存数据...
    99+
    2022-10-18
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作