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] 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章