模拟 Dubbo 底层原理实现

提供者

  1. 本地注册

    将自己需要暴露出去的类做一个注册,放入 map 集合中

  2. 绑定 ip 地址,启动 tomcat,创建 HttpServer,等待请求

  3. 消费者调用,使用 req,response

  1. 通过序列化转换消费者入参,通过约定序列化方式,反序列化实现类,执行对应方法,response 返回

    ​ 选择序列化方式

    ​ 其中重要的信息有

    接口名 (即类名)

    方法名

    方法参数类型列表

    方法参数值列表

    版本号(多个实现类,可以选择使用哪一个实现类)

消费者

  1. 创建需要传参信息

    1. 解构为以上的序列化重要信息

      太麻烦了,每个都需要单独解构

    2. 使用代理工厂去创建对应的代理对象,去调用 HttpClient 发送

      这样就可以动态生成不同的代理对象,将解构、发送统一在 invoke 方法中动态生成

  2. 创建 HttpClient 发送请求,等待结果

注册中心

  1. 保存注册类,并将 URL(IP,端口号等)将其对应如 Map< 接口名,URL>
  2. 考虑到提供者集群,即多个提供者时,即 Map< 接口名,List< URL>>
  3. 通过不同策略,获取 URL 调用对应的提供者
  4. 可以添加网络传输协议,即 URL 中包含了传输协议、IP、端口号等,这样消费者不用管提供者使用什么协议,也可以保证和提供者一致
  5. 添加实现类和接口名,即 URL 中追加了实现类和接口名
  6. 核心执行器 Invoker,中有 invoker() 方法,通过判断 url 中的传输协议,ip,端口号,类名,接口名,消费者只用调用,不用管提供者配置,直接发送给提供者

优点

  1. 共享数据
  2. 消息订阅机制,实时更新消费者缓存
  3. 心跳机制,定期检测提供者是否可用
  4. 自动重试,如果调用的某一个提供者挂掉了,则重复调用其他的提供者
  5. 可以使用 mock,模拟数据去调用提供者
  6. 可以通过配置,使用不同网络传输协议,比如 Netty、tomcat