手写Dubbo

介绍

Dubbo作为一种RPC框架,极大的提高了程序的开发效率,其底层采用NIO模型,因此其支持IO密集的RPC远程服务。本文剖析了Dubbo的实现了,首先了其核心部分的代码,主要有服务提供者,服务消费者,以及注册中心三个部分。底层采用Netty和Http两种通信协议,实现了类似真实Dubbo的一个简易版框架。

本实验中Dubbo的三个组成部分

事实上,Dubbo有4个组成部分,但是本实验为了简单起见,只模拟了其三个核心部分,未模拟服务监控中心。
手写Dubbo
Provider主要用来提供服务,开发接口给Consumer使用,Consumer调用通过注册中心Provider提供的接口。
主要涉及到的知识点有:
Jdk动态代理、zookeeper、netty、http协议、HttpClient、容器、反射、Json、注解技术

具体流程

具体流程可参考:https://www.jianshu.com/p/9ae88c79c21a
Provider:
1、获取需要开放的类(扫描类,读取注解,类似Spring)
2、注册到ZK(接口名:ip+端口,Json格式)
3、注册到本地(接口名在注解中可配置:具体的实现类)
4、开放服务(netty\http)
5、收到Consumer的调用请求后,获取到调用的接口名,方法名,参数类型,和参数列表从容器中获取对应的实现类,并用反射的方法实例化

Consumer:
1、通过动态代理获取需要调用接口的代理对象
2、在动态代理的invoke中,获取到所调方法的具体方法名,接口名,参数类型和参数列表
3、从注册中心中获取开放服务的所有Provider列表,缓存到本地,并使用负载均衡算法选择一台Provider
4、将以上信息封装成对象传送给Provider
5、Provider返回返回值给Consumer

zookeeper注册中心:
主要作用是实现Provider的统计,通知Consumer其服务节点数据的改变

代码实现

代码在github下可以找到:
https://github.com/a994947007/myDubbo