一、OpenFeign概述
1. OpenFeign是什么
- Feign是一个声明式WebService客户端,使用Feign能让编写Web Service客户端更加简单,只需要创建一个接口并添加注解即可
- 他的使用方法时定义一个服务接口然后在上面添加注解,Feign也支持可插拔式的编码器和解码器。Spring Cloud 对Feign进行了封装。使其支持了SpringMVC 标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
- https://github.com/spring-cloud/spring-cloud-openfeign
2. Feign和OpenFeign的区别
Feign是一个声明式WebService客户端,服务调用只需在自己的接口上添加相应的注解。其简化了使用 Spring Cloud Ribbon 时,自动封装服务调用客户端的开发过程,其实 Feign 底层集成了 Ribbon 和 RestTemplate。
Feign被OpenFeign被取代,如图上。二、OpenFeign的使用
- 新建一个order项目,用于feign测试,名称为 cloud-consumer-feign-order80
pom文件,比原始的多一个openfeign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
写yaml ```yaml server: port: 80
spring: application: name: cloud-order-service
eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:7001/eureka
4. 主启动类
```java
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients //开启Feign
public class OrderFeignApplication80 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignApplication80.class, args);
}
}
接口
@Component @FeignClient(value = "CLOUD-PAYMENT-SERVICE") public interface PaymentFeignService { @PostMapping("/payment/create") CommonResult<Payment> create(Payment payment); @GetMapping("/payment/get/{id}") CommonResult<Payment> getPaymentById(@PathVariable("id") Long id); }
Controller测试
@RestController public class OrderController { @Resource private PaymentFeignService paymentFeignService; @PostMapping("/consumer/payment/create") CommonResult<Payment> create(Payment payment) { return paymentFeignService.create(payment); } @GetMapping("/consumer/payment/get/{id}") CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) { return paymentFeignService.getPaymentById(id); } }
三、OpenFeign超时控制
OpenFeign 默认等待时间是1秒,超过1秒会直接报错。
1. 修改超时时间
设置feign 客户端超时时间 (OpenFeign默认支持ribbon)
四、OpenFeign日志打印功能
Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign中Http请求的细节。说白了就是:对Feign接口的调用情况进行监控和输出。
ONE | 默认的,不显示任何日志 |
---|---|
BASIC | 仅记录请求方法、URL、响应状态码及执行时间 |
HEADERS | 除了BASIC中定义的信息之外,还有请求和响应的头信息 |
FULL | 除了HEADERS中定义的信息外,还有请求和响应的正文及元数据。 |
在配置类中添加OpenFeign的日志类
@Configuration public class FeignLogConfig { @Bean public Logger.Level feignLoggerLevel() { //指定日志的运行级别 return Logger.Level.FULL; } }
写yml:为指定类设置日志级别
logging: level: # feign 日志以什么级别监控哪个接口 com.tao.service.*: debug
效果图
五、Ribbon和OpenFeign如何选择?
调用微服务访问两种方法:微服务名字(ribbon)、接口和注解(feign),如果喜欢REST风格使用Ribbon,如果喜欢社区版的面向接口风格使用Feign。但是现在Ribbon已经停更进维,因此建议使用OpenFeign。
六、服务降级/熔断,OpenFeign的处理?
1、fallback
2、fallbackFactory