openfeign动态调用相同接口,不同服务的问题

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;
		}
		
	}
   

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Spring Cloud使用OpenFeign调用别的服务中的方法非常容易,只需要按照以下步骤进行操作: 1.添加依赖 首先在pom.xml文件中添加OpenFeign依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` 2.创建Feign客户端 在Java代码中创建一个Feign客户端,用来调用另一个服务中的方法。例如,要调用一个名为"order-service"的服务中的方法,可以创建一个名为"OrderServiceClient"的Feign客户端: ```java import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(name = "order-service") public interface OrderServiceClient { @GetMapping("/orders") List<Order> getOrders(); } ``` 在上面的代码中,我们使用@FeignClient注解将OrderServiceClient注册为一个Feign客户端,并设置其名称为"order-service",这个名称与我们要调用服务名称相同。紧接着,我们定义了一个名为"getOrders()"的方法,用来调用"order-service"服务中的"/orders"接口,并返回"Order"类型的列表。 3.使用Feign客户端 最后,在我们的代码中使用OrderServiceClient来调用"order-service"服务中的方法: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @Autowired private OrderServiceClient orderServiceClient; @GetMapping("/my-orders") public List<Order> getMyOrders() { return orderServiceClient.getOrders(); } } ``` 在上面的代码中,我们使用@Autowired注解将OrderServiceClient注入到MyController中。然后,我们定义了一个名为"getMyOrders()"的方法,用来调用OrderServiceClient中的"getOrders()"方法,并返回"Order"类型的列表。 这样,我们就可以使用OpenFeign轻松地调用别的服务中的方法了。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值