使用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 而不需要重新构建新的实现类。