openfeign动态调用相同接口,不同服务的问题
提示:实际开发中,会存在这种 总部和分厂的关系,总部是一个项目,而分厂却是相同的项目不同的地址,
比如3个分厂都有一个名为"getUserInfoApi"的接口,总部想根据业务逻辑去调用某个特定的分厂的"getUserInfoApi"接口,
总部的代码如下:
public void getFactoryUserInfo(String a){
if(a==0){
调用A分厂getUserInfoApi接口
}else if(a==1){
调用B分厂getUserInfoApi接口
}else{
调用C分厂getUserInfoApi接口
}
}
具体的判断条件可根据实际业务逻辑,如果分厂在后续又会增加变多,如何在不改变代码的前提下实现.
分厂的服务注册到nacos中,在总部服务中,让分厂的服务与业务逻辑做关联
模拟场景:
总部的组织机构,将部门1和部门2关联分厂A;部门3和部门4关联分厂B,部门5关联分厂C,…
根据人员获取该人员的所属部门并且得到该人员所属分厂的服务名,并调用该分厂的某个接口
分厂的某个接口代码:
//A,B,C,D分厂.....都有这个接口,供总部调用
public interface FcInterfaceApi {
@RequestMapping("/fcInterface/getUserInfo")
Result getUserInfo(@RequestParam(value ="name") String name);
}
@Component
@SuppressWarnings("all")
public class DyServernamicFeignClient<T> {
private FeignClientBuilder feignClientBuilder;
public DyServernamicFeignClient(@Autowired ApplicationContext appContext) {
this.feignClientBuilder = new FeignClientBuilder(appContext);
}
/**
* 降级机制
* @param interFegin 接口
* @param serviceName 服务名称
* @param fallback 降级回调
* @return
*/
public T getFeignClient(final Class<T> interFegin, String serviceName,final Class fallbackFactory)
{
return (T) this.feignClientBuilder.forType(interFegin, serviceName).fallbackFactory(fallbackFactory).build();
}
}
import org.springframework.cloud.openfeign.FeignClient;
import com.nankaistar.platform.adxt.factory.api.FcInterfaceApi;
public interface FcInterfaceApiFegin extends FcInterfaceApi{
}
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import com.nankaistar.platform.common.utils.Result;
import com.nankaistar.platform.common.utils.ResultCode;
/**
* 容错机制,如超时的话返回信息
* @author Administrator
*
*/
public interface FcInterfaceApiFallback extends FcInterfaceApiFegin{
}
@Component
public class FcInterfaceApiFallbackFactory implements FallbackFactory<FcInterfaceApiFegin>{
@Override
public FcInterfaceApiFegin create(Throwable cause) {
cause.printStackTrace();
return new FcInterfaceApiFallback() {
@Override
public Result getUserInfo(String name) {
return Result.build(ResultCode.e20004);
}
};
}
}
@RestController
public class LinkFactoryController {
@Autowired
DyServernamicFeignClient<FcInterfaceApiFegin> client;
/**
* 总部调用分厂接口
* 动态指定服务名称
* @return
*/
@RequestMapping("/jtToFactory")
public Result jtToFactory() {
try {
String username='张三';
String deptid=xxxService.getDeptByUserNAME(username);//根据用户姓名查找到该人员所属的部门id
String service_name=xxxService.getserverNAMEByDeptid(deptid);//根据部门id获取该部门所属的分厂的服务名
FcInterfaceApiFegin demoApiFegin=client.getFeignClient(FcInterfaceApiFegin.class,service_name,FcInterfaceApiFallbackFactory.class);
Result result=demoApiFegin.getUserInfo("李四");
return result;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}