最后更新:2022-07-21 01:50:23 手机定位技术交流文章
目录
1. Dubbo是什么?RPC是什么?
2. Dubbo能做什么?
你能告诉我杜布博的通话过程吗?
说到哪种协议都支持Dubbo,每个协议的应用程序场景和优点和缺点
5.Dubbo中使用的什么设计模式?
6.如果Dubbo提供的服务来自多个版本,怎么办?
服务暴露的过程是什么?
8.服务参考程序是什么?
9. Dubbo的登记中心是什么?
谈论杜布博的SPI机制?
11. Dubbo SPi和JAVA SPI有什么区别?
12.什么是负荷平衡策略?
13.如何聚类错误?
那是杜布博的部门吗?
15.服务提供者能实现不有效的开支的原则是什么?
为什么通过代理对象进行沟通?
如何设计RPC框架?
Dubbo是一个分布式服务框架,致力于提供高性能和透明的RPC远程服务调用和SOA服务管理方案。
RPC(Remote Procedure Call)—远程过程调用,它是通过网络从远程计算机程序提供的一种请求服务,而不需要了解底>层网络技术的协议。RPC协议假设存在某些传输协议,如TCP或UDP,在通信程序之间传递信息数据.在OSI网络>通信模型中,RPC跨越传输和应用层。RPC使得开发包括网络分配的多程序的应用程序变得更加容易。RPC使用客户端/服务器模式。请求程序是客户端机器,服务提供者程序是一个服务器。首先,客户机调用进程发>送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为>止。当电话消息到达时,服务器接收过程参数,计算结果,发送答复信息,然后等下一次电话,最后,客户>端调用进程接收答复信息,获得进程结果,然后调用继续执行。有许多RPC模式和实现。

我们用一种通俗易懂的语言解释它, 远程调用就是本地机器调用远程机器的一个方法,远程机器返回结果的过程 。
为什么要这么做?
主要原因是由于单个服务器的性能不再令人满意,在这个日益增长的交通时代,只有多个服务器才能支持现有的用户系统,
而在这种体系下,服务越来越多,逐渐演化出了现在这种微服务化的RPC框架。
Dubbo的核心特征包括:

远程通信:Dubbo-remoting模块,提供基于长连接的多个NIO框架的抽象包,包括多个线程模型、序列和信息交换的“请求响应”模式。
集群误差容忍:提供基于接口方法的透明远程过程调用,包括多协议支持和集群支持,如软负载平衡、故障容忍、地址路由、动态配置等。
自动检测:基于注册中心目录服务,使服务消费者能够动态搜索服务提供者,使地址透明,并使服务提供者能够顺利增加或减少机器。
调用过程图:

1.Proxy持有一个Invoker对象,使用Invoker调用
2.在通过集群重载后,错误未能重试
3.调用Directory获取远程服务的Invoker列表
4.负载均衡
如果用户配置路由规则,则通过筛选路由规则获取的传票人列表
用户没有配置路由规则或配置路由后还有很多节点,则使用LoadBalance方法做负载均衡,选用一个可以调用的Invoker
5.通过滤波链,它通常处理上下文、限制流量、计数等。
将使用客户进行数据传输
7.创建私有化协议(代码)
8.进行序列化
9.服务器接收此请求请求并将其分配给 ThreadPool进行处理
10.服务器处理这些请求
11.按请求搜索相应的出口商
12.在服务提供商的末端进行筛选链
然后找到接口实现和实际调用,返回所要求的结果

1.双向单长度连接和非同步NIO通信适用于大量和少量同时数据的服务调用,消费者比提供商大得多。 传输协议TCP,逆转,希斯sian序列
2.rmi采用JDK标准的rmi协议实现,传输参数和返回参数对象需要实现Serializable 接口,使用Java标准序列机制,使用阻塞式短连接,混合传输包大小,消费者和供应商的数量是相似的,可传文件,传输协议 TCP。多个短连接,TCP 协议传输,同步传输,适用于传统的远程服务调用和rmi互操作.在低版本的Common-Collections包中,在Java序列中存在安全漏洞
3.基于WebService远程调用协议的Webservice,综合CXF实现,提供与本地WebService的互操作性。多个短连接,基于HTTP传输,同步传输,适用于系统集成和多语调用;
4.基于Http表格提交的http远程调用协议,使用Spring的HttpInvoke是可用的。多个短连接,传输协议HTTP,传入参数大小混合,提供者数量超过撤销者数量,需要应用程序和浏览器JS调用
5.hessian集成 Hessian 服务,基于HTTP通信,使用伺服曝光服务,Dubbo嵌入Jetty作为服务器时间默认实现,提供与Hession服务的互操作性。多个短连接,同步HTTP传输,希斯sian序列,传入参数较大,提供者大于消费者,提供者压力较大,可传文件;
6.memcache基于 memcached 实现的 RPC 协议
7.redis基于 redis 实现的 RPC 协议

责任链模式:
责任链模式在杜博发挥的作用十分重要。它就像杜博的框架骨架。杜博的电话链组织采用责任链模型进行联系.责任链中的每个节点实现一个滤波接口,然后通过 ProtocolFilterWrapper,连接所有滤波器。许多Dubbo的功能都通过滤波扩展实现,例如, 监控 、 日志 、 缓存 、 安全 、 电话网和RPC本身.
观察者模式:
Dubbo中使用观察者模式最典型的例子是RegistryService。消费者在初始化的时候回调用subscribe方法,注册一个观察者,如观察员所引用的服务地址名单发生更改,就会通过NotifyListener通知消费者。此外,Dubbo的InvokerListener和ExporterListener也实现了观察模式,只要实现该接口,并注册,就可以接收到consumer端调用refer和provider端调用export的通知。
修饰器模式:
Dubbo也使用了很多修改模式。例如, ProtocolFilterWrapper 类是 Protocol 类的修改。在出口和参照方法中,配合责任链模式,将滤波器组成责任链,对协议函数进行修改.其他包括 ProtocolListenerWrapper 、 ListenerInvokerWrapper 和 InvokerWrapper 。
工厂方法模式:
基于工厂方法模型的缓存工厂的实现.CacheFactory接口定义了 getCache方法,然后定义一个抽象的CacheFactory抽象类来实现CacheFactory,并分开createCache方法来创建一个缓存,并设置为抽象方法。这将指定缓存的创建交给指定子类完成。
抽象工厂模式:
ProxyFactory及其子类是Dubbo中使用的抽象工厂模型的典型例子。ProxyFactory提供两种方法,分别用来生产Proxy和Invoker(这两个方法签名看起来有些矛盾,因为getProxy方法需要调用器对象的输入,getInvoker方法需要传递一个代理对象,看起来它会形成一个依赖循环,但事实上,两种使用场景的方式是不同的。AbstractProxyFactory实现ProxyFactory接口,作为特定实现类的抽象母语.然后定义了两个特定的类JdkProxyFactory和 JavassistProxyFactory,分别用来生产基于jdk代理机制和基于javassist代理机制的Proxy和Invoker。
适配器模式:
允许用户根据自己的需要选择日志组件,Dubbo有自己的 Logger接口,它还提供相应的适配器,用于通用的log组件(包括jcl, jdk, log4j, slf4j)。并提供一个使用简单的工厂模式的 LoggerFactory,客户可以创建抽象的杜博自定义的记录器,不需要担心实际使用的日志组件类型。当 LoggerFactory被初始化时,客户端通过设置系统变量来选择他/她使用的日志组件,这提供了很大的灵活性。
代理模式:
Dubbo consumer使用Proxy类创建远程服务的本地代理,本地代理实现和远程服务一样的接口,并且屏蔽了网络通信的细节,使得用户在使用本地代理的时候,感觉和使用本地服务一样。
多个版本可以通过Dubbo配置中的版本版本直接控制。
比如:
老版本 version=1.0.0, 新版本version=1.0.1

1.通过ServiceConfig分析标签,创建一个 dubbo标签分析器来分析 dubbo标签,并完成容器创建后,触发ContextRefreshEvent事件调用,开始显示服务
2.通过ProxyFactory.getInvoker方法,并使用 javassist或DdkProxyFactory来执行动态代理,将服务暴露的接口封入调用器对象中,它包含执行方法的对象信息和具体的URL地址。
3.再通过DubboProtocol的实现把包装后的invoker转换成exporter,
4.然后启动服务器服务器并听出端口
5.最后,RegistryProtocol将URL地址和调用器的映射关系保存到服务中心

1.首先,客户端根据配置文件信息从注册中心订阅服务。首先,它将完全在本地缓存,随后的更新将在本地监测动态更新。
2.之后DubboProtocol根据provider的地址和接口信息连接到服务端server,开启客户端client,然后创建invoker
3.之后通过invoker为服务接口生成代理对象,这个代理对象用于远程调用provider,至此完成了服务引用


Zookeeper、Redis、Multicast、Simple 等都可以作为Dubbo的注册中心
SPI(Service Provider Interface),服务发现机制,实际上是将结构的实现类写入配置中,安装服务时单独配置文件,加载实现类,所以当它运行时,动态帮助接口替换实现类.
Dubbo的SPI其实是对java的SPI进行了一种增强,可以按需加载实现类之外,增加了 IOC 和 AOP 的特性,还有自适应扩展机制。
SPI在 dubbo中广泛使用,包括协议扩展、集群扩展、路由扩展、序列化扩展等等。
Dubbo文件目录的配置分为三个类别。
1.META-INF/services/ Directory:这个目录下的SPI配置文件旨在与Java SPI兼容。
2.META-INF/dubbo/目录:这个目录存储用户定义的SPI配置文件。
3.META-INF/dubbo/internal/目录:这个目录存储在Dubbo中使用的SPI配置文件。

Java Spi
Java SPI在搜索扩展实现类时导航SPI配置文件,并将指定整个实现类
Dubbo Spi
1以扩展Dubbo而不更改Dubbo的源代码
2, 延迟装载, 只能装载您想要装载的一个扩展实现.
3,增加了对扩展点 IOC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。
4,Dubbo的扩展机制有利于支持第三方IOC容器,默认支持Spring Bean。
额外的随机性:例如,我们有三个服务器[A,B,C],我们设置它们为[4,5,6],然后我们说这些三个数字是水平线上的平整,和15。
然后在15分钟内生成一个随机数,0到4是服务器A,4到9是服务器B,9到15是服务器C

2.最小有效号码:每个服务提供者都符合一个有效号码,初始情况下,所有服务提供商的活数为零。每收到一个请求,活跃数加1,完成请求后, 活数将减少到1.服务运行一段时间后,好的服务提供者能更快地处理请求,因此,活性物质的数量越快减少,就越快,在此情况下,这些服务提供者可以优先访问新的服务请求。

3.一致性 Hash:
首先,找到 thememcached服务器(节点)的 hashes值,并将其放在0-2的32维连续圆上。
然后使用相同的方法来找到存储数据的键的哈希值,并将其映射到同一个圆。
然后从数据映射的位置开始按时搜索,然后将数据保存到第一个找到的服务器上。 如果32个方面中2个以上仍无法找到服务器,它将存储在第一个备忘录服务器上。

4.加权轮询:比如我们有三台服务器[A, B, C],给他们设置权重为[4, 5, 6],那么假如总共有15次请求,那么会有4次落在A服务器,5次落在B服务器,6次落在C服务器。

1.Failover Cluster失败自动切换:dubbo的默认容错方案,当调用失败时自动切换到其他可用的节点,具体的重试次数和间隔时间可用通过引用服务的时候配置,默认重试次数为1是只调用一次。
2.Failback Cluster失败自动恢复:在调用失败,记录日志和调用信息,然后返回空结果给consumer,并且通过定时任务每隔5秒对失败的调用进行重试
3.Failfast Cluster fast failure:只调用一次,在失败后立即抛出异常
4.Failsafe Cluster Failsafe:调用异常,日志不被抛出,返回空的结果
5.Forking Cluster并行调用多个服务提供者:通过线程池创建多个线程,并发调用多个provider,结果保存到阻塞队列,只要有一个provider成功返回了结果,就会立刻返回结果
6.广播集群广播模式:每个提供者被调用一次,如果其中一个提供者报告了一个错误,则在循环调用后将投出一个例外。
分层图:

在广义上,dubbo分为三个层次
业务逻辑层由我们提供用于接口和实现以及一些配置信息
RPC层是实际RPC调用的核心层,包括整个RPC调用过程、负载平衡、集群容忍、代理
删除是网络传输协议和数据转换的加密。
Service和Config两层可以认为是API层,主要提供给API使用者,使用者只需要配置和完成业务代码就可以了。
所有后来的层都是SPI层,主要的功能是提供给扩展器,主要用于杜博的第二个开发扩展。
更详细的层是图中的十层模式。
服务故障引发了基于 Zookeeper 的临时节点原则.
Zookeeper中节点是有生命周期的,具体的生命周期取决于节点的类型,节点主要分为持久节点(Persistent)和临时节点(Ephemeral) 。

事实上,它主要是对调用细节进行capsulation,使调用远程方法简化为调用本地方法,并改进一些其他方面,如负荷平衡、误差容忍机制、滤波操作和调用数据的统计。
关于这个问题,其实核心考察点就是你对于RPC框架的理解,一个成熟的RPC框架可以完成哪些功能,其实当我们看过一两个RPC框架后,就可以对这个问题回答个七七八八了,我们来举个例子。

1.首先,我们需要一个登记中心来管理消费者和提供者节点信息,以便消费者和提供者可以订阅和登记服务。
2.当有了注册中心后,可能会有很多个provider节点,那么我们肯定会有一个负载均衡模块来负责节点的调用,至于用户指定路由规则可以使一个额外的优化点。
3.特定电话肯定需要连接到通信协议,因此需要一个模块加密通信协议,网络传输也考虑序列化。
4.当调用失败后怎么去处理?所以我们还需要一个容错模块,来负责失败情况的处理。
5.事实上,这些基本模型已经建立,而且我们还可以有更多的优化点,如一些请求数据监控、配置信息处理、日志信息处理等。
这实际上是一个相对基本的RPC框架的一般概念,你们有吗?
本文由 在线网速测试 整理编辑,转载请注明出处。