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
| <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
<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>
<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 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 {
@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); }
}
|
3 OpenFeign超时控制
OpenFeign内部整合了Ribbon,默认的超时时间为1s,非常短
- (1)模拟超时
1 2 3 4 5 6 7 8 9 10 11 12
|
@GetMapping("/payment/feign/timeout") public String feignTimeout() { try { TimeUnit.SECONDS.sleep(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
| @RestController public class OrderFeignController {
@Autowired PaymentFeignClient paymentFeignClient;
@GetMapping("/consumer/payment/feign/timeout") public String feignTimeout() { return paymentFeignClient.feignTimeout(); } }
|
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
|