使用FeignClient调用接口时动态切换url
使用FeignClient调用接口时动态切换url
当我们需要根据某个标识字段去调用不同的友商或内部接口时,又不想写两套方法时,可以使用这种方式
这种方式可以根据自己的条件去nacos配置文件中动态的获取URL
1.FeignClient接口定义
import java.net.URI;
@FeignClient(contextId = "L2Dot5ClassEFeignService",
name = "mes-pmcross",
url = "EMPTY",//url中的参数可以是任意字符串,但是不能为空
fallbackFactory = PMPSBWL2Dot5FeginServiceFallbackFactory.class)
public interface PMPSBWL2Dot5FeignService {
/**
* @description:
* @param: [dto]
* @param: URI uri 这个就是url地址 导包地址为 import java.net.URI,
* 它会直接替换上面那个@FeignClient注解中的url地址
* @return: cn.midas.midas4j.foundation.core.data.ResultMessage
* @author: tjx
* @create: 2022-01-18 09:09
**/
@ExtralWebApi
@PostMapping(value = "openapi/plan/sendPlan")
ResultMessage planIssue(URI uri, @RequestBody List<PMPSBWPlanIssueDto> dtos);
}
2.方法的调用
@Resource
private PMPSBWL2Dot5FeignService PMPSBWL2Dot5FeignService;
@Value("${eiurl.eixg}") //使用@Value获取nacos中配置的地址
private String h2Url;
@Value("${eiurl.eixgh1}") //使用@Value获取nacos中配置的地址
private String h1Url;
public void planIssue(List<PMPSA1> pmpsa1s){
//根据标识字段分组
Map<String, List<PMPSA1>> collect = pmpsa1s.stream().collect(Collectors.groupingBy(PMPSA1::getXcType));
//分发请求
collect.forEach((k, v) -> {
if ("H2".equals(k)) {
ResultMessage resultMessage = null;
try {
//调用Feign接口根据不同的标识符去使用不同的url
resultMessage = PMPSBWL2Dot5FeignService.planIssue(new URI(h2Url), list);
} catch (URISyntaxException e) {
e.printStackTrace();
}
if (resultMessage.getCode() != 200) {
throw new BussinessException("接口返回信息: " + resultMessage.getMessage());
}
} else {
ResultMessage resultMessage = null;
try {
//调用Feign接口根据不同的标识符去使用不同的url
resultMessage = PMPSBWL2Dot5FeignService.planIssue(new URI(h1Url), list);
} catch (URISyntaxException e) {
e.printStackTrace();
}
if (resultMessage.getCode() != 200) {
throw new BussinessException("接口返回信息: " + resultMessage.getMessage());
}
}
});
}
这个是Feign提供的一种机制,可以动态的替换该url。 具体操作是在方法增加一个 URI 类型的参数,方法执行时,该 URI对象会动态替换原来的 url 而不需要重新构建新的实现类。
