OpenFeign 调用-超时控制-日志等级

Feign作为声明性Web服务客户端,简化了Java HTTP客户端的开发,通过接口注解配置,实现微服务间的轻松调用。Feign支持多种注解,如Feign和JAX-RS,并集成Ribbon和Eureka,提供负载均衡的HTTP客户端,适用于Spring Cloud环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:

Feign是声明性Web服务客户端。它使编写Web服务客户端更加容易。要使用Feign,请创建一个接口并对其进行注释。它具有可插入的注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud添加了对Spring MVC注释的支持,并支持使用HttpMessageConvertersSpring Web中默认使用的注释。Spring Cloud集成了Ribbon和Eureka以及Spring Cloud LoadBalancer,以在使用Feign时提供负载平衡的http客户端。

  • 使编写Java Http客户端更加容易 使用 RestTemplate+Ribbon 时,利用 RestTemplate 对http 请求的封装处理,形成一套模板化的调用方法,但是在实际中,由于对服务的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以Feign在此基础上做了进一步封装,由他来帮助我们定义和实现服务接口的定义。在Feign的实现下我们只需要创建一个接口并使用注解来配置它(以前是Dao接口上标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可)。自动封装服务调用客户端的开发量。
  • Feign集成了Ribbon 利用Ribbon维护了Payment的服务列表信息,并且实现了轮询实现客户端的负载均衡。而与Ribbon不同的是,feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现服务调用。
POM
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
YML

使用的是consul注册中心

  • ribbon.ReadTimeout:建立起连接后从服务器读取资源所用时间
  • ribbon.ConnectTimeout:建立连接所用时间;OpenFeign默认1s
  • logging.level.com.live.service.OpenFeignService:开启OpenFeign日志
server:
  port: 80
spring:
  application:
    name: cloud-comsumer-consul-order
  cloud:
    consul:
      discovery:
        instance-id: order80
        prefer-ip-address: true
        service-name: ${spring.application.name}
      host: localhost
      port: 8500
ribbon:
  ReadTimeout: 6000
  ConnectTimeout: 6000
logging:
  level:
    com.live.service.OpenFeignService: debug
启动类
@EnableFeignClients
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class OpenFeignConsul80 {

    public static void main(String[] args) {
        SpringApplication.run(OpenFeignConsul80.class,args);
    }

}
Service
@FeignClient(value=“微服务名”)
@RequestMapping(value=“和微服务提供者的路径一致”)
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;

@Component
@FeignClient(value = "cloud-provider-consul-payment")
public interface OpenFeignService {

    @GetMapping(value = "/consul/provider/test")
    String consulTest();

    @GetMapping(value = "/consul/provider/openfeign/test")
    String openfeignTest();

    @GetMapping(value = "/consul/provider/openfeign/timeout/test")
    String openfeignTimeOutTest();

}
Controller
import com.live.service.OpenFeignService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class OpenFeignController {

    @Resource
    private OpenFeignService openFeignService;

    @GetMapping("/consumer/openfeign/test")
    public String openfeignTest() {
        return openFeignService.openfeignTest();
    }

    @GetMapping(value = "/consul/consumer/openfeign/timeout/test")
    public String openfeignTimeOutTest() {
        return openFeignService.openfeignTimeOutTest();
    }

}
Config-日志
  • NONE:默认;不显示日志
  • BASIC:仅记录请求方法、URL、响应状态及执行时间
  • HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息
  • FULL:除了HEADERS中定义的信息外,还有请求和响应的正文及元数据
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OpenFeignLogConfig {

    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

}
  • 还需再application.yml或properties中配置

    • com.live.service.OpenFeignService :自定
    logging:
      level:
        com.live.service.OpenFeignService: debug
    
### 关于 Spring Cloud OpenFeign 的最佳实践 #### 配置超时时间 为了防止 Feign 调用长时间未响应而阻塞线程,在应用中应合理设置请求连接和读取数据的超时时间。通常建议通过 `ribbon.ReadTimeout` 和 `ribbon.ConnectTimeout` 来调整这些参数[^2]。 ```yaml feign: client: config: default: connectTimeout: 5000 # 单位毫秒 readTimeout: 5000 # 单位毫秒 ``` #### 启用日志记录功能 启用详细的日志可以帮助开发者更好地理解 HTTP 请求过程中的细节,便于调试和服务优化工作。可以通过修改 application.yml 文件来开启不同级别的日志输出: ```yaml logging: level: com.example.feignclients: DEBUG ``` 这里假设 `com.example.feignclients` 是定义 Feign 接口所在的包名。 #### 使用 Hystrix 实现熔断机制 当远程调用失败次数超过设定阈值时自动触发降级逻辑,保护整个系统的稳定性。这可以借助内置的支持轻松完成配置: ```java @FeignClient(name = "service-name", fallbackFactory = ServiceFallback.class) public interface MyService { } ``` 同时还需要创建对应的 Fallback 类用于处理异常情况下的返回值。 #### 添加重试策略 对于某些特定类型的错误(比如网络波动),允许客户端进行有限次重新尝试可能是有益的做法。Ribbon 提供了简单的 API 支持此特性: ```yaml ribbon: MaxAutoRetriesNextServer: 1 MaxAutoRetries: 1 ``` 上述配置表示最多会切换到另一个实例再试一次,并在同一台服务器上额外重试一次。 #### 设置合理的负载均衡算法 默认情况下 Ribbon 使用轮询方式分配流量给各个服务节点;然而根据实际需求可以选择更适合业务场景的方式,如随机选择或加权最少活跃数等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeathAndLife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值