feign 启用gzip压缩

本文详细记录了在项目中启用Feign客户端与服务端GZIP压缩的步骤,包括修改配置文件以开启gzip压缩,设置合适的压缩阈值和MIME类型,启用httpclient以及引入相应依赖。通过这些配置,可以确保数据传输时进行有效的压缩,提高服务性能。
摘要由CSDN通过智能技术生成

目录

1.项目中启用gzip压缩

2.在feign 服务提供方开启http压缩(很重要)

3.启用httpclient

4.还有一点很容易忽略的,引入httpclient jar包,同时注意和openfeign的版本一致。


一.最近项目要在feign中开启gzip压缩,网上看了好多都是相互抄袭的错误的文章,在这里记录一下我测试可行的方法。

1.项目中启用gzip压缩

compression.request.enabled=true
compression.request.enabled=true
compression.request.mime-types=text/xml,application/xml,application/json
compression.request.min-request-size=2048
compression.response.enabled=true
compression.response.useGzipDecoder=true。

2.在feign 服务提供方开启http压缩(很重要)

server:
  compression:
    enabled: true
    min-response-size: 10
    mime-types:
      - image/png
      - image/jpeg
      - image/jpg
      - text/html
      - application/javascript
      - text/css
      - application/octet-stream
      - application/json

3.启用httpclient

feign:
  httpclient:
    enabled: true

4.还有一点很容易忽略的,引入httpclient jar包,同时注意和openfeign的版本一致。

<dependency>
	<groupId>io.github.openfeign</groupId>
	<artifactId>feign-httpclient</artifactId>
	<version>10.1.0</version>
</dependency>

最后做个检查

 如果含有gzip压缩,压缩成功

当使用Feign进行网络请求时,如果请求中包含Gzip压缩的数据,有时会出现错误。 Feign是一个基于JavaHTTP客户端,用于简化和组织HTTP API的调用。它通过使用注解和接口定义来定义和配置请求,从而使得发起HTTP请求变得更加简单。 当使用Gzip压缩数据时,服务器可能会返回带有Gzip压缩的响应。由于Feign默认情况下并不支持Gzip响应的解压缩,因此当收到这样的响应时就会出现错误。 解决这个问题的方法是在Feign的配置中启用Gzip压缩。可以通过在Feign客户端的构建器中添加相应的配置来实现。以下是一种可能的解决方法: ```java import feign.Client; import feign.Feign; import feign.Request; import feign.codec.Decoder; import feign.codec.Encoder; import feign.okhttp.OkHttpClient; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; import okhttp3.internal.http.RealResponseBody; import okio.*; import java.io.IOException; import java.util.zip.GZIPInputStream; public class FeignGzipExample { public interface ApiService { // 定义API请求方法 } public static void main(String[] args) { // 创建自定义的HTTP Client OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new GzipRequestInterceptor()) .addInterceptor(new GzipResponseInterceptor()) .build(); // 使用自定义的Client创建Feign客户端 ApiService apiService = Feign.builder() .client(new feign.okhttp.OkHttpClient(client)) .build() .target(ApiService.class, "http://example.com"); // 发起请求 // apiService.someMethod(); } static class GzipRequestInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { // 请求前处理Gzip压缩 Request originalRequest = chain.request(); Request compressedRequest = originalRequest.newBuilder() .header("Accept-Encoding", "gzip") .build(); return chain.proceed(compressedRequest); } } static class GzipResponseInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { // 响应后处理Gzip压缩 Response response = chain.proceed(chain.request()); if ("gzip".equalsIgnoreCase(response.header("Content-Encoding"))) { ResponseBody responseBody = response.body(); if (responseBody != null) { BufferedSource source = Okio.buffer(Okio.source(responseBody.byteStream())); GZIPInputStream gzipInputStream = new GZIPInputStream(source.inputStream()); String responseBodyString = new String(source.readByteArray()); response = response.newBuilder() .body(ResponseBody.create(MediaType.parse(responseBody.contentType().toString()), responseBodyString)) .build(); } } return response; } } } ``` 以上代码中,我们自定义了一个OkHttpClient,并分别实现了GzipRequestInterceptor和GzipResponseInterceptor两个拦截器来处理Gzip压缩和解压缩。然后在Feign客户端的构建中,使用这个自定义的OkHttpClient。 这样,当使用Feign进行请求时,如果响应中包含Gzip压缩的数据,将会被正确地解压缩,避免报错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangkaixuan456

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值