netflix.feign 和 openfeign 的区别

Differences between netflix.feign & openfeign

简介

我最近使用了 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);
}

然而,在某些时候我认为我应该查看是否存在工具,而不是必须手动编写所有这些定义(对于现有的网络服务)。

我偶然发现 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.

此外,我注意到两者都使用了功能区(如果可用),但 Netflix 的符号更加清晰,后台发生了很多事情。例如。 @FeignClient 注释 class javadoc 指出:

  • Annotation for interfaces declaring that a REST client with that interface should be * created (e.g. for autowiring into another component). If ribbon is available it will be * used to load balance the backend requests, and the load balancer can be configured * using a @RibbonClient with the same name (i.e. value) as the feign client.

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

RibbonClient overrides URL resolution of Feign's client, adding smart routing and resiliency capabilities provided by Ribbon.

Integration requires you to pass your ribbon client name as the host part of the url, for example myAppProd.

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

所以我的问题是:

  1. 两者的history/relationship和区别是什么?
  2. 各自的优缺点是什么?

它们是完全不同的项目,没有任何关系,还是 netflix 只是 fork/utilize OpenFeign 并将其修改为集成云解决方案?从本质上讲,netflix 是否只是从开源项目中获取并集成了 Discovery、ribbon 和 feign 等不同技术?

org.springframework.cloud.netflix.feignSpring Cloud Netflix project which is a part of Spring Cloud 的一部分。

Spring Cloud 在后台使用 OpenFeign。它扩展了它以支持 Spring MVC 注释,并通过自动配置为 Spring 启动应用程序提供集成,使其成为 Spring 环境中的第一个 class 公民。

来自documentation

Feign is a declarative web service client. Spring Cloud adds support for Spring MVC annotations and for using the same HttpMessageConverters used by default in Spring Web. Spring Cloud integrates Ribbon and Eureka to provide a load balanced http client when using Feign.

请注意,在文档中有一个 link 到 OpenFeign 项目。

因此,如果您使用 Spring Boot - 使用 Spring Cloud OpenFeign 集成会更好更容易。

另见 the source code

"Netflix feign" 是 old 项目名称。最后一个版本(下面的依赖项)日期为 2016 年 7 月。

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

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

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

有关所发生事件的简要历史,请参阅 this github issue。最值得注意的是,您会发现 Feign 不再在 Netflix 内部使用。 :^o