官网:https://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/#spring-cloud%20-openfeign
Feign是一个声明式Web Service客户端。使用Feign能让Web Service编写更加简单。它使用方法是定义一个服务接口,然后在上面加上注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters.Feign可以与Eureka和Ribbon使用实现负载均衡。
Feign能干什么?
Feign旨在使编写Java http客户端变得更加简单。
在使用Ribbon和RestTemplate时,利用RestTemplate对http请求的封装处理,形成一套模板化的调用方法。但是在实际开发中,由于对服务调用的依赖可能不止一处,往往往往一个接口会被多出调用,所以通常都会针对每个微服务自行封装一些客户端来包装,我们只需要创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是在一个微服务接口上面标注一个Feign注解即可),即完成对服务提供方的接口绑定,简化了使用SpringCloud Ribbon时,自动封装服务调用客户端的开发量。
Feign集成了Ribbon
利用Ribbon维护了服务(payment)的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现服务调用。
使用示例:
1、创建feign-server、feign-service、feign-service2、feign-consumer。具体创建如ribbon篇一致。
2、在feign-consumer模块中在主启动类添加@EnableFeignClients。
新建HelloService,内容如下:
新建HelloController,调用Service,内容如下:
OpenFeign超时控制
-
故意设置超时
在hello-service模块controller添加如下内容:
在hello-consumer模块service层添加helloTimeout接口
在controller层实现helloTimeout接口
测试结果:使用8000端口访问没问题,
使用80端口访问,报错。
报错原因:
默认Feign客户端只等待1秒钟,但是服务器端处理需要超过1秒钟,导致Feign客户端不想等待,直接返回报错。为了避免这样的情况,有时候我们需要设置Feign客户端的草率控制。
解决此问题,在yml文件中配置:
添加完成后重新启动80端口
OpenFeign日志增强
Feign提供了日志打印功能,可以通过配置来调整日志级别,从而了解Feign中Http请求细节。简单来说,就是对Feign接口的调用情况进行监控和输出。
日志级别
- NONE :默认的,不显示任何日志;
- BASIC:仅记录请求方法、URL、响应状态码以及执行时间
- HEADERS: 记录请求方法、URL、响应状态码、执行时间请求和响应的头信息;
- FULL: 除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
示例: -
新建config.FeignConfig类,内容如下:
-
在yml文件中添加以下内容:
- 测试
在浏览器输入http://localhost:80/feign-consumer/
打印内容如下: