圖片.png
圖片.png
圖片.png
1、問題產(chǎn)生描述:在高并發(fā)且feign接口處理的數(shù)據(jù)量很大的情況下,會發(fā)生線程阻塞異常導致并發(fā)QPS在70多,如下圖所示:
圖片.png
根據(jù)源碼進行分析:
圖片.png
圖片.png
圖片.png
在進行類加載的時候,使用了synchronized關鍵字進行同步加載,在這個地方出現(xiàn)了線程阻塞,導致系統(tǒng)并發(fā)吞吐量不高。
解決方案:
采用FastJsonHttpMessageConverter替換MappingJackson2HttpMessageConverter,提示系統(tǒng)并發(fā)吞吐量達到1000+。
@EnableSwagger2
@SpringBootApplication
@EnableFeignClients(basePackages = {"com.daling.cart.client"}, defaultConfiguration = FeignFastjsonConfig.class)
public class ShoppingCartApplication {
public static void main(String[] args) {
SpringApplication.run(ShoppingCartApplication.class, args);
}
}
@Configuration
public class FeignFastjsonConfig {
@Bean
public Encoder EncoderfeignEncoder() {
return new SpringEncoder(feignHttpMessageConverter());
}
@Bean
public Decoder DecoderfeignDecoder() {
return new SpringDecoder(feignHttpMessageConverter());
}
private ObjectFactory<HttpMessageConverters> feignHttpMessageConverter() {
final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(getFastJsonConverter());
return () -> httpMessageConverters;
}
private FastJsonHttpMessageConverter getFastJsonConverter() {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
List<MediaType> supportedMediaTypes = new ArrayList<>();
MediaType mediaTypeJson = MediaType.valueOf(MediaType.APPLICATION_JSON_UTF8_VALUE);
supportedMediaTypes.add(mediaTypeJson);
converter.setSupportedMediaTypes(supportedMediaTypes);
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
converter.setFastJsonConfig(config);
return converter;
}
}