Feign动态定义调用serverName与path

Feign动态定义调用path与serverName

需求背景:完成一个公共模块,当对接方接入时可以通过传递serverName与path,完成服务端对接入方的回调。

对于平时使用feign,大多数场景下都是知道对接方的hostname以及path,可直接使用@FeignClient(name = "",url = "")调用。

而对于动态uri的需求,我们也可以使用如下做法,做到动态uri调用。

	@GetMapping(value = "")
    byte[] functionName(URI uri);

但动态的serverName没办法在@FeignClient这个注解直接使用。于是就得通过手动创建FeignClient的方式,指定host与path。

  1. 定义一个FeignClient工厂
@Component
public class DynamicFeignClientFactory<T> {

    private FeignClientBuilder feignClientBuilder;

    public DynamicFeignClientFactory(ApplicationContext appContext) {
        this.feignClientBuilder = new FeignClientBuilder(appContext);
    }

    public T getFeignClient(final Class<T> type, String serviceId,String path) {
        return this.feignClientBuilder.forType(type, serviceId).path(path).build();
    }
}
  1. 提供一个业务feignClient
@FeignClient(name = "xxxClient",contextId = "xxxClient")
public interface XxxClient {
    @PostMapping(value = "")
    ResultObject functionName(@Param("param") String param);
}
  1. 在service方法中使用(因为我的项目中使用了nacos,serverName这个参数就是对应的应用服务名,应该也可以改成域名调用)
@Service
public class DemoService{
	@Resource
    private DynamicFeignClientFactory<XxxClient> feignClientFactory;

	public void demoFunction(String serverName, String uri, String params){
		XxxClient feignClient = feignClientFactory.getFeignClient(XxxClient.class, serverName, uri);
		feignClient.functionName(params);
	}
}

以上参考了这篇文章
对部分内容进行了改动,以适应自己的业务需求开发。以上文章还提供了其他的动态调用的方式。

你可能感兴趣的:(代码贡献,java,服务器,Feign)