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:404 上 ErrorDecoder 中的响应正文为空
Spring Cloud Netflix Feign - 不支持错误 405 请求方法“POST”