Spring Cloud学习(五)OpenFeign服务接口调用

1、概述

Feign是一个声明式WebService客户端。使用Feign能让写Web Service客户端更加简单。它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。SpringCloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以及支持负载均衡

2、OpenFeign使用步骤

  1. 新建cloud-consumer-feign-order80

     <dependencies>
            <dependency><!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
                <groupId>com.yu.springcloud</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- openfeign -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            <!--监控-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!--eureka client-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <!--热部署-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
  2. yml

    server:
      port: 8090
    
    eureka:
      client:
        register-with-eureka: false
        service-url: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
    
  3. 主启动类

    @SpringBootApplication
    @EnableFeignClients
    public class ConsumerFeign80 {
        public static void main(String[] args) {
            SpringApplication.run(ConsumerFeign80.class, args);
        }
    }
    
  4. 业务接口

    @Component
    @FeignClient(value = "CLOUD-PAYMENT-SERVICE")
    public interface PaymentFeignService {
        @GetMapping(value = "/payment/get/{id}")
        public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
    }
    
    
  5. controller

    @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);
        }
    }
    
  6. 测试,启动两台eureka,两台提供者,当前module

3、超时机制

默认Feign客户端只等待一秒钟,但是服务器端处理可能需要超过1秒钟,导致Feign客户端不想等待了,会发生返回报错,为了避免这样的情况发生,有时需要设置Feign客户端的超时时间(yml文件)

#设置feign客户端超时时间(OpenFeign 默认支持ribbon)
ribbon:
  #指的是建立连接所用时间,适用于网络状况正常情况下,两端连接所用时间
  ReadTimeout: 5000
  #指的是连接建立后,从服务器获取到可用资源所用时间
  ConnectTimeout: 5000

4、日志

Feign提供了日志打印功能,我们可以通过配置来改变日志级别,从而了解Feign中Http请求的细节。

OpenFeign的日志级别有

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

如何使用日志打印功能

  1. 在配置类中添加OpenFeign的日志类

    @Configuration
    public class FeignConfig {
        Logger.Level feignLoggerLevel(){
            return Logger.Level.FULL;
        }
    }
    
  2. 可以在yml中配置监控的某个端口的日志级别

    #feign 日志以什么级别监控那个接口
    logging:
      level:
        com.yu.springcloud.service: debug
    
上一篇:Spring Cloud OpenFeign的原理(六)


下一篇:SpringCloud-2.0-周阳(9. 负载均衡 - OpenFeign)学习笔记