介绍
我最近使用了 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");
所以我的问题是:
- 这两者之间的历史/关系和区别是什么?
- 它们各自的优缺点是什么?
它们是完全没有关联的不同项目,还是Netflix只是从开源项目中获取了OpenFeign并将其修改为其集成云解决方案中的一部分?实质上,Netflix是否只是从开源项目中获取并整合了不同的技术,如Discovery、ribbon和feign?