`
zweichxu
  • 浏览: 131929 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

根据接口URL动态创建feign客户端

阅读更多

假设我有一个业务,根据一定规则轮流分配给两个不同的平台来完成。我定义任务数据发送接口,两家平台各自实现接口接收我发送的任务数据。如何根据两家平台提供的url动态创建feign客户端?

1.定义数据发送接口:

@FeignClient(name = "TaskSendClient")
public interface ITaskSendClient{ 
	@PostMapping(value="sendTask",consumes= MediaType.APPLICATION_JSON_UTF8_VALUE)
	SendTaskResp sendTask(@RequestBody TaskBean req);
}

 

2.定义feign客户端创建服务接口:

public interface IFeignClientCreateService {
  /**
     * @fun 通过url创建feign客户端实例
     * @param clientType feign接口类
     * @param url 动态url 
     * @return
     */
    public <T> T newClientByUrl(Class<T> clientType, String url);
}

 

 

3.实现feign客户端创建服务接口

@Service
@Import(FeignClientsConfiguration.class)
public class FeignClientCreateService implements IFeignClientCreateService {
    private final Feign.Builder urlBuilder; 
    
    private Map<String, Object> clientCached = new ConcurrentHashMap<>();
    
    @Autowired
    public FeignClientCreateServiceImpl(Decoder decoder, Encoder encoder, Client client, Contract contract) {
       
        if (client instanceof LoadBalancerFeignClient) { 
            client = ((LoadBalancerFeignClient)client).getDelegate();
        }
        
        urlBuilder = Feign.builder().client(client)
                                    .encoder(encoder)
                                    .decoder(decoder)
                                    .contract(contract);
    }

	@Override
	@SuppressWarnings("unchecked")
	public <T> T newClientByUrl(Class<T> clientType, String url) {
		Object obj = clientCached.get(url);
		if (obj != null) {
		    return (T)obj;
		}
		
		T client = urlBuilder.target(clientType, url);
		clientCached.put(url, client);
		return client;
	} 
}

 

 

4.调用

   (1)注入Feign客户端创建服务接口

 @Autowired
 private IFeignClientCreateService feignService;

   (2)动态生成客户端并调用:

 ITaskSendClient client = feignService.newClientByUrl(ITaskSendClient.class, url);
 SendTaskResp resp = client.sendTask(req)

   

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics