首页 > 编程知识 正文

dubbo框架原理,dubbo rpc原理

时间:2023-05-04 19:02:56 阅读:39106 作者:4911

一、对Duboo基本概念的解释

Dubbo是一个分布式服务框架。 Webservice也是一个服务框架,但Webservice必须与F5协作以实现负载平衡,而不是分布式服务框架。 因此,dubbo不仅可以提供服务,还可以实现软负载平衡。 它还提供两种功能:监视器监视中心和呼叫中心。 这两个是可选的,必须单独配置。

Dubbo的计数体系结构图如下:

描述以下体系结构图:

消费者服务消费者、提供商服务提供者。 容器服务容器。

服务提供商首先启动start,然后服务提供商在容器中注册服务。

调用方会消耗订阅服务(subscribe ),如果没有订阅自己想要获得的服务,就会不断尝试订阅。 在注册中心注册新服务后,注册中心会通过“通知”(notify )通知消费者这些服务。

调用方调用服务(invoke )。 调用方正在同步。 在实际调用过程中,Provider的位置对Consumer透明,最后调用的服务的位置(IP地址)和下一个调用的服务的位置不确定。 这个地方是实现了软装载。

监视器这是监视。 图中的虚线表示Consumer和Provider异步向Monitor发送消息,Consumer和Provider将信息存储在本地磁盘上,平均每1min发送一次信息。 监视器在整个架构中是可选的,图中的虚线不是可选的。 Monitor功能必须单独配置,不配置或配置后关闭Monitor不会影响服务调用。

二. dubbo原理

本博客的内容总体上是抽象的,对于想马上使用dubbo的学生来说,阅读这个博客效果不太好。 本博客没有写dubbo的使用方法、配置方法。 接下来,请允许我在dubbo入门中再写一个包含demo的博客。

I、初始化过程详细信息:

上图中的第一步start是在容器中装载服务并准备注册服务。

与在Spring中启动的过程类似,只是在启动Spring时将bean加载到容器中时,首先要分析bean。

所以dubbo也先读配置文件来解决服务。

解决服务:

1 )基于dubbo.jar中的Meta-inf/spring.handlers配置,spring在遇到dubbo命名空间时回调到DubboNamespaceHandler类。

2 )在DubboBeanDefinitionParser中统一分析所有dubbo标签,并基于一对一属性映射将XML标签分析为Bean对象。

源代码截图:

初始化ServiceConfig.export或ReferenceConfig.get时,Bean对象将转换为url格式,因此Bean属性将转换为url参数。

然后,将URL传递给协议扩展点,根据扩展点的自适应机制,根据URL的协议头,进行不同协议的服务暴露和引用。

暴露服务:

a、只暴露服务端口

如果没有使用注册中心,这通常适用于开发环境。 服务调用只需打开服务的端口即可提供给同一IP。

即,配置or

服务配置解决的URL格式如下:

dubbo://service-host/com.XXX.txx service? 版本=1.0. 0

基于扩展点的Adaptiver机制在URL的" dubbo://"协议头中标识,并直接调用DubboProtocol的export ()方法以打开服务端口。

b、向注册中心暴露服务:

与前者的区别:必须将服务的IP和端口一起暴露给注册中心。

服务配置解决的url格式如下:

registry ://registry-host/com.Alibaba.dubbo.registry.registry service? export=URL.encode (“dubbo ://service-host/com.XXX.txx service? 版本=1.0. 0”)

基于扩展点的自适应机制由URL的" registry://"协议头标识,并调用RegistryProtocol的导出方法以注册导出参数中的提供程序URL

dubbo://service-host/com.XXX.txx service? 版本=1.0. 0

引用服务:

a、直接引用服务:

对于没有注册中心的直接连接提供商,

参考配置解析的URL格式如下:

dubbo://service-host/com.XXX.txx service? 版本=1.0. 0

基于扩展点的Adaptive机制由url的" dubbo://"协议头标识,直接调用DubboProtocol的refer方法并返回提供程序引用。

b、从注册中心发现引文服务:

此时,Refer

enceConfig解析出的URL的格式为: 
registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode(“consumer://consumer-host/com.foo.FooService?version=1.0.0”)

基于扩展点的Apaptive机制,通过URL的“registry://”协议头识别,就会调用RegistryProtocol的refer方法,基于refer参数总的条件,查询提供者URL,如:
Dubbo://service-host/com.xxx.TxxService?version=1.0.0

基于扩展点的Adaptive机制,通过提供者URL的“dubbo://”协议头识别,就会调用DubboProtocol的refer()方法,得到提供者引用。
然后RegistryProtocol将多个提供者引用,通过Cluster扩展点,伪装成单个提供这引用返回。

三、远程调用细节:

服务提供者暴露一个服务的详细过程:

上图是服务提供者暴露服务的主过程: 
首先ServiceConfig类拿到对外提供服务的实际类ref,然后将ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker实例,到这一步就完成具体服务到invoker的转化。接下来就是Invoker转换到Exporter的过程。
Dubbo处理服务暴露的关键就在Invoker转换到Exporter的过程,下面我们以Dubbo和rmi这两种典型协议的实现来进行说明: 
Dubbo的实现: 
Dubbo协议的Invoker转为Exporter发生在DubboProtocol类的export方法,它主要是打开socket侦听服务,并接收客户端发来的各种请求,通讯细节由dubbo自己实现。
Rmi的实现: 
RMI协议的Invoker转为Exporter发生在RmiProtocol类的export方法,他通过Spring或Dubbo或JDK来实现服务,通讯细节由JDK底层来实现。

服务消费者消费一个服务的详细过程:

上图是服务消费的主过程: 
首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例。接下来把Invoker转为客户端需要的接口即可。
 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。