• 14.OpenFeign 源码分析(springcloud)


    5.1 OpenFeign 的原理是什么?
    根据上面的案例,我们知道 feign 是接口调用,接口如果想做事,必须要有实现类
    可是我们并没有写实现类,只是加了一个 @FeignClient(value= xxx-service ) 的注解
    所以我们猜测 feign 帮我们创建了代理对象,然后完成真实的调用。
    动态代理 1jdk
    invoke 2cglib 子类继承的
    1. 给接口创建代理对象(启动扫描)
    2. 代理对象执行进入 invoke 方法
    3. invoke 方法里面做远程调用
    具体我们这次的流程:
    A. 扫描注解得到要调用的服务名称和 url
    B. 拿到 provider-order-service/doOrder ,通过 ribbon 的负载均衡拿到一个服务, provider-order-service/doOrder--- http://ip:port/doOrder
    C. 发起请求,远程调用
    5.2 看看 OpenFeign 的内部是如何实现这些的
    5.2.1 如何扫描注解 @FeignClient
    查看启动类的 @EnableFeignClients

    进入 FeignClientsRegistrar 这个类 去查看里面的东西

     

     

    真正的扫描拿到注解和服务名称

     

    5.2.2 如何创建代理对象去执行调用?
    当我们启动时,在 ReflectiveFeign 类的 newInstance 方法,给接口创建了代理对象

    当我们执行调用的时候,打个断点去查看

     

    ReflectiveFeign 类中的 invoke 方法帮我们完成调用

     

    SynchronousMethodHandler invoke 中给每一个请求创建了一个 requestTemplate 象,去执行请求

    executeAndDecode

     

    我们去看 LoadBalancerFeignClient execute 方法

     

    executeWithLoadBalancer 继续往下看

     

     

     

    只要是 feign 调用出了问题
    feign 包下面的 Client 接口下面的 108
    200 成功
    400 请求参数错误
    401 没有权限
    403 权限不够
    404 路径不匹配
    405 方法不允许
    500 提供者报错了
    302 资源重定向

     

  • 相关阅读:
    基于大数据的安防体系建设研究和实践
    定制.NET 6.0的依赖注入
    Opencv中的直方图均衡
    Windows云服务器 PHP搭建网站外网无法访问的问题
    【基础篇】七、Flink核心概念
    Eureka使用及原理详解
    【HBZ分享】AQS + CAS +LockSupport 实现ReentrantLock的原理
    python3 ConfigParser配置文件解析(config.ini).ini文件节点字段命名规范
    38、HTML进阶——SVG
    202109 CSP认证 | 脉冲神经网络
  • 原文地址:https://blog.csdn.net/weixin_59334478/article/details/127813428