• 快速入门Spring Cloud OpenFeign



    提示:以下是本篇文章正文内容,下面案例可供参考

    一、为什么学习OpenFeign

    • 在之前我们都是通过调用RestTemplate 来实现远程调用的。使用RestTemplate有一个问题:繁琐,每个请求除了参数不同、请求地址不同、返回数据不同,其他都是一样的,所以我们希望能够简化,简化的方案就是 OpenFeign。
    • OpenFeign 是 Spring cloud 团队在 Netflix Feign 基础上开发出来的声明式调用组件

    二、OpenFeign和Feign介绍和区别

    1.Feign是什么

    Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单。
    Feign集成了Ribbon、RestTemplate实现了负载均衡的执行Http调用,只不过对原有的方式(Ribbon+RestTemplate)进行了封装,开发者不必手动使用RestTemplate调服务,而是定义一个接口,在这个接口中标注一个注解即可完成服务调用,这样更加符合面向接口编程的宗旨,简化了开发。
    
    • 1
    • 2

    2.OpenFeign是什么

    OpenFeign是springcloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。
    OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
    
    • 1
    • 2

    OpenFeign的官网地址:https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/
    OpenFeign的Git地址:https://github.com/spring-cloud/spring-cloud-openfeign

    3.Feign和OpenFeign两者区别

    在这里插入图片描述

    三、OpenFeign服务调用

    服务提供者还是用之前的8001和8002支付服务

    1.创建cloud-consumer-feign-order80消费者模块

    2.改pom文件

    <dependencies>
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-openfeignartifactId>
            dependency>
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
            dependency>
            
            <dependency>
                <groupId>com.henggroupId>
                <artifactId>cloud-api-commonsartifactId>
                <version>${project.version}version>
            dependency>
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-actuatorartifactId>
            dependency>
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-devtoolsartifactId>
                <scope>runtimescope>
                <optional>trueoptional>
            dependency>
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <optional>trueoptional>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
        dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    3.建yml

    server:
      port: 80
    spring:
      application:
        name: cloud-feign-order-service
    
    eureka:
      client:
        #表示是否将自己注册进Eurekaserver默认为true。
        register-with-eureka: true
        #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
        fetchRegistry: true
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4. 主启动类

    package com.heng;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication
    @EnableFeignClients
    public class OrderFeignMain80 {
        public static void main(String[] args) {
            SpringApplication.run(OrderFeignMain80.class,args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    添加@EnableFeignClients注解,开启 OpenFeign 支持

    5. 编写业务逻辑接口,使用@FeignClient

    package com.heng.service;
    
    import com.heng.entities.CommonResult;
    import com.heng.entities.Payment;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.stereotype.Component;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    
    @Component
    @FeignClient(value ="CLOUD-PAYMENT-SERVICE")
    public interface PaymentFeignService {
    
        @GetMapping(value = "/payment/get/{id}")
        public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    6. 编写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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    测试:
    在这里插入图片描述
    注意:接口的方法建议和服务提供者的方法保持一致
    在这里插入图片描述

    四、OpenFeign超时控制

    通过写延迟程序,测试OpenFeign超时控制

    1. 服务提供方8001/8002故意写暂停程序
    @GetMapping(value = "/payment/feign/timeout")
        public String paymentFeignTimeout()
        {
            // 业务逻辑处理正确,但是需要耗费3秒钟
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return serverPort;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 服务消费方80添加超时方法
    @Component
    @FeignClient(value ="CLOUD-PAYMENT-SERVICE")
    public interface PaymentFeignService {
    
        @GetMapping(value = "/payment/get/{id}")
        public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
    
        @GetMapping(value = "/payment/feign/timeout")
        public String paymentFeignTimeout();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. controller编写调用方法
     @GetMapping(value = "/consumer/payment/feign/timeout")
        public String paymentFeignTimeout() {
            // OpenFeign客户端一般默认等待1秒钟
            return paymentFeignService.paymentFeignTimeout();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 测试
      http://localhost/consumer/payment/feign/timeout
      在这里插入图片描述
      OpenFeign默认等待1秒钟,超过后报错
      通过修改配置文件,对OpenFeign客户端超时控制
    #设置feign客户端超时时间(OpenFeign默认支持ribbon)(单位:毫秒)
    ribbon:
      #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
      ReadTimeout: 5000
      #指的是建立连接后从服务器读取到可用资源所用的时间
      ConnectTimeout: 5000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    重新访问
    在这里插入图片描述

    五、OpenFeign日志增强

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

    日志级别

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

    1.编写配置类,来设置日志级别

    package com.heng.config;
    
    import feign.Logger;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class FeignConfig {
        @Bean
        Logger.Level feignLoggerLevel()
        {
            return Logger.Level.FULL;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.修改yml文件 开启日志的Feign客户端

    logging:
      level:
        com.heng.service.PaymentFeignService: debug
    
    • 1
    • 2
    • 3

    当我们发起一个请求时,后台日志中能看到请求和响应的正文
    在这里插入图片描述
    整个moudle目录构成:
    在这里插入图片描述

  • 相关阅读:
    如何定制化跑腿小程序源码
    linux 编译安装 opencv 和指定 opencv_contrib 库
    WiFi在Settings中的热点开启流程小结
    【毕业设计】深度学习疫情社交安全距离检测算法 - python opencv cnn
    MySQL-事务的概念
    Milvus 2.2 版本发布!
    quarkus依赖注入之十一:拦截器高级特性上篇(属性设置和重复使用)
    在win11下安装mysql并通过python进行链接
    post请求同时上传文件并传递其他参数的前后端写法
    一文学懂java泛型
  • 原文地址:https://blog.csdn.net/qq_45637894/article/details/126411930