Netflix.feign和OpenFeign之间的区别

20

介绍

我最近使用了 Netflix Feign 和 Ribbon,它们非常有用。

一个例子是:

@FeignClient(name = "ldap-proxy")
public interface LdapProxyClient  { 
    @RequestMapping(path = "/ldap-proxy/v1/users/{userNameOrEMail}", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET)
    LdapUser search(@PathVariable("userNameOrEMail") String userNameOrEMail);
}

然而,我曾经想过,不是要手工编写所有这些定义(对于现有的Web服务),而是应该看看是否存在工具。

我偶然发现了https://github.com/swagger-api/swagger-codegen,发现其中有一些生成客户端的示例,例如https://github.com/swagger-api/swagger-codegen/tree/master/samples/client/petstore/java/feign

然而,当我仔细查看导入时,我注意到以下内容:

import feign.Feign;

另一方面,Netflix的开源解决方案的包名为:org.springframework.cloud.netflix.feign

此外,我注意到两者都使用ribbon(如果可用),但Netflix的表示法更加简洁,并且后台有很多事情正在发生。例如,@FeignClient注释类的javadoc说明:

  • 用于声明具有该接口的REST客户端应该被创建(例如,用于自动装配到另一个组件中)。如果可用的话,将使用ribbon来负载平衡 后端请求,并且可以使用与feign客户端相同名称(即值)的@RibbonClient进行配置 负载均衡器。

但是在Feign.feign的文档(位于https://github.com/OpenFeign/feign)中,我看到:

RibbonClient覆盖了Feign客户端的URL解析,添加了Ribbon提供的智能路由和弹性功能。

集成需要您将ribbon客户端名称作为主机部分传递到url中, 例如我的AppProd。

> MyService api =
> Feign.builder().client(RibbonClient.create()).target(MyService.class,
> "https://myAppProd");

所以我的问题是:

  1. 这两者之间的历史/关系和区别是什么?
  2. 它们各自的优缺点是什么?

它们是完全没有关联的不同项目,还是Netflix只是从开源项目中获取了OpenFeign并将其修改为其集成云解决方案中的一部分?实质上,Netflix是否只是从开源项目中获取并整合了不同的技术,如Discovery、ribbon和feign?

2个回答

23

“Netflix feign” 是该项目的名称。最后一个版本(依赖关系如下)的日期为2016年7月。

compile group: 'com.netflix.feign', name: 'feign-core', version:'8.18.0'   // OLD

"Open Feign"是该项目的名称。这是同一项目,但已移至不同的git存储库并获得了一个新的组ID。其版本从9.0.0开始。

compile group: 'io.github.openfeign', name: 'feign-core', version: '10.0.1'   // NEW

请查看此Github问题,了解发生的简要历史。最引人注目的是,您会发现Netflix不再在内部使用Feign。 :^o


是的,我仍然感到难过,FeignTown从未成为事实 :( - Naruto Sempai
1
API组:'org.springframework.cloud',名称:'spring-cloud-starter-openfeign',版本:'2.1.2.RELEASE'。那么它为什么也在Spring Cloud中呢? - Satish Patro
1
@PSatishPatro Spring框架封装了多个库和其他框架,使它们更易于在Spring Boot应用程序中管理和使用(主要通过利用Spring的IoC)。因此,Spring Cloud Openfeign是openfeign的包装器。同样,您可以直接使用Kafka的生产者/消费者API或使用Spring Kafka。 - Paulo Merson

19

org.springframework.cloud.netflix.feignSpring Cloud Netflix 项目的一部分,该项目是Spring Cloud的一部分。

Spring Cloud在底层使用OpenFeign。 它通过提供自动配置来扩展OpenFeign以支持Spring MVC注释,并使其成为Spring环境中的一流公民。

来自文档:Feign是一个声明式Web服务客户端。 Spring Cloud添加了对Spring MVC注释的支持,并支持使用与Spring Web中默认使用的相同HttpMessageConverters,Spring Cloud集成了Ribbon和Eureka,以在使用Feign时提供负载平衡HTTP客户端。

请注意,在文档中有一个指向OpenFeign项目的链接。

因此,如果您使用Spring Boot,则最好且更容易使用Spring Cloud OpenFeign集成。

另请参阅源代码


3
Spring集成是基于OpenFeign构建的与Spring的集成。 OpenFeign是从Netflix转移过来的,因此它是同一个项目,只不过有一个新的名称,groupId和artifact id。 - spencergibb
这是两个项目的仓库: Spring-CloudOpenFeign - dbaltor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接