⑴ bbo有哪些负载均衡算法怎么实现的负载均衡算法bbo有几层
常见的有LVS、Nginx和HAProxy,者者介绍分别如下:
LVS:使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability),感谢章文嵩博士为我们提供如此强大实用的开源软件。
LVS的特点是:
1、抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;
2、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;
3、工作稳定,自身有完整的双机热备方案;
4、无流量,保证了均衡器IO的性能不会收到大流量的影响;
5、应用范围比较广,可以对所有应用做负载均衡;
6、软件本身不支持正则处理,不能做动静分离。
Nginx的特点是:
1、工作在网络的7层之上,可以针对http应用做一些分流的策略;
2、Nginx对网络的依赖非常小;
3、Nginx安装和配置比较简单,测试起来比较方便;
4、可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;
5、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等;
6、Nginx仅能支持http和Email;
HAProxy的特点是:
1、HAProxy是支持虚拟主机的;
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;
3、支持url检测后端的服务器出问题的检测会有很好的帮助;
4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;
5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS;
6、HAProxy的算法多;
⑵ 史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官!
Dubbo是阿里巴巴开源的高性能RPC分布式服务框架,现已成为Apache基金会孵化项目。使用Dubbo可以将核心业务抽取为服务,形成稳定的服务中心,提高业务复用性和灵活性,应对市场多变需求。Dubbo内部使用了Netty和Zookeeper,确保高性能和高可用性。
选择Dubbo的原因在于它是阿里开源项目,广泛应用于国内互联网公司,经过线上考验。使用Dubbo可以提高业务复用和扩展性,实现分布式架构,以应对更大并发流量。以下是Dubbo的核心特点和部分面试问题答案:
1. Dubbo是什么?
Dubbo是基于java的高性能RPC分布式服务框架。
2. 为什么要用Dubbo?
Dubbo是阿里开源项目,具有高可用性和性能,适用于分布式架构,能够提高业务复用性和扩展性。
3. Dubbo和Spring Cloud的区别?
Dubbo和Spring Cloud在通信方式、组成部分和特定功能上有所不同。
4. Dubbo支持哪些协议?
Dubbo支持多种协议,推荐使用RPC通信。
5. Dubbo需要Web容器吗?
不需要,使用Web容器只会增加复杂性并浪费资源。
6. Dubbo内置了哪些服务容器?
Dubbo使用简单的Spring容器来暴露服务。
7. Dubbo有哪些节点角色?
节点角色包括提供者、消费者、注册中心、监控中心和容器。
8. 画出服务注册与发现流程图。
服务注册与发现流程图展示了Dubbo服务注册中心的运作。
9. Dubbo使用什么注册中心?
推荐使用Zookeeper作为注册中心,还有其他选择。
10. Dubbo的配置方式有哪些?
Dubbo支持Spring配置和Java API配置。
11. Dubbo的核心配置有哪些?
核心配置包括服务、引用、协议、应用、模块、注册中心、监控中心、提供者和消费者等。
12. 在Provider上可以配置哪些Consumer端属性?
可以配置超时、重试次数、负载均衡算法和并发限制。
13. Dubbo启动时依赖服务不可用会怎样?
Dubbo会在启动时检查依赖服务,不可用时抛出异常。
14. Dubbo推荐的序列化框架有哪些?
推荐Hessian序列化,还有Duddo、FastJson和Java序列化。
15. Dubbo的通信框架?
默认使用Netty框架,集成有Mina、Grizzly等。
16. Dubbo的集群容错方案有哪些?
包括失败自动切换、快速失败、失败安全、失败自动恢复和并行调用等。
17. Dubbo的负载均衡策略有哪些?
包括随机、轮询、最少活跃调用数和一致性Hash。
18. 多个服务注册时如何测试特定服务?
可以配置环境点对点直连,绕过注册中心。
19. Dubbo支持多协议吗?
支持配置多协议,允许在同一服务上使用多种协议。
20. 多种服务实现同一接口时如何处理?
使用group属性分组,服务提供方和消费方都指定同一group。
21. 如何兼容旧版本?
使用版本号过渡,多个不同版本服务注册,版本号不同不引用。
22. Dubbo支持缓存吗?
提供声明式缓存加速访问。
23. Dubbo服务调用是阻塞的吗?
默认阻塞,支持异步调用。
24. Dubbo支持分布式事务吗?
暂不支持,可能通过JTA/XA规范实现。
25. Dubbo telnet命令的作用?
用于服务治理,具体使用请参考文章。
26. Dubbo支持服务降级吗?
2.2.0以上版本支持。
27. 如何优雅停机?
通过JDK的ShutdownHook完成,强制关闭不会执行。
28. 服务失效踢出原理?
基于Zookeeper的临时节点原理。
29. 解决服务调用链过长?
使用Pinpoint和Apache Skywalking实现分布式服务追踪。
30. 服务读写容错策略?
读操作建议使用失败自动切换,写操作快速失败。
31. Dubbo必须依赖的包?
必须依赖JDK,其他为可选。
32. 管理控制台功能?
包含路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡等功能。
33. Dubbo服务暴露过程?
Spring实例化bean后,在容器刷新最后一步发布事件,通知ServiceBean回调事件方法,实现服务发布。
34. Dubbo的维护状态?
2014年后停止维护,17年开始重新维护并进入Apache项目。
35. Dubbo和Dubbox的区别?
Dubbox是当当网基于Dubbo的扩展项目,增加了服务调用的RESTful特性等。
36. 其他分布式框架?
还有Spring Cloud、Facebook的Thrift、Twitter的Finagle等。
37. Dubbo能集成Spring Boot吗?
可以集成,项目地址为Apache Dubbo的GitHub仓库。
38. 遇到的问题?
在大数据量下性能不佳,建议使用RMI或HTTP协议。
39. 阅读Dubbo源码?
了解Dubbo原理需要阅读源码,网上有教程可供参考。
40. Dubbo和Spring Cloud的评价?
Spring Cloud组件频繁更新,配置复杂,与Dubbo相比,个人更倾向于使用Dubbo。
以上内容涵盖了Dubbo的常见面试问题和使用细节,希望对大家有所帮助。
⑶ Java教程:bbo源码解析-网络通信
在之前的内容中,我们探讨了消费者端服务发现与提供者端服务暴露的相关内容,同时了解到消费者端通过内置的负载均衡算法获取合适的调用invoker进行远程调用。接下来,我们聚焦于远程调用过程,即网络通信的细节。
网络通信位于Remoting模块中,支持多种通信协议,包括但不限于:bbo协议、rmi协议、hessian协议、http协议、webservice协议、thrift协议、rest协议、grpc协议、memcached协议、redis协议等。每种协议具有独特的特点和应用场景。
其中,bbo协议采用单一长连接和 NIO 异步通讯方式,适用于小数据量大并发的服务调用场景,以及服务消费者机器数远大于服务提供者机器数的情况。它基于 mina1.1.7 和 hessian 3.2.1 的 tbremoting 交互实现。
rmi协议基于JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式。Hessian协议用于集成Hessian的服务,底层采用Http通讯,通过Servlet暴露服务,Dubbo内置Jetty作为服务器实现。Hessian协议可以与原生Hessian服务互操作。
基于HTTP表单的远程调用协议(http协议)采用Spring的HttpInvoker实现,可以与原生HTTP服务互操作。基于WebService的远程调用协议(webservice协议)基于Apache CXF实现,同样可以与原生WebService服务互操作。
thrift协议当前支持的扩展了thrift原生协议,增加了额外的头信息,如serviceName、magic number等。rest协议基于标准的Java REST API实现,JAX-RS 2.0(Java API for RESTful Web Services的简写)用于支持REST调用。grpc协议自Dubbo 2.7.5版本开始支持,适合HTTP/2通信场景,利用gRPC带来的Stream、反压、Reactive编程能力。
memcached协议基于memcached实现的RPC协议,而redis协议基于Redis实现的RPC协议。
在序列化方面,序列化是将对象转成字节流以用于网络传输及将字节流转为对象的过程。序列化的优势包括安全性更好、跨平台等。Dubbo基于netty进行网络通讯,NettyClient.doOpen()方法中可以看到Netty的相关类。序列化接口包括但不限于:Serialization接口、Hessian2Serialization接口、Kryo接口、FST接口等。
序列化方式如Kryo和FST,性能往往优于hessian2,能够显着提高序列化性能。这些高效Java序列化方式的引入,可以优化Dubbo的序列化过程。
在配置Dubbo RPC时,引入Kryo和FST非常简单,只需在RPC的XML配置中添加相应的属性即可。
关于服务消费方发送请求,Dubbo框架定义了私有的RPC协议,消息头和消息体分别用于存储元信息和具体调用消息。消息头包括魔数、数据包类型、消息体长度等。消息体包含调用消息,如方法名称、参数列表等。请求编码和解码过程涉及编解码器的使用,编码过程包括消息头的写入、序列化数据的存储以及长度的写入。解码过程则涉及消息头的读取、序列化数据的解析以及调用方法名、参数等信息的提取。
提供方接收请求后,服务调用过程包含请求解码、调用服务以及返回结果。解码过程在NettyHandler中完成,通过ChannelEventRunnable和DecodeHandler进一步处理请求。服务调用完成后,通过Invoker的invoke方法调用服务逻辑。响应数据的编码与请求数据编码过程类似,涉及数据包的构造与发送。
服务消费方接收调用结果后,首先进行响应数据解码,获得Response对象,并传递给下一个处理器NettyHandler。处理后,响应数据被派发到线程池中,此过程与服务提供方接收请求的过程类似。
在异步通信场景中,Dubbo在通信层面为异步操作,通信线程不会等待结果返回。默认情况下,RPC调用被视为同步操作。Dubbo通过CompletableFuture实现了异步转同步操作,通过设置异步返回结果并使用CompletableFuture的get()方法等待完成。
对于异步多线程数据一致性问题,Dubbo使用编号将响应对象与Future对象关联,确保每个响应对象被正确传递到相应的Future对象。通过在创建Future时传入Request对象,可以获取调用编号并建立映射关系。线程池中的线程根据Response对象中的调用编号找到对应的Future对象,将响应结果设置到Future对象中,供用户线程获取。
为了检测Client端与Server端的连通性,Dubbo采用双向心跳机制。HeaderExchangeClient初始化时,开启两个定时任务:发送心跳请求和处理重连与断连。心跳检测定时任务HeartbeatTimerTask确保连接空闲时向对端发送心跳包,而ReconnectTimerTask则负责检测连接状态,当判定为超时后,客户端选择重连,服务端采取断开连接的措施。
⑷ bbo十层架构
Dubbo简介Dubbo是Alibaba开源的分布式服务框架,它按照分层的方式来架构,使用这种方式可以使各层解耦。
Dubbo在调用远程的服务的时候再本地有一个接口,就想调用本地方法一样去调用,底层实现好参数传输和远程服务运行结果传回之后的返回。
Dubbo的特点:
(1)它主要使用高效的网络框架和序列化框架,让分布式服务之间调用效率更高。
(2)采用注册中心管理众多的服务接口地址,当你想调用服务的时候只需要跟注册中心询问谈歼瞎即可,不像使用WebService一样每个服务都得记录好接口调用方式。
(3)监控中心时实现服务方和调用方之间运行状态的监控,还能控制服务的优先级、权限、权重、上下线等,让整个庞大的分布式服务系统的维护和治理比较方便。
(4)高可用,如果有服务挂了,注册中心就会从服务列表去掉该节点,客户端会像注册中心请求另一台可用的服务节点重新调用。同时注册中心也能实现高可用(ZooKeeper)。
(5)负载均衡,采用软负载均衡算法实现对多个相同服务的节点的请求负载均衡。
Dubbo需要四大基本组件:Rigistry,Monitor,Provider,Consumer。
1、含空监控中心的配置文件-bbo.properties文件
(1)容器改改,监控中心是在jetty和spring环境下运行,依赖于注册中心,日志系统是log4j
??bbo.container=log4j,spring,registry,jetty
(2)监控服务的名称,监控系统对整个Dubbo服务系统来说也是一个服务
??bbo.application.name=simple-monitor
(3)服务的所有者,这是Dubbbo的服务的功能,可以指定服务的负责人
??bbo.application.owner=coselding
(4)注册中心的地址,配置后监控中心就能通过注册中心获取当前可用的服务列表及其状态,在页面向你汇报Dubbo中的服务运行情况。
??bbo.registr.address=multicast://{ip}:{port}//广播
???bbo.registr.address=zookeeper://{ip}:{port}//zookeper
???bbo.registr.address=redis://{ip}:{port}//redis
???bbo.registr.address=bbo://{ip}:{port}//bbo
(5)bbo协议端口号
??bbo.protocol.port=7070
(6)jetty工作端口号
??bbo.jetty.port=8082
(7)工作目录,用于存放监控中心的数据
??bbo.jetty.directory=${user.home}/monitor
(8)监控中心报表存放目录
???bbo.charts.directory=${bbo.jetty.directory}/charts
(9)监控中心数据资料目录
???bbo.statistics.directory=${user.home}/monitor/statistics
(10)监控中心日志文件路径
???bbo.log4j.file=logs/bbo-monitor-simple.log
(11)监控中心日志记录级别
???bbo.log4j.level=WARN
2、Dubbo提供负载均衡方式
(1)Random,随机,按权重配置随机概率,调用量越大分布越均匀,默认方式。
(2)RounRobin,轮询,按权重设置轮询比例,如果存在比较慢的机器容易在这台机器上请求阻塞较多。
(3)LeastActive,最少活跃调用数,不支持权重,只能根据自动识别的活跃数分配,不能灵活调配。
(4)ConsistenHash,一致性hash,对相同参数的请求路由到一个服务提供者上,如果有类似灰度发布需求可采用。
3、Dubbo过滤器
Dubbo初始化过程加载ClassPath下的META-INF/bbo/internal/,META-INF/bbo/,META-INF/services/三个路径下的com.alibaba.bbo.rpc.Filter文件。文件内容:
??Name=FullClassName,这些类必须实现Filter接口。
自定义Filter类:
配置文件在配置过滤器,consumer.xml中:
Dubbo对过滤器的加载过程:
??先加载三个路径下的com.alibaba.bbo.rpc.Filter文件里面的键值对,key为过滤器名称,value为过滤器的类的全限定名(这个类必须实现Dubbo中的Filter接口)。
??自定义的类中@Active注解是过滤器设定的全局基本属性。
??Spring在加载consumer.xml文件时,通过bbo:consumerfilter="xxx"id="xxx"retrries="0"这个配置指定消费者端要加载的过滤器,通过filter属性指定过滤器名称。
@Activate注解-自动激活,group属性是表示匹配了对应的角色才被加载,value表示表明过滤条件,不写则表示所有条件都会被加载,写了则只有bboURL中包含该参数名且参数值不为空才被加载,这个参数会以bbo协议的一个参数K-V对传到Provider。
4、Dubbo的Provider配置
5、Dubbo的Consumer配置
1、Dubbo是什么?
Dubbo是阿里巴巴开源的基于Java的高性能RPC分布式框架。
2、为什么使用Dubbo?
很多公司都在使用,经过很多线上的考验,内部使用了Netty,Zookeeper,保证了高性能可用性。
使用Dubbo可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可以提高业务复用灵活性扩展,使前端应用能快速的响应对边的市场需求。分布式架构可以承受更大规模的并发流量。
Dubbo的服务治理图:
3、Dubbo和SpringCloud的区别
两个没有关联,但是非要说区别,有如下几点:
(1)通信方式不同,Dubbo使用RPC通信,SpringCloud使用HTTPRestful方式
(2)组成部分不同
4、Dubbo支持的协议
bbo://?(推荐);rmi://;hessian://;http://;webservice://;thrift://;memcached://;redis://;rest://。
5、Dubbo需要容器吗?
不需要,如果硬要容器的话,会增加复杂性,同时也浪费资源。
6、Dubbo内置的服务容器
SpringContainer;JettyContainer;Log4jContainer。
7、Dubbo中节点角色
Register,Monitor,Provider,Consumer,Container(服务运行的容器)。
8、Dubbo的服务注册和发现的流程图
9、Dubbo的注册中心
默认使用Zookeper作为注册中心,还有Redis,Multicast,bbo注册中心。
10、Dubbo的配置方式
Spring配置方式和JavaAPI配置方式
11、Dubbo的核心配置
(1)bbo:service服务配置
(2)bbo:referece引用配置
(3)bbo:protocol协议配置
(4)bbo:application应用配置
(5)bbo:registry注册中心配置
(6)bbo:monitor监控中心配置
(7)bbo:provider提供方配置
(8)bbo:consumer消费方配置
(9)bbo:method方法配置
(10)bbo:argument参数配置
12、在Provider节点上可以配置Consumer端的属性有哪些?
(1)timeout:方法调用超时
(2)retries:失败重试次数,默认是2次
(3)loadbalance:负载均衡算法,默认随机
(4)actives消费者端,最大并发调用控制
13、Dubbo启动时如果依赖的服务不可用会怎样
Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。默认check="true"。
14、Dubbo序列化框架
推荐使用Hessian序列化,还有Dubbo,FastJson,Java自带序列化。
15、Dubbo的通信框架
默认使用Netty框架,另外也提供了Mina,Grizzly。
16、Dubbo集群容错方案
(1)FailoverCluster,失败自动切换,自动重试其他服务器。
(2)FailfastCluster,快速失败,立即报错,只发起一次调用。
(3)FailsafeCluster,失败安全,出现异常时,直接忽略。
(4)FailbackCluster,失败自动恢复,记录失败请求,定时重发。
(5)ForkingCluster,并行调用多个服务器,只要一个返回成功即可。
(6)BroadcastCluster,广播逐个调用所有提供者,任意一个报错则报错。
17、Dubbo的负载均衡策略
(1)RandomLoadBalance,随机,按权重设置随机概率,默认。
(2)RoundRobinLoadBalace,轮询,按公约后的权重设置轮训比例。
(3)LeastActiveLoadBalace,最少活跃调用数,相同活跃数的随机。
(4)ConsistenHashLoadBalance,一致性hash,相同参数的请求总是发到用一个服务器。
18、指定某一个服务
可以配置环境点对点直连,绕过注册中心,将以服务接口为单位,忽略注册中心的提供者列表。
bbo:referenceinterface="com.weidian.bbo.IMyDemo"version="1.0"id="myDemo"url="bbo://127.0.0.1:20880/"/bbo:reference
19、Dubbo多协议
Dubbo允许配置多协议,在不同服务器上支持不同协议,或者同一服务支持多种协议。
20、当一个服务有多种实现时怎么做?
当一个接口有多种是现实,可以用group属性来分组,服务提供方和消费方都指定同一个group即可。
21、兼容旧版本
使用版本号过度,多个不同版本的服务注册到注册中心,版本号不同的服务相互间不引用。
22、Dubbo可以缓存吗?
Dubbo提供声明式缓存,用于加速热门数据的访问速度,以减少用户加缓存的工作量。
23、Dubbo服务之间的调用时阻塞的吗?
默认是同步等待结果阻塞的,支持异步调用。Dubbo是基于NIO的非阻塞实现并行调用的,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个Future对象。
24、Dubbo不支持分布式事务
25、Dubbo必须依赖的包
Dubbo必须依赖JDK,其他为可选。
26、Dubbo使用过程中的问题
Dubbo的设计目的是为了满足高并发小数据量的rpc请求,在大数据量下性能表现不是很好,建议使用rmi或http协议。
27、Dubbo的管理控制台的作用
路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡。
28、Springboot整合Dubbo
(1)添加依赖
????????!----
????dependency
??????groupIdcom.alibaba.boot/groupId
??????artifactIdbbo-spring-boot-starter/artifactId
??????version0.1.0/version
????/dependency
????!----
????dependency
??????groupIdcom.101tec/groupId
??????artifactIdzkclient/artifactId
??????version0.10/version
????/dependency
(2)配置bbo
????##Dubbo服务提供者配置
????spring.bbo.application.name=provider
????spring.bbo.registry.address=zookeeper://127.0.0.1:2181
????spring.bbo.protocol.name=bbo
????spring.bbo.protocol.port=20880
????spring.bbo.scan=org.spring.springboot.bbo
????##Dubbo服务消费者配置
????spring.bbo.application.name=consumer
????spring.bbo.registry.address=zookeeper://127.0.0.1:2181
????spring.bbo.scan=org.spring.springboot.bbo
Dubbo分布式服务框架介绍随着业务的发展、用户量的增长、系统并发访问需求越来越大,系统数量增多,调用依赖关系也变得复杂,为了确保系统高可用、高并发的要求,系统的架构也从单体时代慢慢迁移至服务SOA时代,根据不同服务对系统资源的要求不同,我们可以更合理的配置系统资源,使系统资源利用率最大化。而Dubbo则是SOA服务化治理方案的一个核心框架。
Dubbo作为阿里巴巴内部的SOA服务化治理方案的核心框架,在2012年时已经每天为2000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。Dubbo自2011年开源后,已被许多肢启知非阿里系公司使用,其中既有当当网、网易考拉等互联网公司,也有中国人寿、青岛海尔等传统企业。
Dubbo是一个高性能服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,使得应用可通过高性能RPC实现服务的输出和输入功能,和Spring框架可以无缝集成。
作为一个分布式服务框架,以及SOA治理方案,Dubbo其功能主要包括:
Dubbo最大的特点是按照分层架构思维构建应用服务,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。
Dubbo包含远程通讯、服务集群和服务发现与注册三个核心部分。提供透明化的远程方法调用,实现像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。同时具备软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。可以实现服旁则务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
Dubbo服务组件调用关秕说明:
Dubbo框架设计一共划分了10个层,而最上面的Service层是留给实际想要使用Dubbo开发分布式服务的开发者实现业务逻辑的接口层。图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为历消双方都用到的接口。
下面,结合Dubbo官方文档,我们分别理解一下框架分层架构中,各个层次的设计要点:
从上图可以看出,Dubbo对于服务提供方和服务消费方,从框架的10层中分别提供了各自需要关心和扩展的接口,构建整个服务生态系统(服务提供方和服务消费方本身就是一个以服务为中心的)。
根据官方提供的,对于上述各层之间关系的描述,如下所示:
说说Dubbo的分层?
从?的范围来说,bbo分为三层,
business业务逻辑层由我们??来提供接?和实现还有?些配置信息;
RPC层就是真正的RPC调?的核?层,封装整个RPC的调?过程、负载均衡、集群容错、代理,
remoting则是对?络传输协议和数据转换的封装。划分到更细的层?,就是图中的10层模式,整个分层依赖由上?下,除开business业务逻辑之外,其他的?层都是SPI机制。
如何更好地学习bbo源代码一、Dubbo整体架构
1、Dubbo与Spring的整合
Dubbo在使用上可以做到非常简单,不管是Provider还是Consumer都可以通过Spring的配置文件进行配置,配置完之后,就可以像使用
springbean一样进行服务暴露和调用了,完全看不到bbo
api的存在。这是因为bbo使用了spring提供的可扩展Schema自定义配置支持。在spring配置文件中,可以像、这样进行配置。
META-INF下的spring.handlers文件中指定了bbo的xml解析类:DubboNamespaceHandler。像前面的被解
析成ServiceConfig,被解析成ReferenceConfig等等。
2、jdkspi扩展
由于Dubbo是开源框架,必须要提供很多的可扩展点。Dubbo是通过扩展jdk
spi机制来实现可扩展的。具体来说,就是在META-INF目录下,放置文件名为接口全称,文件中为key、value键值对,value为具体实现类
的全类名,key为标志值。由于bbo使用了url总线的设计,即很多参数通过URL对象来传递,在实际中,具唯睁体要用到哪个值,可以通过url中的参
数值来指定。
Dubbo对spi的扩展是通过ExtensionLoader来实现的,查看ExtensionLoader的源码,可以看到Dubbo对jdkspi做了三个方面的扩展:
(1)jdkspi仅仅通过接口类名获取所有实现,而ExtensionLoader则通过接口类名和key值获取一个实现;
(2)Adaptive实现,就是生成一个代理类,这样搭燃就可以根据实际调用时的一些参数动态决定要调用的类了。
(3)自动包装实现,这种实现的类一般是自动激活的,常用于包装类,比如Protocol的两个实现类:ProtocolFilterWrapper、ProtocolListenerWrapper。
3、url总线设计
Dubbo为了使得各层解耦,采用了url总线的设计。我们通常的设计会把层与层之间的交互参数做成Model,这样层与层之间沟通成本比较大,扩展起来
也比较麻烦。因此,Dubbo把各层之间的通信都采用url的形式。比如,注册中心启动时,参数的url为:
registry://0.0.0.0:9090?codec=registrytransporter=netty
这就表示当前是注册中知山虚心,绑定到所有ip,端口是9090,解析器类型是registry,使用的底层网络通信框架是netty。
二、Dubbo启动过程
Dubbo分为注册中心、服务提供者(provider)、服务消费者(consumer)三个部分。
1、注册中心启动过程
注册中心的启动过程,主要看两个类:RegistrySynchronizer、RegistryReceiver,两个类的初始化方法都是start。
RegistrySynchronizer的start方法:
(1)把所有配置信息load到内存;
(2)把当前注册中心信息保存到数据库;
(3)启动5个定时器。
5个定时器的功能是:
(1)AutoRedirectTask,自动重定向定时器。默认1小时运行1次。如果当前注册中心的连接数高于平均值的1.2倍,则将多出来的连接数重定向到其他注册中心上,以达到注册中心集群的连接数均衡。
(2)DirtyCheckTask,脏数据检查定时器。作用是:分别检查缓存provider、数据库provider、缓存consumer、数据库
consumer的数据,清除脏数据;清理不存活的provider和consumer数据;对于缓存中的存在的provider或consumer而数
据库不存在,重新注册和订阅。
(3)ChangedClearTask,changes变更表的定时清理任务。作用是读取changes表,清除过期数据。
(4)AlivedCheckTask,注册中心存活状态定时检查,会定时更新registries表的expire字段,用以判断注册中心的存活状态。如果有新的注册中心,发送同步消息,将当前所有注册中心的地址通知到所有客户端。
(5)ChangedCheckTask,变更检查定时器。检查changes表的变更,检查类型包括:参数覆盖变更、路由变更、服务消费者变更、权重变更、负载均衡变更。
RegistryReceiver的start方法:启动注册中心服务。默认使用netty框架,绑定本机的9090端口。最后启动服务的过