Dubbo的底层实现原理和机制

Dubbo的底层实现原理和机制,第1张

Dubbo :是一个rpc框架,soa框架

作为RPC:支持各种传输协议,如dubbo,hession,json,fastjson,底层采用mina,netty长连接进行传输!典型的provider和cusomer模式!

作为SOA:具有服务治理功能,提供服务的注册和发现!用zookeeper实现注册中心!启动时候服务端会把所有接口注册到注册中心,并且订阅configurators,服务消费端订阅provide,configurators,routers,订阅变更时,zk会推送providers,configuators,routers,启动时注册长连接,进行通讯!proveider和provider启动后,后台启动定时器,发送统计数据到monitor!提供各种容错机制和负载均衡策略!!

描述一个服务从发布到被消费的详细过程:

一个服务的发布暴露过程:

首先设置一个项目的别名,然后是定义注册中心和设定传输协议,之后定义服务名!服务接口以jar形式导入到provider!

一个服务发布暴露首先由spring的spacehander 把相关的xml或者注解全部转化为springBean,之后通过ServiceConfigexerp()方法把bean传化为传输所需的url和参数注册到注册中心,发布后provder端的ref(helloImpl)通过protocl(传输协议,如dubboprotocl,hessionprotocl)转化为Invoker对象,即调用信息,包括类,方法,参数等等,再通过proxy *** 作(代理)如jdkproxy代理转为为Exporter对象,这就是整个的服务暴露过程!

消费过程:

一个Renfence类,通过RenfenceConfig的init 调用proxy的refer方法生产一个invoker,invoker再通过proctol转化成具体的ref(hello),进行消费

首先 ReferenceConfig 类的 init 方法调用 Protocol 的 refer 方法生成 Invoker 实例(如上图中的红色部分),这是服务消费的关键。接下来把 Invoker 转换为客户端需要的接口(如:HelloWorld)

具体参见

>

1,dubbo是什么

dubbo是阿里巴巴开源的,基于JAVA的 RPC (Remote Procedure Call)分布式服务框架。现已成为Apache基金孵化项目

2,为什么要使用dubbo

dubbo内部使用了Netty,zookeeper,保证了应用的高可用性和高性能。使用dubbo可以将核心业务抽取出来,最为独立的服务,并逐渐发展成稳定的服务中心。这样就可以复用灵活拓展,满足前端多变的市场需求,最重要的一点是,分布式架构能够承受更大规模的并发量

3、Dubbo 和 Spring Cloud 有什么区别?

两者没有关联,非要说区别。1,通信方式不同:dubbo使用的是RPC通信,Spring Cloud使用的是>

Dubbo是 Alibaba 开源的分布式服务框架远程调用框架,在网络间传输数据,就需要通信协议和序列化。

Dubbo支持dubbo、rmi、hessian、>

官网地址: >

最近一直在看dubbo的源码部分。在阅读的时候,需要有一个入手点,才能一点一点的进行下去。自己在研究的时候,发现思绪比较乱,于是就以 芋道源码 为基础,一点一点的啃食。芋道源码是直接从dubbo的配置和一些核心的API开始讲起,是从dubbo已经启动的过程作为开始节点,而这些核心 API 与 Spring 的之间的关系被省略了,这些东西对我来说属于前置的知识点,所以花了比较长的时间又从 Dubbo 的核心 API 倒着往前看。

在阅读 Dubbo 时,发现前置知识越来越多,如:Spring 的 refresh 中的一些核心点,Spring 中 bean 的生命周期,BeanFactory 与 FactoryBean 的区别等。所以这些前置知识花了特别多的时间去补。所幸,虽然补前置知识虽然时间长,但是性价比还是可以的。Dubbo 是依赖于Spring 的上下文环境的框架,其他依赖于 Spring 的框架也是相同的道理。Spring 的一些对外的扩展点,读过之后也会心中有数。

1、本篇主要是描述了 Dubbo 在 Spring 创建上下文的时候,是如何从创建,到能完整提供一个RPC调用能力的一些相关点。

2、由于源码比较多,直接贴断点也太过臃肿,所以仅仅贴一些关键点来概括整个流程。

3、本文是依赖于前面的 dubbo 项目进行断点分析,项目结构可以参照这里。项目中 dubbo 的配置方式是 xml 文件,所以本篇主要说 xml 配置方式。其他方式道理相同,并不是问题的关键点。

4、项目启动的是 dubbo-user 服务,所以 UserService 为 dubbo:service,OrderService 为 dubbo:reference。

下图为Spring 启动时是如何加载 Dubbo 的,其中省略了大量过程,只保留了一些关键节点,省略的部分可以略微脑补一下。

整个流程的入口是 Spring 的 refresh 方法。每个方法都有比较深的调用栈。与 Dubbo 有关的入口是 refresh 中的 invokeBeanFactoryPostProcessors 方法

这个方法是执行 beanFactory 的一些后处理 *** 作,其核心流程为在Spring容器中找出实现了BeanFactoryPostProcessor接口的processor并执行。Spring容器会委托给PostProcessorRegistrationDelegate的invokeBeanFactoryPostProcessors方法执行。

ConfigurationClassPostProcessor 是比较核心的类,在这里我们关注一下这个类。它的作用是对项目中配置的类进行处理。具体处理可以分为几步:

在加载类信息时,spring 会去用各种方式扫到注册的 bean 信息。我们在 spring 中注册的 bean,逃不出这个方法的扫描方式。 核心方法是:

扫描之后,会将扫描到的 bean 注册到 beanDefinitionMap 中

首先是此处 orgspringframeworkbeansfactoryxmlDefaultBeanDefinitionDocumentReader#parseBeanDefinitions,可以看出方法会以配置文件根节点起,遍历所有子节点。

其次是这里 orgspringframeworkbeansfactoryxmlBeanDefinitionParserDelegate#parseCustomElement(orgw3cdomElement, orgspringframeworkbeansfactoryconfigBeanDefinition), 此方法会通过解析出来的节点,获取对应的 Spring 的 namespaceUri ,进而获取对应的配置文件处理器。

此处 ele 参数实际值为 <dubbo:service />,namespaceUri 为 >

从架构的角度来看,API网关暴露>

Dubbo是Alibaba开源的分布式服务框架,它按照分层的方式来架构,使用这种方式可以使各层解耦。

Dubbo在调用远程的服务的时候再本地有一个接口,就想调用本地方法一样去调用,底层实现好参数传输和远程服务运行结果传回之后的返回。

Dubbo的特点:

(1)它主要使用高效的网络框架和序列化框架,让分布式服务之间调用效率更高。

(2)采用注册中心管理众多的服务接口地址,当你想调用服务的时候只需要跟注册中心询问即可,不像使用WebService一样每个服务都得记录好接口调用方式。

(3)监控中心时实现服务方和调用方之间运行状态的监控,还能控制服务的优先级、权限、权重、上下线等,让整个庞大的分布式服务系统的维护和治理比较方便。

(4)高可用,如果有服务挂了,注册中心就会从服务列表去掉该节点,客户端会像注册中心请求另一台可用的服务节点重新调用。同时注册中心也能实现高可用(ZooKeeper)。

(5)负载均衡,采用软负载均衡算法实现对多个相同服务的节点的请求负载均衡。

Dubbo需要四大基本组件:Rigistry,Monitor,Provider,Consumer。

1、监控中心的配置文件-dubboproperties文件

(1)容器,监控中心是在jetty和spring环境下运行,依赖于注册中心,日志系统是log4j

    dubbocontainer = log4j,spring,registry,jetty

(2)监控服务的名称,监控系统对整个Dubbo服务系统来说也是一个服务

    dubboapplicationname = simple-monitor

(3)服务的所有者,这是Dubbbo的服务的功能,可以指定服务的负责人

    dubboapplicationowner = coselding

(4)注册中心的地址,配置后监控中心就能通过注册中心获取当前可用的服务列表及其状态,在页面向你汇报Dubbo中的服务运行情况。

    dubboregistraddress = multicast://{ip}:{port} //广播

    dubboregistraddress = zookeeper://{ip}:{port} //zookeper

    dubboregistraddress = redis://{ip}:{port} //redis

    dubboregistraddress = dubbo://{ip}:{port} //dubbo

(5)dubbo协议端口号

    dubboprotocolport = 7070

(6)jetty工作端口号

    dubbojettyport = 8082

(7)工作目录,用于存放监控中心的数据

    dubbojettydirectory = ${userhome}/monitor

(8)监控中心报表存放目录

    dubbochartsdirectory=${dubbojettydirectory}/charts

(9)监控中心数据资料目录

    dubbostatisticsdirectory=${userhome}/monitor/statistics

(10)监控中心日志文件路径

    dubbolog4jfile=logs/dubbo-monitor-simplelog

(11)监控中心日志记录级别

    dubbolog4jlevel=WARN

2、Dubbo提供负载均衡方式

(1)Random,随机,按权重配置随机概率,调用量越大分布越均匀,默认方式。

(2)RounRobin,轮询,按权重设置轮询比例,如果存在比较慢的机器容易在这台机器上请求阻塞较多。

(3)LeastActive,最少活跃调用数,不支持权重,只能根据自动识别的活跃数分配,不能灵活调配。

(4)ConsistenHash,一致性hash,对相同参数的请求路由到一个服务提供者上,如果有类似灰度发布需求可采用。

3、Dubbo过滤器

Dubbo初始化过程加载ClassPath下的META-INF/dubbo/internal/,META-INF/dubbo/,META-INF/services/三个路径下的comalibabadubborpcFilter文件。文件内容:

    Name = FullClassName,这些类必须实现Filter接口。

自定义Filter类:

配置文件在配置过滤器,consumerxml中:

Dubbo对过滤器的加载过程:

    先加载三个路径下的comalibabadubborpcFilter文件里面的键值对,key为过滤器名称,value为过滤器的类的全限定名(这个类必须实现Dubbo中的Filter接口)。

    自定义的类中@Active注解是过滤器设定的全局基本属性。

    Spring在加载consumerxml文件时,通过 <dubbo:consumer filter="xxx" id = "xxx" retrries = "0">这个配置指定消费者端要加载的过滤器,通过filter属性指定过滤器名称。

@Activate注解-自动激活,group属性是表示匹配了对应的角色才被加载,value表示表明过滤条件,不写则表示所有条件都会被加载,写了则只有dubbo URL中包含该参数名且参数值不为空才被加载,这个参数会以dubbo协议的一个参数K-V对传到Provider。

4、Dubbo的Provider配置

5、Dubbo的Consumer配置

1、Dubbo是什么?

Dubbo是阿里巴巴开源的基于Java的高性能RPC分布式框架。

2、为什么使用Dubbo?

很多公司都在使用,经过很多线上的考验,内部使用了Netty,Zookeeper,保证了高性能可用性。

使用Dubbo可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可以提高业务复用灵活性扩展,使前端应用能快速的响应对边的市场需求。分布式架构可以承受更大规模的并发流量。

Dubbo的服务治理图:

3、Dubbo和Spring Cloud的区别

两个没有关联,但是非要说区别,有如下几点:

(1)通信方式不同,Dubbo使用RPC通信,Spring Cloud使用>

以上就是关于Dubbo的底层实现原理和机制全部的内容,包括:Dubbo的底层实现原理和机制、请问java高手,dubbo接口和http接口有什么区别、dubbo笔记等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9472640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存