【问题标题】:[Spring-Cloud][Maven][Docker]Should Feign interfaces be put in FeignClients or EurekaClients?[Spring-Cloud][Maven][Docker]Feign接口应该放在FeignClients还是EurekaClients?
【发布时间】:2018-02-10 14:52:28
【问题描述】:

EurekaServer:注册/公开服务

EurekaClients:提供服务

FeignClients:消费服务并提供API

我正在使用 Feign 进行服务消费。不知feign接口(注解@FeignClient的接口)应该放在EurekaClients还是FeignClients

  1. 如果在 EurekaClients 中放入 Feign 接口。

GOOD:我只需要编写一份 Feign 接口,并在 EurekaClients 中实现。对于任何需要使用该服务的 FeignClients,从 EurekaClients 中导入这些接口即可。

不好:可以轻松设置模块依赖关系,但很难做到mvn package 或使用 docker 进行生产。正如我所说的问题HERE

  1. 如果把 Feign 接口放在 FeignClients 中(我在网上能找到的几乎每个例子都是这样的)。

好:易于构建。

不好:很多重复的代码。因为对于每个 FeignClient,我都需要重新编写 @FeignClient 带注释的接口。如果嵌套的 FeighClients 和 EurekaClients 很多,维护起来就太难了。

那么对于我应该在哪里放置 Feigh 接口 的良好实践有什么建议?

【问题讨论】:

    标签: java spring-boot spring-cloud spring-cloud-netflix netflix-feign


    【解决方案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 {
    }
    

    这种模式帮助我们减少了相当多的代码重复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-03
      • 2015-05-30
      • 2015-08-24
      • 2017-07-23
      • 2018-06-14
      • 2015-10-21
      • 2018-08-31
      • 2021-06-21
      相关资源
      最近更新 更多