文章目录

  • 一、OpenFeign和Feign的区别
  • 二、OpenFeign的简单使用
  • 三、OpenFeign的常用配置
  • 1.OpenFeign超时设置
  • 2.OpenFeign日志设置



之前我们通过RestTemplate+Ribbon实现了服务远程调用和负载均衡,但是由于对服务依赖的调用往往不止一处,一个接口通常会被多处调用,可以发现基本上每次的调用都是模板化的代码。而OpenFeign就是在Ribbon的基础上做了封装,通过注解+接口,让我们能够很方便的进行服务的调用,面向接口编程。

一、OpenFeign和Feign的区别

ingress proxy 微服务_Feign


简而言之:OpenFeign是在Feign上做的改进,支持SpringMVC的注解,在api接口的定义上显得更为优雅(用哪个比较好,我就不说了吧😄)

二、OpenFeign的简单使用

  1. 导入依赖
<dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-openfeign</artifactId>
       </dependency>
  1. 在启动类上添加@EnableFeignClients注解,开启OpenFeign的支持.
@SpringBootApplication
@EnableFeignClients
public class FeignOrder80 {
   public static void main(String[] args) {
       SpringApplication.run(FeignOrder80.class, args);
   }
}
  1. 创建微服务调用的接口(接口内方法与生产者提供调用的方法一致),在接口上添加@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();
}
  1. 在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

ingress proxy 微服务_OpenFeign_02


这是因为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接口调用情况进行监控和输出.

  1. 指定Logger的日志级别
/**
* 设置Feign的日志级别
*/
@Configuration
public class FeignLogConfig {
   @Bean
   public Logger.Level getFeignLogLever() {
       return Logger.Level.FULL;
   }
}

ingress proxy 微服务_Feign_03

  1. 在配置文件中进行配置:Feign日志以什么日志级别监控什么接口
logging:
  level:
     #Feign日志以什么日志级别监控什么接口
     com.selenium.springcloud.service.OpenFeignOrderService: debug
  1. 显示效果

相关源码:https://github.com/wantao666/SpringCloud2020