1

我有 2 个服务 S1 和 S2。使用来自 S1 的带注释的 Feign 客户端(@FeignClient)调用 S2。问题是,我无法在 S2 中获取 traceId。

但是当我尝试使用 RestTemplate 调用 S2 时,它可以工作。

任何帮助将不胜感激

编辑

我已经找出原因实际上我正在使用 Feign.Builder 下面是构建 fiegn 客户端的示例代码。

@ConditionalOnProperty(name = "feign.hystrix.enabled")
    public Feign.Builder feignHystrixBuilder() {
        SetterFactory setterFactory = new SetterFactory() {
            @Override
            public HystrixCommand.Setter create(Target<?> target, Method method) {
                String groupKey = target.name();
                String commandKey = target.name();
                return HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(groupKey))
                    .andCommandKey(HystrixCommandKey.Factory.asKey(commandKey));
            }
        };
        return HystrixFeign.builder().setterFactory(setterFactory);
    }

实际上由于上述配置.. SleuthFeignHystrixBuilder 没有被调用。我需要以我的格式设置 HysterixCommandKey .. 这就是为什么需要上面的配置。

它如何与 spring-sleuth 一起工作?

4

1 回答 1

1

我已经实现了 Spring 的 BeanPostProcessor 接口,然后设置了“setterFactory”。参考下面的示例代码

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

    if(bean instanceof HystrixFeign.Builder) {

        ((HystrixFeign.Builder)bean).setterFactory(new SetterFactory() {
            @Override
            public HystrixCommand.Setter create(Target<?> target, Method method) {
                String groupKey = target.name();
                String commandKey = target.name();
                return HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(groupKey))
                    .andCommandKey(HystrixCommandKey.Factory.asKey(commandKey));
            }
        });

    }
    return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
于 2020-06-18T11:12:01.050 回答