Feign的执行流程
首先通过@EnableFeignClients注解开启Feign功能,程序启动时开启对@FeignClient注解的扫描
1
2
3
4
5
public EnableFeignClients当接口的方法调用时,通过动态代理SynchronousMethodHandler生成具体的RequestTemplate
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25public Object invoke(Object[] argv) throws Throwable {
RequestTemplate template = buildTemplateFromArgs.create(argv);
Options options = findOptions(argv);
Retryer retryer = this.retryer.clone();
while (true) {
try {
return executeAndDecode(template, options);
} catch (RetryableException e) {
try {
retryer.continueOrPropagate(e);
} catch (RetryableException th) {
Throwable cause = th.getCause();
if (propagationPolicy == UNWRAP && cause != null) {
throw cause;
} else {
throw th;
}
}
if (logLevel != Logger.Level.NONE) {
logger.logRetry(metadata.configKey(), logLevel);
}
continue;
}
}
}
1 | RequestTemplate template = buildTemplateFromArgs.create(argv); |
在构建RequestTemplate的时候会进行参数解析,如果参数是@RequestBody的会调用Encoder的encode方法进行编码(BuildEncodedTemplateFromArgs)
1 | encoder.encode(body, metadata.bodyType(), mutable); |
再根据RequestTemplate生成HTTP的Request对象
Request对象交给Client处理,可配置HttpURLConnection、HttpClient、OkHttp等
1
2
3// 该方法首先会调用RequestInterceptor的apply方法处理请求,之后才会进行请求发送
// 执行完之后调用Decoder的decode方法来进行解码
return executeAndDecode(template, options);Client被封装到LoadBalanceClient类进行负载均衡
1 | Object executeAndDecode(RequestTemplate template, Options options) throws Throwable { |