Dubbo底层原理
dubbo
1. 依赖 spring扫描注入
2. 反射
3. 动态代理
4.Zookeeper
5.netty
服务不在本地,具体实现在远程 可以用Dubbo
基于XML 效率低 传输低 解析低 JSON还好一些
Dubbo传输的是二进制数据 对象序列化成二进制 在网络中去传输 获取到二进制反序列化成对象 效率高。并且Java写的,用Java去反序列化。消费端可以是PHP的哈
当然Dubbo可以发布可以通过FastJSON 可以PHP解析 跨语言解析 但是用了JSON效率降低了
但是XML依然有用!
如果有不光有文字 还有图片呢 JSON可以做 但是麻烦。 图片直接写到XML中,一次传输过来。
而且可以进行数据检查,xsd做数据校验
而且可以跨平台 C语言都可以
Restful 接口很灵活的 是个规范 风格 restful一般返回的都是JSON数据格式
JSON里面不能包含太大的数据 太大考虑XML
原理思路:
反射(Class.forName("xxx")) 出Class对象来 然后newInstance() 出对象
有了对象就可以调用方法了 对象是Object 但是不知道是哪个方法啊 需要强转下 看我调用者的接口了
使用接口的目的是 不确定具体类型 抽象出一个接口 通过接口去调用实际方法(实际的是远程jvm的那个哦,远程的那个怎么实现的 我调用的就是那个实现的)
通过反射出类对象,然后动态调用(替换本地的)远程实现类的方法 (执行的是 反序列化后的对象的那个类的方法 )
我大体给大家贴下代码吧: 本质就是动态代理 执行之前做个小动作 去执行了代理类的方法
远端项目启动Spring 时候 扫描包 扫描到注解 扫到自我容器中
然后放(Socket)到ZK中(服务注册中心 去注册服务)登记
或者我在调用方法时候: 比调用 add() 方法时候 不执行本地的方法(本地没有实现)
在调用实际方法时候 通过远程把真正实例 加载到本地 通过 反射(Invoke 动态代理去实现 首先实现接口InvocationHandler)进行拦截执行 动态执行
网络编程 效率最高的还是netty啦~ 所以socket 用的 netty
在调用实际方法时候 通过远程 把这是的实例 加载到本地
动态代理
远程查找对象实例,通过网络Socket获取到
反序列化 并注入对象