# Feign 原理简述

  1. @EnableFeignClients 开启扫描,扫描包下的所有 @FeignClient,然后注入到 IOC 容器中。
  2. 调用 feign 接口,通过 JDK 动态代理生成 RequestTemplate。
  3. RequestTemplate 是模版,包含请求所有信息,然后生成 Request,Request 交给 client 处理,client 默认是 JDK 的 HTTPUrlConnection,也可以是 OKHttp、Apache 的 HTTPClient 等。
  4. client 封装成 LoadBalanceClient,结合 ribbon 负载均衡发起调用。
  5. 调用失败,还有 hystrix 熔断。

Feign、hystrix 与 retry 的关系请参考 https://xli1224.github.io/2017/09/22/configure-feign/

# @EnableXxxx 原理

  1. @EnableXxxx 注解都包含一个 @Import 注解,指定配置类。 [嵌套多一层是为了隐藏细节(配置类,这个使用者不用关注),方便使用者使用,使用者直接一个注解即可,不用任何配置]
  2. @Import 注解的配置类,需要实现接口 ImportSelector,以及实现方法 selectImports,入参是注解元数据,出参是需要导入的类 String []