• SpringCloud原生组件之OpenFeign远程调用


    1. 概述

    Feign是一个声明式WebService客户端,其使用方法是定义一个服务接口,然在接口上添加注解,Spring Cloud对Feign进行了封装,使其支持Spring MVC标准注解和HttpMessageConverters,Feign可以与Eureka和Ribbon组合使用以支持负载均衡

    2. 引入核心依赖

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3. 编写application.yml文件

    server:
      port: 8790
    spring:
      application:
        name: cloud-openfeign
    eureka:
      client:
        register-with-eureka: false
        service-url:
          defaultZone: http://localhost:8761/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4. 编写主启动类

    @SpringBootApplication
    @EnableEurekaClient
    @EnableFeignClients
    public class OpenFeignApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OpenFeignApplication.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5. 编写服务提供接口

    @FeignClient(value = "CLOUD-PROVIDER", configuration = FeignConfiguration.class)
    public interface ProviderClient {
    
        @GetMapping(value = "/provider/getProviderInfo/{message}", consumes = "application/json")
        String getProviderInfo(@PathVariable("message") String message);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注意
    value:是服务提供者在Eureka注册中心的名称
    configuration:自定义Feign配置,比如日志级别,安全校验等

    6. 编写业务访问接口类

    @RestController
    @RequestMapping("/openfeign")
    public class OpenFeignController {
    
        @Autowired
        private ProviderClient providerClient;
    
        @GetMapping("/getOpenFeignInfo/{message}")
        public String getOpenFeignInfo(@PathVariable("message") String message) {
            String providerInfo = providerClient.getProviderInfo(message);
            return "This is openfeign consumer, from provider get info is " + providerInfo;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    7. 验证

    依次启动Eureka Server、Provider和Feign Consumer微服务,浏览器地址输入http://localhost:8790/openfeign/getOpenFeignInfo/world
    feign接口访问

    8. OpenFeign超时控制

    在服务提供端新增超时测试方法

    @GetMapping("/getProviderTimeout")
    public String getProviderTimeout() {
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "This is provider, The port is " + serverPort;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在服务消费端新增超时测试feign接口和业务测试接口

    @GetMapping(value = "/provider/getProviderTimeout")
    String getProviderTimeout();
    
    • 1
    • 2
    @GetMapping(value = "/timeout")
    public String openFeignTimeOUt() {
        return providerClient.getProviderTimeout();
    }
    
    • 1
    • 2
    • 3
    • 4

    分别启动Eureka Server、Provider和consumer,浏览器地址输入http://localhost:8790/openfeign/timeout
    超时验证
    查看服务端控制台日志,提示Read timed out
    超时日志
    OpenFeign客户端默认只等待一秒钟,服务端处理业务超过1秒钟,导致Feign客户端不等待了,直接返回错误,为了避免这样的情况,需要在yml配置文件中配置Feign超时配置

    feign:
      client:
        config:
          default:
            connectTimeout: 5000 #连接超时
            readTimeout: 5000 #读取超时
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    再次启动客户端服务,浏览器输入http://localhost:8790/openfeign/timeout
    超时测试

    9. OpenFeign日志打印

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

    9.1. 日志级别

    Feign的日志级别有以下四种

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

    9.2. 配置日志级别

    新增Feign配置类,添加日志Bean

    @Configuration
    public class FeignConfiguration {
        @Bean
        Logger.Level feignLoggerLevel() {
            return Logger.Level.FULL;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在yml配置文件中开启日志的Feign客户端

    logging:
      level:
        com.xlhj.cloud.openfeign.api.ProviderClient: debug
    
    • 1
    • 2
    • 3

    重新启动Feign客户端,查看控制台日志
    Feign日志

  • 相关阅读:
    Docker初认识
    使用hugging face开源库accelerate进行多GPU(单机多卡)训练卡死问题
    单源赋权最短路径
    C++11标准模板(STL)- 算法(std::set_difference)
    mac远程连接ubuntu-vnc
    金三银四好像消失了,IT行业何时复苏!
    车载音频系统外置功放+主机联调实验
    MyBatis批量更新
    分销商城小程序开发怎么选择开发方式?
    【STL***list容器三】
  • 原文地址:https://blog.csdn.net/liu320yj/article/details/126309878