netflix.feign 和 openfeign 的区别

Posted

技术标签:

【中文标题】netflix.feign 和 openfeign 的区别【英文标题】:Differences between netflix.feign & openfeign 【发布时间】:2018-09-24 04:15:14 【问题描述】:

简介

我最近使用了 netflix feign 以及非常有用的功能区。

一个例子是:

@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.

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

接口注释声明应创建具有该接口的 REST 客户端(例如,用于自动装配到另一个 零件)。如果功能区可用,它将用于 * 负载平衡 后端请求,负载均衡器可以配置 * 使用 @RibbonClient 与 假装客户。

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

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

集成要求您将功能区客户端名称作为主机传递 url 的一部分,例如 myAppProd。

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

所以我的问题是:

    两者的历史/关系和区别是什么? 各有什么优缺点?

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

【问题讨论】:

【参考方案1】:

“Netflix feign”是项目名称。最新版本(以下依赖项)发布于 2016 年 7 月。

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

“Open feign”是项目名称。这是同一个项目,但被移动到不同的 git repo 并获得了一个新的 group-id。它的版本从 9.0.0 开始。

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

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

【讨论】:

是的,我仍然很难过 FeignTown 从未成为一件事:/ api group: 'org.springframework.cloud', name: 'spring-cloud-starter-openfeign', version: '2.1.2.RELEASE' 那么它怎么也存在于spring cloud @PSatishPatro Spring 框架封装了几个库和其他框架,使它们更易于在 Spring Boot 应用程序中管理和使用(主要是利用 Spring 的 IoC)。所以,Spring Cloud Openfeign 是对 openfeign 的封装。同样,您可以使用 Kafka 的生产者/消费者 API 或 Spring Kafka 直接使用 Kafka。【参考方案2】:

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

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

来自documentation:

Feign 是一个声明式 Web 服务客户端。 Spring Cloud 增加支持 用于 Spring MVC 注释和使用相同的注释 Spring Web 中默认使用的 HttpMessageConverters。春云 集成 Ribbon 和 Eureka 提供负载均衡的 http 客户端 使用 Feign 时。

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

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

另见the source code。

【讨论】:

Spring 集成是,与 spring 的集成,建立在 openfeign 之上。 OpenFeign 是从 netflix 转移过来的,所以它是同一个项目,具有新的名称和 groupId 和 artifact id。 这里是两个项目的 repos:Spring-Cloud 和 OpenFeign

以上是关于netflix.feign 和 openfeign 的区别的主要内容,如果未能解决你的问题,请参考以下文章

Netflix Feign - 通过微服务传播状态和异常

什么是Netflix Feign?它的优点是什么?

Netflix Feign:404 上 ErrorDecoder 中的响应正文为空

Spring Cloud Netflix Feign - 不支持错误 405 请求方法“POST”

如何使用 Spring Cloud Netflix Feign 设置自定义 Jackson ObjectMapper

Spring cloud:服务调用-声明式客户端访问