西瓜🍉
  • java
    • elasticsearch
      • 安装
      • 简单使用
    • logstash
      • 简单使用
    • 时区问题
    • springcloud
      • nacos
      • sentinel
      • openfeign
      • micrometer_zipkin
      • gateway
  • 设计模式
    • 分类及简单示例
  • 服务器

为什么要使用openfeign?

主要还是对外暴露某个服务的一系列接口,用来规范调用,当服务之间相互调用的时候,采用restTemplate+loadBalancer已经不方便管理了。而且openfeigin集成了loadBalancer的功能,并且可以结合sentinel来对接口进行限流降级。

loadbalancer的算法切换

openfeign集成了loadbalancer,可实现均衡负载。

从轮询算法切换到随机算法的配置如下,记得一定要指定这个负载均衡器的名称,不然在调用的时候可能会出现错误,比如我测试调用网关进行路由转发的时候就出现了问题:

@Configuration
@LoadBalancerClient(value = "pay-order", configuration = RestTemplateConfig.class)
public class RestTemplateConfig {

    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class),
                name);
    }
}

超时控制

spring:
  cloud:
    openfeign:
      client:
        config:
          pay-order:
            connect-timeout: 5000
            read-timeout: 5000

超时重试和日志级别

当超过读取时间时,默认是不重试的,可以通过以下的配置来开启重试。

@Configuration
public class FeignConfig {
    // 日志
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

    // 重试
    @Bean
    public Retryer retryer() {
        // 初始间隔时间,最大间隔时间,最大次数
        return new Retryer.Default(100, 1, 3);
    }
}

更换Openfeign的调用库

Openfeign调用默认使用的是httpClient4(连接管理和线程池机制落后),官网已经不再推荐使用了,建议使用apache httpclient5。

添加依赖:

<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.3</version>
</dependency>

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-hc5</artifactId>
    <version>13.1</version>
</dependency>

在yaml里配置:

spring.cloud.openfeign.httpclient.hc5.enabled=true

Openfeign的请求/响应压缩

配置以下内容:

spring.cloud.openfeign.compression.request.enabled=true
spring.cloud.openfeign.compression.request.mime-types=text/xml,application/xml,application/json # 触发请求的数据类型
spring.cloud.openfeign.compression.request.min-request-size=2048 # 触发请求的数据大小

spring.cloud.openfeign.compression.response.enabled=true
Last Updated:
Contributors: zhongyan.zhou
Prev
sentinel
Next
micrometer_zipkin