我可以动态创建一个 Feign Client 或创建一个具有不同名称的实例吗
Can I dynamic create a Feign Client or create an instance with a different name
我定义了一个 REST 接口,它有一个不同的 Spring 引导应用程序实现,使用不同的 spring.application.name
(spring.application.name
在我的业务中不能相同)。
如何只定义一个Feign Client,就可以访问所有SpringBootApplication REST服务?
SpringBootApplication A(spring.application.name=A) 和 B(spring.application.name=) 有这个 RestService:
@RestController
@RequestMapping(value = "/${spring.application.name}")
public class FeignRestService {
@Autowired
Environment env;
@RequestMapping(path = "/feign")
public String feign() {
return env.getProperty("server.port");
}
}
另一个SpringBootApplication C:
@FeignClient(name="SpringApplication A or B")
public interface FeignClientService {
@RequestMapping(path = "/feign")
public String feign();
}
在SpringBootApplication C中,我想用一个FeignClientService来访问A和B,你有什么想法吗?
您可能已经想到了这一点,但这可能会帮助正在寻找相同问题答案的任何人。您需要为每个使用服务的服务客户端配置 Feign Clients。
无法使用相同的 Feign 客户端调用不同的服务,因为 Feign 客户端与您定义的服务相关联。
是的,您可以创建一个 Feign 客户端,并根据需要重复使用它来调用 Eureka 目录中的不同命名服务(您用 spring-cloud-netflix 标记了问题)。这是您如何操作的示例:
@Component
public class DynamicFeignClient {
interface MyCall {
@RequestMapping(value = "/rest-service", method = GET)
void callService();
}
FeignClientBuilder feignClientBuilder;
public DynamicFeignClient(@Autowired ApplicationContext appContext) {
this.feignClientBuilder = new FeignClientBuilder(appContext);
}
/*
* Dynamically call a service registered in the directory.
*/
public void doCall(String serviceId) {
// create a feign client
MyCall fc =
this.feignClientBuilder.forType(MyCall.class, serviceId).build();
// make the call
fc.callService();
}
}
调整调用接口以满足您的要求,然后您可以将 DynamicFeignClient
实例注入并使用到您需要使用它的 bean 中。
几个月来,我们一直在生产中使用这种方法来查询数十种不同的服务,以获取版本信息和其他有用的运行时执行器数据等内容。
我定义了一个 REST 接口,它有一个不同的 Spring 引导应用程序实现,使用不同的 spring.application.name
(spring.application.name
在我的业务中不能相同)。
如何只定义一个Feign Client,就可以访问所有SpringBootApplication REST服务?
SpringBootApplication A(spring.application.name=A) 和 B(spring.application.name=) 有这个 RestService:
@RestController
@RequestMapping(value = "/${spring.application.name}")
public class FeignRestService {
@Autowired
Environment env;
@RequestMapping(path = "/feign")
public String feign() {
return env.getProperty("server.port");
}
}
另一个SpringBootApplication C:
@FeignClient(name="SpringApplication A or B")
public interface FeignClientService {
@RequestMapping(path = "/feign")
public String feign();
}
在SpringBootApplication C中,我想用一个FeignClientService来访问A和B,你有什么想法吗?
您可能已经想到了这一点,但这可能会帮助正在寻找相同问题答案的任何人。您需要为每个使用服务的服务客户端配置 Feign Clients。
无法使用相同的 Feign 客户端调用不同的服务,因为 Feign 客户端与您定义的服务相关联。
是的,您可以创建一个 Feign 客户端,并根据需要重复使用它来调用 Eureka 目录中的不同命名服务(您用 spring-cloud-netflix 标记了问题)。这是您如何操作的示例:
@Component
public class DynamicFeignClient {
interface MyCall {
@RequestMapping(value = "/rest-service", method = GET)
void callService();
}
FeignClientBuilder feignClientBuilder;
public DynamicFeignClient(@Autowired ApplicationContext appContext) {
this.feignClientBuilder = new FeignClientBuilder(appContext);
}
/*
* Dynamically call a service registered in the directory.
*/
public void doCall(String serviceId) {
// create a feign client
MyCall fc =
this.feignClientBuilder.forType(MyCall.class, serviceId).build();
// make the call
fc.callService();
}
}
调整调用接口以满足您的要求,然后您可以将 DynamicFeignClient
实例注入并使用到您需要使用它的 bean 中。
几个月来,我们一直在生产中使用这种方法来查询数十种不同的服务,以获取版本信息和其他有用的运行时执行器数据等内容。