Spring Cloud 系列目录(https://www.cnblogs.com/binarylei/p/11563952.html#feign)

上一篇 文章中我们分析 Feign 参数解析的整个流程,Feign 原生已经支持 Feign、JAX-RS 1/2 声明式规范,本文着重关注 Spring Cloud 是如果整合 OpenFeign 的,使之支持 Spring MVC?

1. Spring Cloud OpenFeign 最简使用

1.1 引入 maven

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

1.2 @EnableFeignClients 注解扫描包

@SpringBootApplication
@EnableFeignClients  // 默认扫描 FeignApplication.class 包下 @FeignClient 注解
public class FeignApplication {

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

1.3 @FeignClient 配置

@FeignClient(value = "echo-server",url = "<http://127.0.0.1:10010>")
public interface EchoService {

    @GetMapping("/echo/{msg}")
    String echo(@PathVariable String msg);
}

总结: 至此,可以像使用普通接口一样调用 http 了

2. Feign 整体装配流程分析

图1:Feign 整体装配流程

  1. 获取Feign.Builder:feign(context)6. 获取DefaultTargeter:get(context, Targeter.class)

总结: OpenFeign 装配有两个入口:

@EnableAutoConfiguration 自动装配(spring.factories)

```
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\
org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration,\\
org.springframework.cloud.openfeign.FeignAutoConfiguration

```

- `FeignAutoConfiguration` 自动装配 FeignContext 和 Targeter,以及 Client 配置。
    - `FeignContext` 是每个 FeignClient 的装配上下文,默认的配置是 FeignClientsConfiguration
    - `Targeter` 有两种实现:一是 DefaultTargeter,直接调用 Feign.Builder; **二是 HystrixTargeter,调用 HystrixFeign.Builder,开启熔断。**
    - `Client` :自动装配 ApacheHttpClient,OkHttpClient,装配条件不满足,默认是 Client.Default。但这些 Client 都没有实现负载均衡。
- `FeignRibbonClientAutoConfiguration` **实现负载均衡,负载均衡是在 Client 这一层实现的。**
    - `HttpClientFeignLoadBalancedConfiguration` ApacheHttpClient 实现负载均衡
    - `OkHttpFeignLoadBalancedConfiguration` OkHttpClient实现负载均衡
    - `DefaultFeignLoadBalancedConfiguration` Client.Default实现负载均衡
@EnableFeignClients 自动扫描

@EnableFeignClients 注入 FeignClientsRegistrar,FeignClientsRegistrar 开启自动扫描,将包下 @FeignClient 标注的接口包装成 FeignClientFactoryBean 对象,最终通过 Feign.Builder 生成该接口的代理对象。而 Feign.Builder 的默认配置是 FeignClientsConfiguration,是在 FeignAutoConfiguration 自动注入的。

注意: 熔断与限流是 FeignAutoConfiguration 通过注入 HystrixTargeter 完成的,而负载均衡是 FeignRibbonClientAutoConfiguration 注入的。

3. Feign 自动装配

3.1 FeignAutoConfiguration