lim技术第二季--dubbo--09 10 11

DUBBO官网:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

  • 服务提供者向注册中心注册服务。
  • 服务消费者向注册中心订阅服务。

扶服务的消费者:

1.接口生成动态代理对象

2.集群负载均衡

3.去注册中心找服务的提供者

4.选择协议组织请求

5.请求封装为request

6.通过neetty或者mina序列化

扫描二维码关注公众号,回复: 9522022 查看本文章

1.注册服务

2.接口生成动态代理

3.netty或者mina监听端口

4.解析reduest

5.选择协议解析请求

6.动态代理对象

服务的提供者去监听。

分层:

------------------------------------------------------------------------9---------------------------------------------------------------------------------

如果问到Dubbo底层原理,肯定除了上一讲的底层架构,你能说出来之外,还很可能会追问几个问题,网络通信这块原理的话

netty来举例,NIO来实现的,一台机器同时抗高并发的请求。

参考:https://blog.csdn.net/paul_wei2008/article/details/19355681?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

参考: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---------------------------------------------------------------------------------

扩展:核心的组件都接口化的。

两点,第一点,是核心的组件全部接口化,组件和组件之间的调用,必须全部是依托于接口,去动态找配置的实现类,如果没有配置就用他自己默认的

第二点,提供一种自己实现的组件的配置的方式,比如说你要是自己实现了某个组件,配置一下,人家到时候运行的时候直接找你配置的那个组件即可,作为实现类,不用自己默认的组件了

发布了329 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_28764557/article/details/104584773