首页 > 其他分享 >springboot~openfeign开启熔断之后MDC为null的理解

springboot~openfeign开启熔断之后MDC为null的理解

时间:2023-01-29 17:25:01浏览次数:52  
标签:traceId springboot openfeign MDC 模式 THREAD 熔断 超时

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

openFeign的熔断配置

ribbon:
  #ribbon请求连接的超时时间- 限制3秒内必须请求到服务,并不限制服务处理的返回时间
  connectTimeout: 1000
  #请求处理的超时时间 下级服务响应最大时间,超出时间消费方(路由也是消费方)返回timeout,超时时间不可大于断路器的超时时间
  readTimeout: 2000
hystrix:
  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模式才有效【注意,这种模式的熔断是没有超时时间的,所以性能不太好,高并发时,请求慢的慢,容易堆积,造成服务器的雪崩】

@Configuration
public class FeignTraceIdInterceptor implements RequestInterceptor {

	@Override
	public void apply(RequestTemplate template) {
		String traceId = MDC.get(TRACE_ID);
		if (traceId != null) {
			template.header(HTTP_HEADER_TRACE, traceId);
		}
	}
}

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

标签:traceId,springboot,openfeign,MDC,模式,THREAD,熔断,超时
From: https://www.cnblogs.com/lori/p/17073249.html

相关文章

  • SpringBoot3.x SpringCloudGateway与SpringDoc OpenApi整合
     网关的配置文件这个是用来转发各个服务的 /v3/api-docs请求routes:#转发swagger接口-id:openapiuri:http://localhost:${......
  • springboot 怎么启动aop @EnableAspectJAutoProxy
    SpringBoot项目使用aophttps://blog.csdn.net/qq_39176307/article/details/124714191Spring-AOPSpringBoot自动配置和启动SpringAOPhttps://www.bbsmax.com/A/QV5ZX3......
  • springboot配置文件读取顺序
    若application.yml和bootStrap.yml在同一目录下,则bootStrap.yml的加载顺序要高于application.yml,即bootStrap.yml会优先被加载。原理:bootstrap.yml用于应用程序上......
  • springboot实现连接多个数据源
    dynamicdatasource导入依赖<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId>......
  • SpringBoot中配置Redis
    SpringBoot中整合Redis缓存背景:工作中需要用到缓存之前都是用ConcurrentHashMap公司不让用redis那我就小试牛刀一下前端的App、网页在登录时,或是用户在进行一些敏感......
  • springboot启动原理分析
    https://blog.csdn.net/weixin_40496191/article/details/109098491?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIS......
  • springboot文件读取
    1、读取本工程下的文件@AutowiredprivateResourceLoaderresourceLoader;Resourceresource=resourceLoader.getResource("classpath:\\file\\二标段.xlsx");......
  • SpringBoot中读取JSON文件信息并转换为Map对象
    SpringBoot中读取JSON文件信息并转换为Map对象需要引入的依赖<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2<......
  • 大公司为什么禁止SpringBoot项目使用Tomcat?
    本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招......
  • 大公司为什么禁止SpringBoot项目使用Tomcat?
    本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校......