SpringCloud之Feign,OpenFeign讲解
1 Feign
1.1 定义
1.1.1 简介
Feign是一个声明式的Web Service客户端,通过声明RESTful请求客户端
Spring Cloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端
Java当中常见的Http客户端有很多,除了Feign,类似的还有Apache 的 HttpClient 以及OKHttp3,还有SpringBoot自带的RestTemplate这些都是Java当中常用的HTTP 请求工具
微服务直接调用使用RestTemplate进行远程调用,非常方便,那么有了RestTemplate为什么还要有Feign,因为RestTemplate有一个致命的问题:硬编码。
点击了解Spring之RestTemplate
在 RestTemplate 调用中,我们每个调用远程接口的方法,都将远程接口对应的 ip、端口,或 service-id 硬编码到了 URL 中,如果远程接口的 ip、端口、service-id 有修改的话,需要将所有的调用都修改一遍,这样难免会出现漏改、错改等问题,且代码不便于维护。为了解决这个问题,Netflix 推出了 Feign 来统一管理远程调用
1.1.2 OpenFeign和Feign的区别
Feign:
OpenFeign:
OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
1.1.3 属性介绍
@FeignClient标签的常用属性如下:
1.1.4 原理解析
Feign调用步骤:
- 程序启动时,扫描所有的@FeignClient注解
- 当接口方法被调用时,通过JDK代理来生成RequestTemplate模板
- 根据RequestTemplate模板生成Http请求的Request对象
- Request对象交给Client去处理,其中Client的网络请求框架可以是HttpURLConnection、HttpClient、OKHttp
- 最后client封装成LoadBaLanceClient,结合ribbon负载均衡地发起调用
1.2 OpenFeign准备工作
1.2.1 引入依赖
在Spring Cloud项目中引入Feign依赖,但是因为feign底层使用了ribbon作为负载均衡的客户端,而ribbon的负载均衡也是依赖于eureka获得各个服务的地址,所以要引入eureka-client
1.2.2 启动类和yml文件
需要在启动类上添加注解@EnableFeignClients以及@EnableDiscoveryClient
1.3 使用OpenFeign
1.3.1 简单使用@FeignClient
@SpringQueryMap:
spring cloud项目使用feign的时候都会发现一个问题,就是get方式无法解析对象参数。其实feign是支持对象传递的,但是得是Map形式,而且不能为空,与spring在机制上不兼容,因此无法使用。spring cloud在2.1.x版本中提供了@SpringQueryMap注解,可以传递对象参数,框架自动解析。
编写熔断类,发生错误时回调
引入FeignAutoConfiguration配置
上面是最简单的feign client的使用,声明完为feign client后,其他spring管理的类,如service就可以直接注入使用了,例如: