实例调用过程
feign的核心主要分两块:
1,初始化
feign通过Feign.builder() 构造器构建传递初始化参数,如:发起http的工具,序列化工具,目标类,生产者地址等参数
然后解析目标类注解为每个方法生成对应的MethodHandler ,
然后使用jdk动态代理为目标类生成代理实例ReflectiveFeign.FeignInvocationHandler
2,调用过程
调用目标类实例方法实际调用的是代理对象 ReflectiveFeign.FeignInvocationHandler.invoke–>
同步调用方法处理器 SynchronousMethodHandler.invoke–> ApacheHttp装饰者 ApacheHttpClient.execute
测试接口
public interface TestFeignClient {
@GET
@Path("test")
String test(String str);
}
1,初始化过程,脱离spring自动装配的情况下,使用TestFeignClient,创建目标类接口的代理类实例
TestFeignClient target = Feign.builder()
.client(new ApacheHttpClient())
.contract(new JAXRS2Contract())
.decoder(new JacksonDecoder())
.encoder(new JacksonEncoder())
.target(TestFeignClient.class, "http://" + testClient);
Feign.builder() 基础构建器
.client(new ApacheHttpClient()) 选择具体发起http请求的工具
由ApacheHttpClient 类实现 实现feign.Client 接口,
核心实现方法execute(),通过解析转换feign.Request 为 org.apache.http.HttpResponse
然后通过apache.HttpClient 发起请求
.contract(new JAXRS2Contract()) 使用 JAX-RS 2 注解标识请求
.decoder(new JacksonDecoder()) 解码器
.encoder(new JacksonEncoder()) 编码器
.target(TestFeignClient.class, "http://" + testClient); 使用jdk动态代理生成代理对象
基础构建之后创建默认对象 ReflectiveFeign
1,new ReflectiveFeign(handlersByName, invocationHandlerFactory, queryMapEncoder);
2,调用 ReflectiveFeign.newInstance(targ