是什么
Feign是声明性Web服务客户端。它使编写Web服务客户端更加容易。要使用Feign,请创建一个接口并对其进行注释。它具有可插入的注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud添加了对Spring MVC注释的支持,并支持使用HttpMessageConvertersSpring Web中默认使用的注释。Spring Cloud集成了Ribbon和Eureka以及Spring Cloud LoadBalancer,以在使用Feign时提供负载平衡的http客户端。
干什么
- 编写Java Http客户端更加容易
使用 RestTemplate+Ribbon 时,利用 RestTemplate 对http 请求的封装处理,形成一套模板化的调用方法,但是在实际中,由于对服务的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以Feign在此基础上做了进一步封装,由他来帮助我们定义和实现服务接口的定义。在Feign的实现下我们只需要创建一个接口并使用注解来配置它(以前是Dao接口上标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可)
- Feign集成了Ribbon 利用Ribbon维护了Payment的服务列表信息,并且实现了轮询实现客户端的负载均衡。而与Ribbon不同的是,feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现服务调用
修改项目(消费端)
pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
主启动类
@EnableFeignClients
新建接口
package com.atguigu.springcloud.service;
import java.util.Map;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(value = "CLOUD-PROVIDER-SERVICE")
public interface PaymentFeignService {
@GetMapping(value = "/payment/get/{id}")
public Map getPaymentById(@PathVariable("id") Long id);
@GetMapping(value = "/payment/timeout")
public Map getTimeout();
}
controller 注入service使用即可。
Feign自带负载均衡配置项
OpenFeign超时控制
8001写慢查询
@GetMapping(value = "/payment/timeout")
public Map getTimeout() {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
Map payment = new HashMap();
payment.put("code", 200);
payment.put("port", serverPort);
payment.put("message", "查询成功");
return payment;
}
80调用并设置yml
ribbon:
#处理请求的超时时间,默认为1秒
ReadTimeout: 1000
#连接建立的超时时长,默认1秒
ConnectTimeout: 1000
#同一台实例的最大重试次数,但是不包括首次调用,默认为1次
MaxAutoRetries: 1
直接跳转至error page,如配置10秒,则成功。
日志增强
日志级别
- NONE:默认不显示日志
- BASIC:仅记录请求方法,URL,响应状态及执行时间
- HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息
- FULL:除了HEADERS中定义的信息外,还有请求和响应的正文及元数据
配置类
import feign.Logger;
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
选择日志监听接口
logging:
level:
# 选择具体接口的日志输出 级别为debug
com.wxh.springcloud.service.PaymentFeignService: debug