1. Feign 是如何设计的
首先回顾一下 Feign 的基本用法:
接口与调用类:
@Produces("application/json")
public interface GitHub2_javax {
@GET
@Path("/repos/{owner}/{repo}/contributors")
List<Contributor> contributors(@PathParam("owner") String owner, @PathParam("repo") String repo);
}
// 1. Feign 动态代理
GitHub2_javax github = Feign.builder()
.client(new OkHttpClient())
.decoder(new GsonDecoder())
.contract(new JAXRSContract())
.options( new Request.Options(1000,3500)) //options方法指定连接超时时长及响应超时时长
.retryer( new Retryer.Default(5000,5000,3)) // retryer方法主要是指定重试策略
.target(GitHub2_javax.class, "https://api.github.com");
// 2. Feign 执行
List<Contributor> contributors = github.contributors("OpenFeign", "feign");
小结: Feign 使用时分成两步:一是根据接口生成 Feign 的动态代理类;二是 Feign 执行。
总结:
- 前两步是生成动态对象:将 Method 方法的注解解析成 MethodMetadata,并最终生成 Feign 动态代理对象。
- 后几步是调用过程:根据解析的 MethodMetadata 对象,将 Method 方法的参数转换成 Request,最后调用 Client 发送请求。
2. Feign 动态代理
Feign 的默认实现是 ReflectiveFeign,通过 Feign.Builder 构建。它的创建顺序如下:
**Feign.builder()-> 创建一个Builder对象,它可以通过一系列的方法如: contract(),client(),retryer()等配置所需的依赖对象. **