文章目录
- 一、OpenFeign和Feign的区别
- 二、OpenFeign的简单使用
- 三、OpenFeign的常用配置
- 1.OpenFeign超时设置
- 2.OpenFeign日志设置
之前我们通过RestTemplate+Ribbon实现了服务远程调用和负载均衡,但是由于对服务依赖的调用往往不止一处,一个接口通常会被多处调用,可以发现基本上每次的调用都是模板化的代码。而OpenFeign就是在Ribbon的基础上做了封装,通过注解+接口,让我们能够很方便的进行服务的调用,面向接口编程。
一、OpenFeign和Feign的区别
简而言之:OpenFeign是在Feign上做的改进,支持SpringMVC的注解,在api接口的定义上显得更为优雅(用哪个比较好,我就不说了吧😄)
二、OpenFeign的简单使用
- 导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 在启动类上添加
@EnableFeignClients
注解,开启OpenFeign的支持.
@SpringBootApplication
@EnableFeignClients
public class FeignOrder80 {
public static void main(String[] args) {
SpringApplication.run(FeignOrder80.class, args);
}
}
- 创建微服务调用的接口(接口内方法与生产者提供调用的方法一致),在接口上添加
@FeignClient(value="服务名")
@Service
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface OpenFeignOrderService {
@GetMapping("/payment/get/{id}")
CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
@GetMapping("/payment/feign/timeout")
CommonResult getFeignTimeout();
}
- 在Controer中注入服务调用接口并使用
@RestController
@RequestMapping("/consumer/order")
public class FeignOrderController {
@Resource
private OpenFeignOrderService feignOrderService;
@GetMapping("/get/{id}")
public CommonResult getPayment(@PathVariable("id") Long id) {
return feignOrderService.getPaymentById(id);
}
@GetMapping("/feign/timeout")
public CommonResult getFeignTimeout() {
return feignOrderService.getFeignTimeout();
}
}
三、OpenFeign的常用配置
1.OpenFeign超时设置
我们在生产者中提供一个方法,此方法无业务逻辑,只是简单的暂停3秒然后输出端口号.
@GetMapping("/feign/timeout")
public CommonResult getFeignTimeout() {
try {
//Feign客户端默认超时时间1秒
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new CommonResult(200, "success,serverPort: " + serverPort, null);
}
在消费者客户端我们通过Feign进行调用,发现报错Read time out
这是因为Feign的默认超时时间是1秒.显然这个时间有点短,我们很容易超过这个时间,所以我们需要修改Feign的超时时间.由于OpenFeign的客户端负载均衡是基于Ribbon实现的,所以我们可以通过配置Ribbon客户端的方式来自定义各个服务客户端调用的参数
全局配置:针对所有服务
#修改Feign的默认超时时间(1s)
ribbon:
#连接超时
ConnectTimeout: 5000
#连接成功后读取到可用资源超时
ReadTimeout: 5000
局部配置:针对指定服务(ribbon前加上指定的服务名)
#修改Feign的默认超时时间(1s)局部配置
CLOUD-PAYMENT-SERVICE:
ribbon:
ConnectTimeout: 5000
ReadTimeout: 5000
2.OpenFeign日志设置
通过OpenFeign的日志打印可以对Feign接口调用情况进行监控和输出.
- 指定Logger的日志级别
/**
* 设置Feign的日志级别
*/
@Configuration
public class FeignLogConfig {
@Bean
public Logger.Level getFeignLogLever() {
return Logger.Level.FULL;
}
}
- 在配置文件中进行配置:Feign日志以什么日志级别监控什么接口
logging:
level:
#Feign日志以什么日志级别监控什么接口
com.selenium.springcloud.service.OpenFeignOrderService: debug
- 显示效果
相关源码:https://github.com/wantao666/SpringCloud2020