DUBBO官网:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
- 服务提供者向注册中心注册服务。
- 服务消费者向注册中心订阅服务。
扶服务的消费者:
1.接口生成动态代理对象
2.集群负载均衡
3.去注册中心找服务的提供者
4.选择协议组织请求
5.请求封装为request
6.通过neetty或者mina序列化
1.注册服务
2.接口生成动态代理
3.netty或者mina监听端口
4.解析reduest
5.选择协议解析请求
6.动态代理对象
服务的提供者去监听。
分层:
------------------------------------------------------------------------9---------------------------------------------------------------------------------
如果问到Dubbo底层原理,肯定除了上一讲的底层架构,你能说出来之外,还很可能会追问几个问题,网络通信这块原理的话
netty来举例,NIO来实现的,一台机器同时抗高并发的请求。
参考:https://blog.csdn.net/itcastcn/article/details/80114490
1.client一个线程调用远程接口,生成一个唯一的ID(比如一段随机字符串,UUID等),Dubbo是使用AtomicLong从0开始累计数字的
2.将打包的方法调用信息(如调用的接口名称,方法名称,参数值列表等),和处理结果的回调对象callback,全部封装在一起,组成一个对象object
3.向专门存放调用信息的全局ConcurrentHashMap里面put(ID, object)
4.将ID和打包的方法调用信息封装成一对象connRequest,使用IoSession.write(connRequest)异步发送出去
4.当前线程再使用callback的get()方法试图获取远程返回的结果,在get()内部,则使用synchronized获取回调对象callback的锁, 再先检测是否已经获取到结果,如果没有,然后调用callback的wait()方法,释放callback上的锁,让当前线程处于等待状态。
5.服务端接收到请求并处理后,将结果(此结果中包含了前面的ID,即回传)发送给客户端,客户端socket连接上专门监听消息的线程收到消息,分析结果,取到ID,再从前面的ConcurrentHashMap里面get(ID),从而找到callback,将方法调用结果设置到callback对象里。
6.监听线程接着使用synchronized获取回调对象callback的锁(因为前面调用过wait(),那个线程已释放callback的锁了),再notifyAll(),唤醒前面处于等待状态的线程继续执行(callback的get()方法继续执行就能拿到调用结果了),至此,整个过程结束。
------------------------------------------------------------------------10---------------------------------------------------------------------------------
扩展:核心的组件都接口化的。
两点,第一点,是核心的组件全部接口化,组件和组件之间的调用,必须全部是依托于接口,去动态找配置的实现类,如果没有配置就用他自己默认的
第二点,提供一种自己实现的组件的配置的方式,比如说你要是自己实现了某个组件,配置一下,人家到时候运行的时候直接找你配置的那个组件即可,作为实现类,不用自己默认的组件了