[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

spring-cloud配置eureka服务端

引点科技私房菜专栏之Spring-Cloud服务治理

引点科技私房菜专栏之Spring-Cloud服务治理

spring-cloud配置eureka客户端

Spring-cloud Hystrix入门