SpringCloud Feign 优化

SpringCloud Feign 优化

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

		<dependency>
			<groupId>com.netflix.feign</groupId>
			<artifactId>feign-httpclient</artifactId>
			<version>8.18.0</version>
		</dependency>
		
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

发现配置启动后,无论如何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] 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值