0%

【SpringCloud】服务调用:OpenFeign

OpemFeign的基本使用


1 OpenFeign简介

1.1 介绍

  • Fegin是一个声明式WebService客户端,使用Fegin能让编写WebService客户端更加简单
  • 使用方法是顶一个服务接口让后在上面添加注解
  • Feign也支持可拔插式的编码器和解码器
  • Feign可以与Eureka和Ribbon组合使用以支持负载均衡(即Feign自带负载均衡,不用配置)

1.2 功能

  • Feign在于使编写Java Http客户端变得更容易
  • 实际开发中,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端来包装这些依赖服务的调用
  • Feign来帮助我们定义和实现依赖服务接口的定义,在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它,即可完成对服务提供方的接口绑定

2 OpenFeign使用

2.1 依赖引入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!-- eureka client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- openfeign:内整合了ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 公共项目 -->
<dependency>
<groupId>com.letere.springcloud</groupId>
<artifactId>cloud-api-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- web支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2.2 修改主启动类

1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients //表示自己是OpenFeign的客户端
public class OrderOpenFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderOpenFeignMain80.class, args);
}
}

2.3 创建接口映射方法

1
2
3
4
5
6
7
8
@Component
@FeignClient(value = "cloud-payment-service") //对应服务器的名称
public interface PaymentFeignClient {

//接口是对应服务器Controller中的方法,包括mapping注解
@GetMapping("/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id);
}

2.4 Controller引用接口方法

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
public class OrderFeignController {

@Autowired
PaymentFeignClient paymentFeignClient;

@GetMapping("/consumer/payment/get/{id}")
public CommonResult getPayment(@PathVariable("id") Long id) {
return paymentFeignClient.getPaymentById(id); //通过openFeign直接调用服务器Controller的方法,不再需要RestTemplate来发送post / Get请求
}

}

3 OpenFeign超时控制

OpenFeign内部整合了Ribbon,默认的超时时间为1s,非常短

  • (1)模拟超时
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //服务器Controller
    //测试Feign超时
    @GetMapping("/payment/feign/timeout")
    public String feignTimeout() {
    try {
    TimeUnit.SECONDS.sleep(3); //沉睡3秒,使业务逻辑操作时间超过3秒
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    return serverPort;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    //映射接口
    @Component
    @FeignClient(value = "cloud-payment-service") //对应服务器的名词
    public interface PaymentFeignClient {

    @GetMapping("/payment/feign/timeout")
    public String feignTimeout();
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //客户端Controller
    @RestController
    public class OrderFeignController {

    @Autowired
    PaymentFeignClient paymentFeignClient;

    @GetMapping("/consumer/payment/feign/timeout")
    public String feignTimeout() {
    //feign整合ribbon,默认超时1s就会报错
    return paymentFeignClient.feignTimeout();
    }
    }
  • (2)测试
  • (3)修改yaml配置文件
1
2
3
4
5
6
feign:
client:
config:
default:
connectTimeout: 5000 # 连接超时时间
readTimeout: 5000 # 读取资源超时时间

4 OpenFeign日志打印

Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign中Http请求的细节

4.1 日志级别

参数 解释
NONE 默认,不显示任何日志
BASIC 仅记录请求方法、URL、响应状态码以及执行时间
HEADERS 除了BASIC中定义的信息之外,还有请求响应的头信息
FULL 除了HEADERS中定义的信息之外,还有请求和形影的正文及原数据

4.2 配置

1
2
3
4
5
6
7
8
9
10
feign:
client:
config:
default:
loggerLevel: full # 日志级别


logging:
level:
com.letere.springcloud.feign.PaymentFeignClient: debug #feign日志监听那个接口