springcloud 基础组件-Feign 调用流程
原图来自:https://blog.csdn.net/luanlouis/article/details/82821294
所有注册的feign client
org.springframework.cloud.openfeign.FeignAutoConfiguration#feignContext
决定使用哪种client的地方
org.springframework.cloud.openfeign.FeignAutoConfiguration.OkHttpFeignConfiguration#feignClient
org.springframework.cloud.openfeign.FeignAutoConfiguration.HttpClientFeignConfiguration#feignClient
feign.Client.Default#Default
feign 所有拦截器
feign.SynchronousMethodHandler#targetRequest
Request targetRequest(RequestTemplate template) {
for (RequestInterceptor interceptor : requestInterceptors) {
interceptor.apply(template);
}
return target.apply(template);
}
feign feign 发送请求的地方(接口)
feign.Client#execute
默认的jdk 发送请求的地方
feign.Client.Default#execute
httpclient 发送请求的地方
org.apache.http.protocol.HttpRequestExecutor#doSendRequest
httpclient request 拦截器
org.apache.http.protocol.HttpRequestExecutor#preProcess
org.apache.http.protocol.ImmutableHttpProcessor#process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext)
@Override
public void process(
final HttpResponse response,
final HttpContext context) throws IOException, HttpException {
for (final HttpResponseInterceptor responseInterceptor : this.responseInterceptors) {
responseInterceptor.process(response, context);
}
}
httpclient response 拦截器
org.apache.http.protocol.HttpRequestExecutor#postProcess
org.apache.http.protocol.ImmutableHttpProcessor#process(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext)
@Override
public void process(
final HttpResponse response,
final HttpContext context) throws IOException, HttpException {
for (final HttpResponseInterceptor responseInterceptor : this.responseInterceptors) {
responseInterceptor.process(response, context);
}
}
okhttp 发送请求的地方
okhttp3.internal.http.CallServerInterceptor#intercept
okhttp 拦截器
okhttp3.RealCall#getResponseWithInterceptorChain
Response getResponseWithInterceptorChain() throws IOException {
// Build a full stack of interceptors.
List<Interceptor> interceptors = new ArrayList<>();
interceptors.addAll(client.interceptors());
interceptors.add(retryAndFollowUpInterceptor);
interceptors.add(new BridgeInterceptor(client.cookieJar()));
interceptors.add(new CacheInterceptor(client.internalCache()));
interceptors.add(new ConnectInterceptor(client));
if (!forWebSocket) {
interceptors.addAll(client.networkInterceptors());
}
interceptors.add(new CallServerInterceptor(forWebSocket));
Interceptor.Chain chain = new RealInterceptorChain(
interceptors, null, null, null, 0, originalRequest);
return chain.proceed(originalRequest);
}
有问题请联系hudcan@sina.com
个人网站:http://ext.123cc.cc
« 上一篇: headscale 和 derp 部署
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix