频道栏目
首页 > 资讯 > 其他综合 > 正文

Spring Cloud Feign 优化实例

18-05-16        来源:[db:作者]  
收藏   我要投稿

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

		
			com.netflix.feign
			feign-httpclient
			8.18.0
		
		
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] 
相关TAG标签
上一篇:字符设备驱动 -- 异步通知解析
下一篇:IP地址和子网划分_IP格式和子网掩码
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站