1.OpenFeign简介
OpenFeign是一个声明式的rest客户端,作用是基于SpringMVC的常见注解,实现更便捷的http请求发送
2.OpenFeign使用步骤
(1)导入依赖坐标
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--用于系统内部服务之间的调用需加负载均衡依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
(2)启用OpenFeign功能
在启动类上加@EnableFeignClients注解,启用OpenFeign功能
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients // 启用OpenFeign功能
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
(3)编写FeignClient接口
若要调用第三方接口,将第三方接口的url赋值给@FeignClient的url属性即可
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient("order-service") // 配置要调用的服务名称,与spring.application.name的值保持一致
public interface OrderClient {
@GetMapping("/demos")
String getOrder();
}
(4)使用FeignClient接口,实现远程调用
import com.example.client.OrderClient;
import com.example.domain.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("demos")
public class DemoController {
@Autowired
private OrderClient orderClient;
@GetMapping
public Order getOrder() {
System.out.println("发生了远程调用");
return orderClient.getOrder();
}
}
3.OpenFeign日志
(1)日志等级说明
OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志
等级 | 描述 |
---|---|
NONE | 不记录任何日志信息(默认值) |
BASIC | 仅记录请求的方法,URL及响应状态码和执行时间 |
HEADERS | 在BASIC的基础上,额外记录了请求和响应的头信息 |
FULL | 记录所有请求和响应的明细,包括头信息、请求体、元数据 |
(2)修改OpenFeign日志等级
注册Feign日志组件
public class OpenFeignConfig {
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
配置指定FeignClient日志等级
@FeignClient(value = "服务名称", configuration = OpenFeignConfig.class)
配置全局FeignClient日志等级
@EnableFeignClients(defaultConfiguration = OpenFeignConfig.class)
4.OpenFeign超时控制
OpenFeign中超时控制分为两种:连接超时(connectTimeout)和读取超时(readTimeout)
spring:
cloud:
openfeign:
client:
config:
# 全局FeignClient配置
default:
# 读取超时时间
read-timeout: 10000
# 连接超时时间
connect-timeout: 3000
# 日志等级
logger-level: full
# 指定FeignClient全局配置
@FeignClient注解的contextId/value属性值:
read-timeout: 10000
connect-timeout: 3000
logger-level: full
5.OpenFeign重试机制
远程调用失败后,还可以进行多次尝试,如果某次成功返回ok,如果多次依然失败则结束调用,返回错误
import feign.Retryer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OpenFeignConfig {
@Bean
public Retryer feignRetryer() {
return new Retryer.Default();
}
}
6.修改OpenFeign底层连接池
(1)导入依赖坐标
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
(2)在配置文件中开启连接池
spring:
cloud:
openfeign:
httpclient:
enabled: false
okhttp:
enabled: true