Feign源码

1. 当有@EnableFeignClients开启Feign

2. 扫描主类下的FeignClient.class注解的类

basePackages = getBasePackages(metadata);

3. 注册FeignClient

registerFeignClient(registry, annotationMetadata, attributes);

4. 创建代理对象

 ReflectiveFeign -> newInstance

T proxy = Proxy.newProxyInstance(target.type().getClassLoader(), new Class[]{target.type()}, handler);
复制代码
static class FeignInvocationHandler implements InvocationHandler {
        private final Target target;
        private final Map<Method, MethodHandler> dispatch;

        FeignInvocationHandler(Target target, Map<Method, MethodHandler> dispatch) {
            this.target = (Target)Util.checkNotNull(target, "target", new Object[0]);
            this.dispatch = (Map)Util.checkNotNull(dispatch, "dispatch for %s", new Object[]{target});
        }

        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        }
}


this.dispatch.get(method)).invoke(args);
 
复制代码

5. 调用invoke方法

通过ribbon讲服务名称转为IP:端口

并通过 HttpURLConnection 发出请求

 

posted @   yifanSJ  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示