Feign请求处理流程
前面已经学习完了@Feign代理类的生成,接下来完成基于Feign的请求流程的处理,一个请求过来怎么去获取请求url
目录
- 基于Fein进行请求的整体流程
1.Feign的请求处理流程
基于上篇的内容我们已经知道我们生成的代理类最终会有一个请求接口对应的SynchronousMethodHandler
,而该类包含了我们对应发送相关的内容。
- 1.基于接口找到对应的
SynchronousMethodHandler
- 2.
SynchronousMethodHandler
找到LoadBalancerFeignClient
- 3.
LoadBalancerFeignClient
是和Ribbon进行整合的 - 4.从
Ribbon
和EurekaClient整合的代码中找到对应的server并进行url的替换
2.源码讲解
Map
dispatch:
2.1.SynchronousMethodHandler
上一篇讲解,我们每个请求方法对应了一个
SynchronousMethodHandler
,所以请求接口的时候,就会通过Method找到对应的SynchronousMethodHandler
执行invoke方法
public 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) {
}
}
}
- 1.构造RestTemplate:包含
GET /order/1?status=1 HTTP/1.1
请求url等相关信息 - 2.执行
executeAndDecode
,这个才是真正处理请求的逻辑
2.2.真正的请求处理流程
Object executeAndDecode(RequestTemplate template, Options options) throws Throwable {
Request request = targetRequest(template);
if (logLevel != Logger.Level.NONE) {
logger.logRequest(metadata.configKey(), logLevel, request);
}
Response response;
long start = System.nanoTime();
try {
response = client.execute(request, options);
// ensure the request is set. TODO: remove in Feign 12
response = response.toBuilder()
.request(request)
.requestTemplate(template)
.build();
} catch (IOException e) {
}
//省略decode相关信息
}
- 构造request:
GET http://SERVICE-ORDER/order/1?status=1 HTTP/1.1
- LoadBalancerFeignClient:执行excute方法,进行调用
- LoadBalancerCommand完成server的选择,以及请求重试等逻辑的处理