源码解析-OpenFeign

152 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

Feign是一个声明式的web服务客户端,它使编写web服务客户端更加简单。

使用Feign需要创建一个接口并注释,具有可插拔的注解支持,还支持可插拔的编码器和解码器。

Spring Cloud增加了对Spring MVC注解的支持,Spring Web默认使用HttpMessageConverters支持。

Spring Cloud集成了Ribbon、Eureka、Spring Cloud LoadBalancer以便在使用Feign时提供负载均衡的http客户端。

组成部分

接口描述默认实现类
Client线程安全的HTTP请求处理LoadBalancerFeignClient
FeignLoadBalancerextends LoadBalancerContext

核心逻辑

描述
FeignAutoConfiguration[自动配置类],初始化HTTP连接池
HttpClientFeignConfiguration[自动配置类],初始化HTTP连接池
CachingSpringLoadBalancerFactoryFeign负载均衡工厂类,带缓存

源码分析

使用

1. 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-hystrix</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
    <version>10.7.4</version>
</dependency>

2. 配置

配合ribbon一起使用时,HttpClient连接池配置会覆盖ribbon的配置

feign:
  httpclient:
    # 开启HttpClient连接池
    enabled: true
    # 禁用SSL验证,默认false
    disable-ssl-validation: false
    # 允许自动重定向,默认true
    follow-redirects: false
    # 整个连接池的最大连接数
    max-connections: 200
    # 每个route默认的最大连接数
    max-connections-per-route: 50
    # 持久连接的最大生存时间(秒)
    time-to-live: 900
    # 获取连接超时时间(毫秒)
    connection-timeout: 2000
    # 关闭连接线程轮询时间间隔(毫秒)
    connection-timer-repeat: 3000
  # 压缩模块
  compression:
    request:
      # 开启压缩,条件满足则追加Header(Content-Encoding: gzip, deflate)
      enabled: true
      # 支持的类型,默认text/xml,application/xml,application/json
      mime-types: text/xml,application/xml,application/json
      # 开启压缩的最小请求内容大小,默认2048byte
      min-request-size: 2048
    response:
      # 开启响应压缩
      enabled: true
      # 使用gzip压缩
      useGzipDecoder: true
  # 客户端配置(可以按clientName单独配置,default为全局默认)
  client:
    default:
      connectTimeout: 5000
      readTimeout: 30000
      # 控制日志级别none/basic/headers/full,默认none
      loggerLevel = basic
    demo-service:
      connectTimeout: 5000
      readTimeout: 30000

3. 代码

启动类

@SpringBootApplication
@EnableFeignClients
public class Demo1Application {
    public static void main(String[] args) {
        SpringApplication.run(Demo1Application.class, args);
    }
}

配置类

@Configuration
public class RestTemplateConfiguration {
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

业务调用类

@RestController
@Slf4j
public class Demo1Controller {
    @Autowired
    private RestTemplate restTemplate;
    
    @GetMapping("/user/get")
    public User userGet(@RequestParam("name") String name) {
        return userService.get(name);
    }
}

参考