HttpClient、RestTemplate和Feign相关知识
Feign的使用方法以及与RestTemplate的区别
为什么说Feign是RPC?
在微服务架构中,我们经常需要和其他服务进行通信实现数据交互,常用的方式有两种
- RPC框架——代表-dubbo(引入了注册中心的概念)
- HTTP协议——代表-SpringCloud
SpirngCloud 中,默认是使用HTTP进行微服务间通信,其中最常用的有两种实现形式
- RestTemplate
- Feign
Feign 微服务中最常见的RPC框架
Feign是Spring Cloud全家桶中推荐使用的RPC框架,但是Feign也是使用了HTTP作为传输层协议的。上文介绍了RPC,并且列举了一些常见的RPC框架。总的来说,RPC和HTTP二者并不是一个层面的东西,在RPC框架中可以选择使用HTTP作为其传输层协议,而在微服务体系中,无论使用Feign还是使用RestTemplate,传输层都是基于HTTP协议进行传输的。
Feign跟RestTemplate的区别
- 请求方式不一样
RestTemplate需要每个请求都拼接url+参数+类文件,灵活性高但是消息封装臃肿。
feign可以伪装成类似SpringMVC的controller一样,将rest的请求进行隐藏,不用再自己拼接url和参数,可以便捷优雅地调用HTTP API。
- 底层实现方式不一样
RestTemplate在拼接url的时候,可以直接指定ip地址+端口号,不需要经过服务注册中心就可以直接请求接口;也可以指定服务名,请求先到服务注册中心(如nacos)获取对应服务的ip地址+端口号,然后经过HTTP转发请求到对应的服务接口(注意:这时候的restTemplate需要添加@LoadBalanced注解,进行负载均衡)。
Feign的底层实现是动态代理,如果对某个接口进行了@FeignClient注解的声明,Feign就会针对这个接口创建一个动态代理的对象,在调用这个接口的时候,其实就是调用这个接口的代理对象,代理对象根据@FeignClient注解中name的值在服务注册中心找到对应的服务,然后再根据@RequestMapping等其他注解的映射路径构造出请求的地址,针对这个地址,再从本地实现HTTP的远程调用。