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

经验分享 程序员 微信小程序 职场和发展