EurekaServer :注册/公开服务
EurekaClients :提供服务
FeignClients :使用服务并提供API
我使用Feign进行服务消费。我想知道假装接口(用@FeignClient
注释的接口)是否应放在EurekaClients
或FeignClients
中?
GOOD:我只需要编写一个Feign接口副本,并在EurekaClients中实现它。对于需要使用此服务的任何FeignClient,从EurekaClients导入这些接口并使用它。
BAD:可以轻松设置模块依赖关系,但很难mvn package
或使用docker进行生产。正如我所说的问题HERE。
GOOD:易于构建。
坏:很多重复的代码。因为对于每个FeignClient,我需要重新编写@FeignClient
带注释的接口。如果有很多嵌套的FeighClients和EurekaClients,那么维护就太难了。
所以对我应该在哪里放置Feigh接口的良好实践提出建议?
答案 0 :(得分:2)
以下是我们项目中遵循的模式。每项服务都有两个项目,例如:
Service A
model
service
所有控制器和其他与业务相关的类,例如DAO,服务,存储库类都保存在服务项目中。虽然控制器使用并暴露于外部世界的模型保留在模型项目中。控制器还实现了一个公开REST API的接口。此接口也保留在模型项目中。
public interface AuthorService {
@RequestMapping(method = RequestMethod.GET, produces = {
MediaType.APPLICATION_JSON_VALUE}, value = "/authors/{id}")
@ResponseBody
Author getAuthor(@PathVariable("id") Integer id);
}
AuthorService
界面和模型Author
保存在模型项目中。实现AuthorController
的控制器AuthorService
保存在_service_项目中。
假设ServiceB使用ServiceA,那么前者导入的是后者的模型项目。在ServiceA的服务中,我们创建了一个Feign接口,例如,
@FeignClient(name = "author", fallback =
AuthorServiceFallbackClient.class)
public interface AuthorServiceClient extends AuthorService {
}
这种模式帮助我们减少了相当多的代码重复。