Spring Cloud 使用Feing进行伪RPC操作,Feing默认使用feign.Client 代码在DefaultFeignLoadBalancedConfiguration 的Client.Default
@Configuration class DefaultFeignLoadBalancedConfiguration { @Bean @ConditionalOnMissingBean public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory, SpringClientFactory clientFactory) { return new LoadBalancerFeignClient(new Client.Default(null, null), cachingFactory, clientFactory); } }
若如果你需要进行请求压缩,我们可参见feign 官网文档介绍?http://cloud.spring.io/spring-cloud-static/spring-cloud-openfeign/2.0.0.RC1/single/spring-cloud-openfeign.html
(PS 实际情况springcloud2.0我个人觉得由于BUG即使你配置了也不会进行压缩)
feign.compression.request.enabled=true feign.compression.response.enabled=true feign.compression.request.enabled=true feign.compression.request.mime-types=text/xml,application/xml,application/json feign.compression.request.min-request-size=2048
然而在springcloud 2.0版这么配置后,启动将会报错,springcloud开发人员还在解决中。
退而求其次使用springcloud Dalston.SR5版本测试 不再报错,为确保feign用GZIP进行压缩,我们将feign日志启用
@Configuration public class FeignConfiguration { @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } } feing配置 @FeignClient(name="FEIGN-SERVICE2-TEST",fallback = FeignTestFallback.class,configuration = FeignConfiguration.class) yml配置 logging: level: com.feign.test.feigntest.v15.feign.service: debug
配置后,我们发现feing 请求还是没有按照gzip进行压缩,进行调试,因为gzip压缩主要是该启动类
import feign.Feign; import feign.httpclient.ApacheHttpClient; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.netflix.feign.FeignAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Configures the Feign response compression. * * @author Jakub Narloch * @see FeignAcceptGzipEncodingInterceptor */ @Configuration @EnableConfigurationProperties(FeignClientEncodingProperties.class) @ConditionalOnClass(Feign.class) @ConditionalOnBean(ApacheHttpClient.class) @ConditionalOnProperty(value = "feign.compression.response.enabled", matchIfMissing = false) @AutoConfigureAfter(FeignAutoConfiguration.class) public class FeignAcceptGzipEncodingAutoConfiguration { @Bean public FeignAcceptGzipEncodingInterceptor feignAcceptGzipEncodingInterceptor(FeignClientEncodingProperties properties) { return new FeignAcceptGzipEncodingInterceptor(properties); } }
发现该类需要使用ApacheHttpClient,引入POM
yml配置 feign: compression: request: enabled: true mime-types: text/xml,application/xml,application/json # 配置压缩支持的MIME TYPE min-request-size: 1 response: enabled: true httpclient: enabled: true #启用httpclient com.netflix.feign feign-httpclient 8.18.0
发现配置启动后,无论如何FeignAcceptGzipEncodingAutoConfiguration都是没有执行过,也就意味着我们的请求还是没有进行gzip压缩。
以上差不多是网上大部分feign优化文档内容,仅仅配置compression没有去验证是否真正的压缩,无奈我翻了N多文档,终于找到了这个?https://github.com/spring-cloud/spring-cloud-netflix/issues/2462
Yeah the reason this does not work when using Ribbon is because FeignAcceptGzipEncodingAutoConfiguration is not auto configured after FeignRibbonClientAutoConfiguration and also because it requires there be an ApacheHttpClient bean created as well, which there is not when Ribbon is used. I will take a look at this and see if we can make it work when Ribbon is used as well. @gbtec-ingogriebsch for now you can try and create your own configuration class which returns a FeignAcceptGzipEncodingInterceptor bean and that would probably work for your use case. Let us know.
终于知道原因,并且我对比了springcloud2.0代码,该类已经把 @ConditionalOnBean(ApacheHttpClient.class)改为@ConditionalOnMissingBean(OkHttpClient.class),已经可以正常gzip压缩请求,无奈springcloud 2.0该compress配置还有BUG无法使用。
自己新增一个一摸一样的FeignAcceptGzipEncodingAutoConfiguration注释@ConditionalOnBean(ApacheHttpClient.class),或自己实现FeignAcceptGzipEncodingInterceptor
@Configuration @EnableConfigurationProperties(FeignClientEncodingProperties.class) @ConditionalOnClass(Feign.class) //@ConditionalOnBean(ApacheHttpClient.class) @ConditionalOnProperty(value = "feign.compression.response.enabled", matchIfMissing = false) @AutoConfigureAfter(FeignAutoConfiguration.class) public class FeignAcceptGzipEncodingAutoConfiguration { @Bean public FeignAcceptGzipEncodingInterceptor feignAcceptGzipEncodingInterceptor(FeignClientEncodingProperties properties) { return new FeignAcceptGzipEncodingInterceptor(properties); } }
查看feign调用日志,终于搞定,可见有多少人只是看了下文档没有去实际测试过,另外说明springcloud feing相比grpc、thrift性能较差,对性能要求较高的场景很多人不一定会使用feign来进行通信,否则也不至于没人发现了。
2018-05-04 17:59:46.991 DEBUG 41072 --- [o-10001-exec-10] c.f.t.f.v.feign.service.FeignTestClient : [FeignTestClient#requestMessage] ---> POST http://FEIGN-SERVICE2-TEST/reply?name=world%3A0 HTTP/1.1 2018-05-04 17:59:46.991 DEBUG 41072 --- [o-10001-exec-10] c.f.t.f.v.feign.service.FeignTestClient : [FeignTestClient#requestMessage] Accept-Encoding: gzip 2018-05-04 17:59:46.992 DEBUG 41072 --- [o-10001-exec-10] c.f.t.f.v.feign.service.FeignTestClient : [FeignTestClient#requestMessage] Accept-Encoding: deflate 2018-05-04 17:59:46.992 DEBUG 41072 --- [o-10001-exec-10] c.f.t.f.v.feign.service.FeignTestClient : [FeignTestClient#requestMessage] ---> END HTTP (0-byte body) 2018-05-04 17:59:51.177 DEBUG 41072 --- [o-10001-exec-10] c.f.t.f.v.feign.service.FeignTestClient : [FeignTestClient#requestMessage] <--- HTTP/1.1 200 (4184ms) 2018-05-04 17:59:51.177 DEBUG 41072 --- [o-10001-exec-10] c.f.t.f.v.feign.service.FeignTestClient : [FeignTestClient#requestMessage] content-type: application/json;charset=UTF-8 2018-05-04 17:59:51.177 DEBUG 41072 --- [o-10001-exec-10] c.f.t.f.v.feign.service.FeignTestClient : [FeignTestClient#requestMessage] date: Fri, 04 May 2018 09:59:51 GMT 2018-05-04 17:59:51.177 DEBUG 41072 --- [o-10001-exec-10] c.f.t.f.v.feign.service.FeignTestClient : [FeignTestClient#requestMessage] transfer-encoding: chunked 2018-05-04 17:59:51.177 DEBUG 41072 --- [o-10001-exec-10] c.f.t.f.v.feign.service.FeignTestClient : [FeignTestClient#requestMessage] x-application-context: feign-service2-test:10002 2018-05-04 17:59:51.177 DEBUG 41072 --- [o-10001-exec-10] c.f.t.f.v.feign.service.FeignTestClient : [FeignTestClient#requestMessage]