1. Hystrix 的禁用
问题:项目中有需求是不使用熔断机制的,例如退款请求;熔断的禁用可以有以下几种方式:
关闭熔断配置,这个配置就导致整个模块全部不可用
feign:
hystrix:
enabled: false
fallback/fallbackFactory 注释掉:这个方法会抛出 No fallback for HystrixCommand 异常 ,不是好的选择
官方的局部禁用
@Configuration
public class FeignDisableHystrixConfiguration {
@Bean
@Scope("prototype")
public Feign.Builder feignBuilder() {
return Feign.builder();
}
}
项目里面这个禁用导致了所有的模块的熔断禁用,原因是这个类放在了基础模块里,并且放在了启动类可以扫描的包下面了。
解决方法
- 要是用这个注解的话千万注意不要放到启动类可以扫描的包下面。(spring父子上下文扫描包重叠)
- 不要加@Configuration 注解,直接使用也是可以的
像下面这样用就可以了
@FeignClient(name = "promotion-resource", url = "",fallbackFactory = OrderPromotionFallback.class,
configuration= DisableHystrixConfiguration.class)
public interface OrderPromotionService {
}
2.feign的优化
Configuration · Netflix/Hystrix Wiki · GitHub
在网上找了很多对熔断的线程池的配置,刚开始复制着配置,测试的时候发现并没有头绪,不知道怎么去对比,线程池这一块的东西也搞混了。这才去看的官方文档,仔细的阅读了一遍配置信息,基本了解了一些。
FeignAutoConfiguration
优化1:
feign:
httpclient:
enabled: true
feign中支持三种http请求:JDK原生的http, OkHttpClient,Apache 的HttpClient,feign中默认使用的是JDK原生的http请求不支持连接池的配置 ,其他两个可以。这里我们用httpClient
优化2:
hystrix的连接池配置
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 5000
threadpool:
default:
coreSize: 20
maxQueueSize: 500
queueSizeRejectionThreshold: 500
coreSize: 20 #并发执行的核心线程数,默认10 maxQueueSize: 500 #BlockingQueue的最大队列数 默认-1 queueSizeRejectionThreshold: 500 #即使maxQueueSize没有达到,达到queueSizeRejectionThreshold该值后,请求也会被拒绝
线程数=每秒最大请求量*99%延迟时间(秒) + 缓存值(some breathing room)
延迟时间:我这边请教了前辈,是系统之间或微服务之间的响应时间(amy在10:20给我发消息,我在10:30才看到,这个时间段)
maxQueueSize: 默认-1,不设置这个属性 并发量大的时候会出现错误
queueSizeRejectionThreshold: 队列大小的拒绝阈值,默认值5 ,当maxQueueSize是-1时没有作用,所以要配合使用;但是排队数量达到属性最大值,会直接拒绝,即使maxQueueSize的值没有达到
注:需要结合系统的实际情况来配置,也做了大量的性能测试,目前我们的系统这些配置是足够的;还有很多配置在官方文档可以找到