springcloud之OpenFeign

springcloud学习笔记,第五章,OpenFeign服务调用

简介:

  • feign翻译:v.假装,装作,佯装(有某种感觉或生病、疲倦等)

  • feign已经停止更新了,openFeign成为替代。

    feign是一个声明式webService客户端。使用feign能让编写的web service客户端更加简单。它的使用方法是定义一个服务接口,在上面添加注解。

  • feign让微服务之间的调用变得更简单了,类似controller调用service。Spring Cloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。

    主要是利用了OpenFeign的声明式方式定义Web服务客户端;其次,通过集成Ribbon或Eureka实现负载均衡的HTTP客户端。

Feign能干什么?

Feign与OpenFeign的区别:

OpenFeign使用示例:

总体模块:

解释:两个服务生产者provider,一个消费者。eureka继续作为服务注册中心。

provider生产者模块没有特别之处,重点在consumer消费者模块。

consumer消费者模块:

  • Feign是在消费端调用的。rest风格的client端,也就是消费侧。
  1. POM依赖:

    1
    2
    3
    4
    5
    <!--openFeign-->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
  2. YML:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    server:
    port: 80

    spring:
    application:
    name: cloud-order-service

    eureka:
    client:
    register-with-eureka: false #表示是否将自己注册进eureka,本consumer不需要注册
    fetch-registry: true #这是貌似不是关键点,表示从eureka中获取服务的注册信息
    service-url:
    defaultZone: http://localhost:7001/eureka
  3. 主启动类,添加注解@EnableFeignClients

  4. 业务类:

    1. controller:

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

      @Resource
      private PaymentFeignService paymentFeignService;

      @GetMapping(value = "/consumer/payment/get/{id}")
      public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
      return paymentFeignService.getPaymentById(id);
      }
      }
    2. service:

      1
      2
      3
      4
      5
      6
      @Component
      @FeignClient(value = "CLOUD-PAYMENT-SERVICE")
      public interface PaymentFeignService {
      @GetMapping(value = "/payment/get/{id}")
      public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
      }
    • 这里的@FeignClient(value = "CLOUD-PAYMENT-SERVICE")调用的就是eureka中注册的两个payment服务。
  5. 测试:

  6. 总结:

    feign使用默认的ribbon负载轮询算法实现负载均衡的功能。

OpeFeign超时控制:

OpenFeign默认等待服务端处理的时间是1秒,超过1秒,直接报错。为了避免这种情况,我们需要设置feign客户端的超时控制。

主要在配置文件中修改:

1
2
3
4
5
# 设置feign客户端超时时间(openFeign默认支持ribbon)
# 一个是建立连接时间,一个是连接后到取到可用资源的时间
ribbon:
ReadTimeout: 5000
ConnectTimeout: 5000

因为OpenFeign的底层是ribbon进行负载均衡,所以它的超时时间是由ribbon控制

  1. 增加下provider的controller:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @GetMapping(value = "/payment/feign/timeout")
    public String paymentFeignTimeout()
    {
    // 业务逻辑处理正确,但是需要耗费3秒钟
    try {
    TimeUnit.SECONDS.sleep(3);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    return serverPort;
    }
  2. 增加下consumer的controller和service:

    1
    2
    3
    4
    5
    6
    @GetMapping(value = "/consumer/payment/feign/timeout")
    public String paymentFeignTimeout()
    {
    // OpenFeign客户端一般默认等待1秒钟
    return paymentFeignService.paymentFeignTimeout();
    }
    1
    2
    @GetMapping(value = "/payment/feign/timeout")
    public String paymentFeignTimeout();
  • 如果不写ribbon的超时控制,那么就会报错。

  • 测试:多刷新下就会发现使用的是轮询算法。

OpenFeign日志打印功能:

feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign中HTTP请求的细节。说白了就是对Feign接口的调用情况进行监控和输出。

Feign的日志级别:

  1. NONE:默认的,不显示任何日志。
  2. BASIC:仅记录请求方法、url、响应状态码及执行时间。
  3. HEADERS:除了BASIC中定义的信息之外,还有请求的和响应的头信息。
  4. FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。

使用:

  1. 编写配置类:

    1
    2
    3
    4
    5
    6
    7
    @Configuration
    public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel(){
    return Logger.Level.FULL;
    }
    }
  2. 为指定的类设置日志级别,在配置文件中:

    1
    2
    3
    logging:
    level:
    com.aaron.springcloud.service.PaymentFeignService: debug
  3. 测试,那么你就可以在控制台查看:

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信