dubbo的实现原理?Springcloud已经没人用了吗
- 数据库
- 2023-08-13
- 104
大家好,今天小编来为大家解答以下的问题,关于dubbo的实现原理,Springcloud已经没人用了吗这个很多人还不知道,现在让我们一起来看看吧!dubbo异步转同步原...
大家好,今天小编来为大家解答以下的问题,关于dubbo的实现原理,Springcloud已经没人用了吗这个很多人还不知道,现在让我们一起来看看吧!
dubbo异步转同步原理
Dubbo是一款开源的RPC中间件框架,底层数据传输默认使用的Netty,那么请求的处理理论上是异步的。
异步转同步原理:
1、调用方请求远程服务之后,需要等待结果,此刻,请求线程应该阻塞。
2、远程服务返回结果后,唤醒请求线程,调用方得到结果:Dubbo异步转同步,核心类是DefaultFuture,核心方法是get(),received(Channelchannel,Responseresponse)。
dubbo原理
dubbo原理如下:
第一层:service层,接口层,给服务提供者和消费者来实现的。
第二层:config层,配置层,主要是对dubbo进行各种配置的。
第三层:proxy层,服务代理层,透明生成客户端的stub和服务单的skeleton。
第四层:registry层,服务注册层,负责服务的注册与发现。
第五层:cluster层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务。
第六层:monitor层,监控层,对rpc接口的调用次数和调用时间进行监控。
第七层:protocol层,远程调用层,封装rpc调用。
第八层:exchange层,信息交换层,封装请求响应模式,同步转异步。
第九层:transport层,网络传输层,抽象mina和netty为统一接口。
第十层:serialize层,数据序列化层。
dubbo隐式传参的原理
1)远程通讯协议基本原理
a)网络通信:将二进制流从一台计算机传输到另外一台计算机,基于传输协议和网络IO来实现
b)传输协议有http、tcp、udp,都是在基于Socket概念扩展而来
c)网络IO,主要有bio、nio、aio,所有的分布式应用通讯都基于这个原理而实现
dubbo原理深度解析
dubbo原理和机制:
Dubbo是一个高性能优秀的服务框架,它使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源JavaRPC框架。
它提供了三大核心能力:
1、面向接口的远程方法调用;
2、智能容错和负载均衡;
3、服务自动注册和发现。
注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。
监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示。
服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销。
服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销。
dubbo调用流程原理
步骤
1/7分步阅读
服务容器Container负责启动加载运行服务提供者Provider。根据Provider配置的文件根据协议发布服务,完成服务的初始化.
2/7
Provider在启动时,根据配置中的Registry地址连接Registry,将Provider的服务信息发布到Registry,在Registry注册自己提供的服务。
3/7
Consumer在启动时,根据消费者XML配置文件中的服务引用信息,连接到Registry,向Registry订阅自己所需的服务。
4/7
Registry根据服务订阅关系,返回Provider地址列表给Consumer,如果有变更,Registry会推送最新的服务地址信息给Consumer。
5/7
Consumer调用远程服务时,会根据路由策略,先从缓存的Provider地址列表中选择一台进行,跨进程调用服务,假如调用失败,再重新选另一台调用。
6/7
服务Provider和Consumer,会在内存中记录调用次数和调用时间,每分钟发送一次统计数据到Monitor。
7/7
这就是整个完整的Dubbo调用过程和原理
单一长连接通信原理
基本原理如下:
1.client一个线程调用远程接口,生成一个唯一的ID(比如一段随机字符串,UUID等),Dubbo是使用AtomicLong从0开始累计数字的
2.将打包的方法调用信息(如调用的接口名称,方法名称,参数值列表等),和处理结果的回调对象callback,全部封装在一起,组成一个对象object
3.向专门存放调用信息的全局ConcurrentHashMap里面put(ID,object)
4.将ID和打包的方法调用信息封装成一对象connRequest,使用IoSession.write(connRequest)异步发送出去
5.当前线程再使用callback的get()方法试图获取远程返回的结果,在get()内部,则使用synchronized获取回调对象callback的锁,再先检测是否已经获取到结果,如果没有,然后调用callback的wait()方法,释放callback上的锁,让当前线程处于等待状态。
6.服务端接收到请求并处理后,将结果(此结果中包含了前面的ID,即回传)发送给客户端,客户端socket连接上专门监听消息的线程收到消息,分析结果,取到ID,再从前面的ConcurrentHashMap里面get(ID),从而找到callback,将方法调用结果设置到callback对象里。
7.监听线程接着使用synchronized获取回调对象callback的锁(因为前面调用过wait(),那个线程已释放callback的锁了),再notifyAll(),唤醒前面处于等待状态的线程继续执行(callback的get()方法继续执行就能拿到调用结果了),至此,整个过程结束。
好了,文章到此结束,希望可以帮助到大家。
本文链接:http://xinin56.com/su/3859.html