最近在工作中遇到了一个这样的问题,情景如下:
在微服务两个实例直接调用的时候会打印出一些日志但是发现这些日志的log_id变了,正常来说应该是保持一致的,实例A调用B的时候发现log_id是一致的,但是实例B调用A就不一致了,后来调试了一下发现问题出在断路器-Hystrix 的隔离策略上,原来A的隔离策略是信号量隔离(SEMAPHORE),B的隔离策略是线程池隔离(THREAD),并且默认的是线程池隔离,而线程池隔离的原理就是feign 请求会由Hystrix的线程池来进行请求也就是说携带着log_id的线程和真正调用feign的线程并不是一个线程!所以不管是写在header里面的log_id还是线程本身携带的ThreadLocal都会丢失,要解决这个问题有两个方案:
1.修改 Hystrix 策略为信号量隔离
2.扩展Hystrix线程池隔离支持线程之间信息传递 extends HystrixConcurrencyStrategy
我选择的是修改策略为信号量隔离,果然修改过后就可以携带log_id了。