[Spring-Cloud] [Maven] [Docker]是否应该将Feign接口放入FeignClients或EurekaClients?

时间:2017-09-01 14:03:36

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

EurekaServer :注册/公开服务

EurekaClients :提供服务

FeignClients :使用服务并提供API

我使用Feign进行服务消费。我想知道假装接口(用@FeignClient注释的接口)是否应放在EurekaClientsFeignClients中?

  1. 如果将Feign接口放入EurekaClients。
  2. GOOD:我只需要编写一个Feign接口副本,并在EurekaClients中实现它。对于需要使用此服务的任何FeignClient,从EurekaClients导入这些接口并使用它。

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

    1. 如果Feign接口放在FeignClients中(几乎我在互联网上找到的每个例子都是这样的。)
    2. GOOD:易于构建。

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

      所以对我应该在哪里放置Feigh接口的良好实践提出建议?

1 个答案:

答案 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 {
}

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