关于Feign远程调用传递租户Id 及 jdbc分库的方法

Blade 未结 2 241
tongyi
tongyi 2025-07-26 12:06

1. 创建一个配置文件

@Configuration
public class TenantFeignConfig {
    @Bean
    public RequestInterceptor tenantIdInterceptor() {
        return template -> {
            // 从当前线程上下文获取租户ID(需自行实现租户上下文管理)
            String tenantId = AuthUtil.getTenantId();
            if (Func.isNotBlank(tenantId)) {
                template.header("Blade-TenantId", tenantId);
            }
        };
    }
}

2. Feign Client 接口引入配置文件

@FeignClient(
       value = BaseAppConstant.APPLICATION_BASE_NAME,
       fallback = IBaseChannelClientFallback.class,
       configuration = TenantFeignConfig.class
)
public interface IBaseChannelClient {

3. Client 实现类

@RestController
@RequiredArgsConstructor
public class BaseChannelClient implements IBaseChannelClient {

    private final IBaseChannelService baseChannelService;
    private final BladeContext bladeContext;

    @Override
    public R getChannel(Long id) {
        String tenantId = bladeContext.getTenantId(); // 获取租户Id
        try {
            DynamicDataSourceContextHolder.push(tenantId); // 切换数据源(如不需要可以去掉 try{...}finally{...} )
            return R.data(
                    TenantUtil.use(tenantId, () -> baseChannelService.getById(id)) // 线程注入租户Id
            );
        } finally {
            DynamicDataSourceContextHolder.poll();
        }
    }
}

希望官方可以封装上述功能到tool中

2条回答
  •  admin
    admin (楼主)
    2025-07-28 14:21

    这个逻辑无法写到tool里全局生效,需要手动处理

提交回复