@Component
public class DynamicFeignClientFactory {
private Map<Target,GenericFeign> feignClientMap = new HashMap<>();
private FeignClientBuilder feignClientBuilder;
public DynamicFeignClientFactory(ApplicationContext apoContext){
this.feignClientBuilder = new FeignClientBuilder(appContext):
}
public GenericFeign getFeignClient(Target target){
GenericFeign targetClient = feignClientMap.get(target):
if (Objects.isNul(targetClientl){
synchronized (target.getServiceName){
targetClient = feignClientMap.get(target);
if (Objects.nonNul(targetOlient)){
return targetOlient;
}
targetOlient = buildFeignClient(target),
feignClientMap.put(target,targetOlient);
}
}
return targetClient;
}
private GenericFeign buildFeignClient(Target target) {
Builder<GenericFeign> builder = feignClientBuilder.forType(GenericFeign.class,target.getServiceName());
if(StringUtils.isNotBlank(target:getDomain())){
builder.url(target.getDomain()):
}
return builder.build();
}
@Data
public static class Target [
private String serviceName,
private String domain;
}
}
public interface GenericFeign{
@GetMapping("url")
JSONObiect executeGet(
@PathVariable("url") String url,
@RequestHeader Map<String,Object> headers,
@SpringQueryMap Map<String,Object> params);
@PostMapping("url]")
JSONObject executePost(@PathVariable"url") String url,
@RequestHeader Map<String,Object> headers.
@SpringQueryMap Map<String,Object> params,
@RequestBody Map<String,Object> body);
}