springcloud-OpenFeign服务接口调用

Posted yellowstreak

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springcloud-OpenFeign服务接口调用相关的知识,希望对你有一定的参考价值。

概述

  • 是什么
  1. Feign是一个声明式WebService客户端, 使用Feign能让编写Web Service客户端更简单.
  2. 它的使用方法是定义一个服务接口然后再上面添加注解.
    • 同时Feign也支持可拔插式的编码器和解码器.
    • SpringCloud对Feign进行了封装, 使其支持了SpringMVC标准注解和HttpMeessageConverters.
    • Feign可以与Eureka和Ribbon组合使用以支持负载均衡.
  • 能干什么
  1. Feign旨在使编写Java Http客户端变得更容易.
  2. 前面在使用Ribbon+RestTemplate时, 利用RestTemplate对http请求的封装处理, 形成了一套模板化的调用方法.
    • 但在实际开发中, 对服务依赖的调用可能不止一处, 往往一个接口会被多处调用, 所以通常都会针对每个微服务自行封装一些客户端来包装这些依赖服务的调用.
    • 所以, Feign在此基础上进行了进一步封装, 由它来帮我们定义和实现依赖服务接口的定义.
    • 在Feign的实现下, 我们只需创建一个接口并用注解的方式配置它, 即可完成对服务提供方的接口绑定.
  • Feign集成了Ribbon
  1. 利用Ribbon维护了Payment的服务列表信息, 并通过轮询实现了客户端的负载均衡, 而与Ribbon不同的是, 通过Feign只需定义服务绑定接口且以声明式的方式, 优雅而简单的实现了服务调用.
  • Feign和OpenFeign的区别

OpenFeign服务调用

  1. 新建Module: cloud-consumer-feign-order80
    • Feign是在消费端使用的.
  2. POM文件中要加如下依赖
    <!--openfeign-->
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</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>
            <dependency>
                <groupId>springcloud</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>1.0-SNAPSHOT</version>
                <scope>compile</scope>
            </dependency>
        </dependencies>
  3. application.yml
    server:
      port: 80
    
    eureka:
      client:
        register-with-eureka: false
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka
  4. 主启动类
    • 要添加@EnableFeignClients注解, 开启Feign功能
      @EnableFeignClients
      @SpringBootApplication
      public class OrderFeignMain80 {
      
          public static void main(String[] args) {
              SpringApplication.run(OrderFeignMain80.class, args);
          }
      }
  5. 业务类
    • 业务逻辑接口 + @FeignClient配置调用provider服务
      • value属性中填服务端名称
        @FeignClient(value = "CLOUD-PAYMENT-SERVICE")
        @Component
        public interface PaymentFeignService {
        
            @GetMapping(value = "/payment/get/{id}")
            CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
        }
    • controller层
      @RestController
      @Slf4j
      public class OrderFeignController {
      
          @Resource
          private PaymentFeignService paymentFeignService;
      
          @GetMapping("/consumer/payment/get/{id}")
          public CommonResult<Payment> getPaymentById(@PathVariable("id")Long id) {
      
              return paymentFeignService.getPaymentById(id);
          }
      }
  6. 测试: http://localhost/consumer/payment/get/1  可以看出Feign自带负载均衡配置项.

OpenFeign超时控制

  1. 默认Feign客户端只等待1秒钟, 但是服务端处理需要超过1秒钟时, 会导致Feign客户端不想等待了, 直接返回报错.
  2. 为了避免这种情况, 有时候我们需要设置Feign客户端的超时控制.
    #设置Feign客户端超时时间(OpenFeign默认支持Ribbon)
    ribbon:
      #指的是建立连接所用的时间, 适用于网络状况正常的情况下, 两端连接所用的时间.
      ReadTimeout: 5000
      #指的是建立连接后从服务器读取到可用资源所用的时间
      ConnectTimeout: 5000

OpenFeign日志打印功能

  1. Feign提供了日志打印功能, 我们可以通过配置来调整日志级别, 从而了解Feign中Http请求的细节.
    • 简单的说就是对Feign接口的调用情况进行监控和输出.
  2. 四种日志级别
    • NONE: 默认的, 不显示任何日志.
    • BASIC: 仅记录请求方法, URL, 响应状态码以及执行时间.
    • HEADERS: 除了BASIC中定义的信息外, 还有请求和响应的头信息.
    • FULL: 除了HEADERS中定义的信息外, 还有请求和响应的正文及元数据.
  3. 配置日志bean
    @Configuration
    public class FeignConfig {
    
        @Bean
        Logger.Level feignLoggerLevel() {
            return Logger.Level.FULL;
        }
    }
  4. 在yml文件里需要开启日志的Feign客户端
    logging:
      level:
        springcloud.service.PaymentFeignService: debug
  5. 效果如下图: http://localhost/consumer/payment/get/1

以上是关于springcloud-OpenFeign服务接口调用的主要内容,如果未能解决你的问题,请参考以下文章

接口测试 - 接口测试策略

web服务接口测试

哪些数据接口平台支持数据定制服务?

一般来说,服务器采用SCSI接口的硬盘,它和IDE接口的硬盘有啥区别呢?

web的接口测试

绑定服务抽取接口