RestTemplate与Feign对比

相信通过本文的例子,聪明的你对如何使用Feign已经了然于心了。文章的最后,对比一下RestTemplate + Ribbon与Feign。

角度 RestTemplate + Ribbon Feign(自带Ribbon)
可读性、可维护性 欠佳(无法从URL直观了解这个远程调用是干什么的) 极佳(能在接口上写注释,方法名称也是可读的,能一眼看出这个远程调用是干什么的)
开发体验 欠佳(拼凑URL不性福 极佳(写出漂亮的代码,女朋友更爱你了
风格一致性 欠佳(本地API调用和RestTemplate调用的代码风格截然不同) 极佳(完全一致,不点开Feign的接口,根本不会察觉这是一个远程调用而非本地API调用)
性能 较好 中等(性能是RestTemplate的50%左右;如果为Feign配置连接池,性能可提升15%左右)
灵活性 极佳 中等(内置功能能满足大多数项目的需求)

那么如何选择呢?相信这才是大家最关注的问题!

笔者认为——

  • 一般来说,建议使用Feign,并杜绝使用RestTmplate。为什么用Feign相信不必啰嗦;可为什么要杜绝RestTemplate,那是因为在一个项目里,保持统一的编码风格乃至体验,是非常重要的。我个人的架构原则是尽量减少开发人员的选择,如果A能解决问题,就杜绝使用B——最佳实践永远只有一个!并且,共存带来的往往不是相得益彰,反而是歧义、错乱以及额外的学习成本、理解成本(笔者当年参与过一个同时使用Struts1 + Struts2 + Servlet的项目,可以想象一下学习成本有多高;笔者还参与一个一个使用Jackson + FastJson + json-lib + Gson的项目,可想而知操作JSON的代码有多混乱……80%的开发在骂娘中度过时光,并抨击别人使用他不熟悉的JSON操作库,后来被笔者统一成Jackson后,大家都安心干活了)!
  • 有人可能会对Feign的性能存在顾虑,笔者认为,Feign的性能虽然不那么优秀,但大部分场景下都是OK的——项目的性能瓶颈一般都不出在HTTP客户端上,而在于自身业务的处理!
  • 求同存异——上文虽说要杜绝RestTemplate,但事无绝对,你得根据具体情况具体分析——对于某些变态需求,在使用Feign很难实现或无法实现时,可考虑使用RestTemplate + Feign共存的方式……Spring Cloud官方也承认,无论Fegin怎么改进,其灵活性也无法比得上RestTemplate!但是,这么做之前请务必慎重,记住,共存带来的往往不是相得益彰,反而是歧义、错乱以及额外的学习成本、理解成本。

配套代码

GitHub:https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-feign

Gitee:https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-feign