[Spring-Cloud][Maven][Docker]Feign接口应该放在FeignClients还是EurekaClients?
Posted
技术标签:
【中文标题】[Spring-Cloud][Maven][Docker]Feign接口应该放在FeignClients还是EurekaClients?【英文标题】:[Spring-Cloud][Maven][Docker]Should Feign interfaces be put in FeignClients or EurekaClients? 【发布时间】:2018-02-10 14:52:28 【问题描述】:EurekaServer:注册/公开服务
EurekaClients:提供服务
FeignClients:消费服务并提供API
我正在使用 Feign 进行服务消费。不知feign接口(注解@FeignClient
的接口)应该放在EurekaClients
还是FeignClients
?
-
如果在 EurekaClients 中放入 Feign 接口。
GOOD:我只需要编写一份 Feign 接口,并在 EurekaClients 中实现。对于任何需要使用该服务的 FeignClients,从 EurekaClients 中导入这些接口即可。
不好:可以轻松设置模块依赖关系,但很难做到mvn package
或使用 docker 进行生产。正如我所说的问题HERE。
-
如果把 Feign 接口放在 FeignClients 中(我在网上能找到的几乎每个例子都是这样的)。
好:易于构建。
不好:很多重复的代码。因为对于每个 FeignClient,我都需要重新编写 @FeignClient
带注释的接口。如果嵌套的 FeighClients 和 EurekaClients 很多,维护起来就太难了。
那么对于我应该在哪里放置 Feigh 接口 的良好实践有什么建议?
【问题讨论】:
【参考方案1】:这是我们在项目中遵循的模式。每个服务有两个项目,例如:
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
保存在 model 项目中。实现AuthorService
的控制器AuthorController
保存在_service_ 项目中。
假设ServiceB使用ServiceA,那么前者导入的是后者的model项目。在ServiceA的service中,我们创建了一个Feign接口,例如,
@FeignClient(name = "author", fallback =
AuthorServiceFallbackClient.class)
public interface AuthorServiceClient extends AuthorService
这种模式帮助我们减少了相当多的代码重复。
【讨论】:
以上是关于[Spring-Cloud][Maven][Docker]Feign接口应该放在FeignClients还是EurekaClients?的主要内容,如果未能解决你的问题,请参考以下文章
Idea+maven+spring-cloud项目搭建系列--13 整合MyBatis-Plus多数据源dynamic-datasource