最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

当前观点:springboot~openfeign开启熔断之后MDC为null的理解

来源:博客园


(相关资料图)

openfeign开启熔断之后MDC为null,这是有前提的,首先,你的熔断开启后,使用的是线程池的熔断模式,即hystrix.command.default.execution.isolation.strategy=THREAD,或者不写这行,如果值是SEMAPHORE模式,是可以获取到MDC对象的,因为这种信号量模式,并没有产生新的线程,所以对于ThreadLocal类型的MDC对象,是可以获取到的。

openFeign的熔断配置

ribbon:  #ribbon请求连接的超时时间- 限制3秒内必须请求到服务,并不限制服务处理的返回时间  connectTimeout: 1000  #请求处理的超时时间 下级服务响应最大时间,超出时间消费方(路由也是消费方)返回timeout,超时时间不可大于断路器的超时时间  readTimeout: 2000hystrix:  command:    default:      execution:        timeout:          enabled: true        isolation:          strategy: THREAD #信号量模式,无超时时间;THREAD线程池模块,这是默认的          thread:            timeoutInMilliseconds: 3000 #对THREAD模式才有效feign:  hystrix:    # Feign启用断路器,默认为FALSE,如果开启熔断,如果是线程池模式,会在新线池中发起请求,这时MDC无论获取到,如果是SEMAPHORE模式,是可以获取到MDC的    enabled: true

在openFeign的拦截器中,获取MDC中的traceId

注意,咱们的这个拦截器获取traceId功能,只是在SEMAPHORE模式才有效【注意,这种模式的熔断是没有超时时间的,所以性能不太好,高并发时,请求慢的慢,容易堆积,造成服务器的雪崩】

@Configurationpublic class FeignTraceIdInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {String traceId = MDC.get(TRACE_ID);if (traceId != null) {template.header(HTTP_HEADER_TRACE, traceId);}}}

在后面的调研中,我们还会针对THREAD模块进行探究,找到获取MDC中traceId的方法,请期待。

关键词: 服务器的 请求处理 返回时间