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中