微服务---声明式服务调用OpenFeign


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

一、OpenFeign和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
在这里插入图片描述
这是因为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;
   }
}

在这里插入图片描述

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Selenium399

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值