模拟 Dubbo 底层原理实现
提供者
本地注册
将自己需要暴露出去的类做一个注册,放入 map 集合中
绑定 ip 地址,启动 tomcat,创建 HttpServer,等待请求
消费者调用,使用 req,response
通过序列化转换消费者入参,通过约定序列化方式,反序列化实现类,执行对应方法,response 返回
选择序列化方式
其中重要的信息有
接口名 (即类名)
方法名
方法参数类型列表
方法参数值列表
版本号(多个实现类,可以选择使用哪一个实现类)
消费者
创建需要传参信息
解构为以上的序列化重要信息
太麻烦了,每个都需要单独解构
使用代理工厂去创建对应的代理对象,去调用 HttpClient 发送
这样就可以动态生成不同的代理对象,将解构、发送统一在 invoke 方法中动态生成
创建 HttpClient 发送请求,等待结果
注册中心
- 保存注册类,并将 URL(IP,端口号等)将其对应如 Map< 接口名,URL>
- 考虑到提供者集群,即多个提供者时,即 Map< 接口名,List< URL>>
- 通过不同策略,获取 URL 调用对应的提供者
- 可以添加网络传输协议,即 URL 中包含了传输协议、IP、端口号等,这样消费者不用管提供者使用什么协议,也可以保证和提供者一致
- 添加实现类和接口名,即 URL 中追加了实现类和接口名
- 核心执行器 Invoker,中有 invoker() 方法,通过判断 url 中的传输协议,ip,端口号,类名,接口名,消费者只用调用,不用管提供者配置,直接发送给提供者
优点
- 共享数据
- 消息订阅机制,实时更新消费者缓存
- 心跳机制,定期检测提供者是否可用
- 自动重试,如果调用的某一个提供者挂掉了,则重复调用其他的提供者
- 可以使用 mock,模拟数据去调用提供者
- 可以通过配置,使用不同网络传输协议,比如 Netty、tomcat