天天看点

Feign工作原理详解(二)1. Feign 是如何设计的2. Feign 动态代理

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 执行。

Feign工作原理详解(二)1. Feign 是如何设计的2. Feign 动态代理

总结:

  1. 前两步是生成动态对象:将 Method 方法的注解解析成 MethodMetadata,并最终生成 Feign 动态代理对象。
  2. 后几步是调用过程:根据解析的 MethodMetadata 对象,将 Method 方法的参数转换成 Request,最后调用 Client 发送请求。

2. Feign 动态代理

Feign工作原理详解(二)1. Feign 是如何设计的2. Feign 动态代理

Feign 的默认实现是 ReflectiveFeign,通过 Feign.Builder 构建。它的创建顺序如下:

**Feign.builder()-> 创建一个Builder对象,它可以通过一系列的方法如: contract(),client(),retryer()等配置所需的依赖对象. **