1.什么是Dubbo?
Dubbo是基于Java的高性能轻量级的RPC分布式服务框架,现已成为 Apache 基金会孵化项目。
2.为什么要使用Dubbo?
随着互联网的快速发展,Web应用程序的规模不断扩大,分布式服务体系结构和流计算体系结构势在必行。
dubbo的优点是:开源免费;一些核心业务被提取并作为独立的服务提供服务,逐渐形成一个稳定的服务中心,这样前端应用程序就可以更好地响应变化多端的市场需求;分布式框架能承受更大规模的流量;内部基于netty性能高。
3.Dubbo提供了哪3个关键功能?
基于接口的远程调用
容错和负载均衡
自动服务注册和发现
4.Dubbo服务的关键节点有哪些?
5.Dubbo服务注册流程?
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
6.画一下服务注册流程图。
7.Dubbo架构的特点?
连通性、健壮性、伸缩性、以及向未来架构的升级性。
8.对jdk的最小版本需求?
jdk1.6+
9.注册中心的选择?
一般来说选中Zookeeper ,因为更稳定更合适。
除了Zookeeper还有Redis注册中心、Multicast注册中心、Simple注册中心。
10.Dubbo的核心配置和用途
11.Dubbo支持哪些序列化协议,它们各有什么特点?
Dubbo支持多种序列化协议,每种协议都有其特点:
1、Hessian: 一种简单易用的序列化协议,适用于跨语言调用,但性能和效率居中。
2、Java: 默认的序列化协议,易用但性能较低,不适用于高性能场景。
3、Kryo: 性能高效的序列化协议,但不支持跨语言。
4、FST: 性能类似于Kryo,且更加易用。
5、Protobuf: 谷歌开发的高效、跨语言的序列化协议,适合高性能和跨语言环境。
选择合适的序列化协议取决于具体应用场景,如性能需求、跨语言调用等。
12.Dubbo中的服务治理包括哪些内容?
服务治理是Dubbo框架的重要组成部分,主要包括以下内容:
1、服务注册与发现:管理服务的注册与动态发现。
2、负载均衡:在多个服务提供者之间进行负载均衡。
3、故障转移:在服务调用失败时,提供故障转移机制。
4、服务监控:监控服务调用次数、调用时间等信息。
5、路由规则:根据规则路由调用请求到指定服务。
6、配置管理:动态配置服务参数。
这些内容共同构成了Dubbo的服务治理机制,确保了服务的高效运行和可靠性。
13.Dubbo支持哪些负载均衡策略?
Dubbo支持多种负载均衡策略,主要包括:
1、随机(Random): 随机选择一个服务提供者。
2、轮询(Round Robin): 按顺序轮流选择服务提供者。
3、最少活跃调用数(Least Active): 选择活跃调用数最少的服务提供者。
4、一致性哈希(Consistent Hash): 基于调用参数的哈希值选择服务提供者。
不同的负载均衡策略适用于不同的应用场景,选择合适的策略可以提高服务的处理效率和系统的稳定性。
14.Dubbo的服务容错机制主要包括哪些?
Dubbo的服务容错机制主要包括以下几种:
1、Failover: 当服务调用失败时,自动切换到其他服务器重试。
2、Failfast: 快速失败,只发起一次调用,失败立即报错。
3、Failsafe: 失败安全,出现异常时,直接忽略。
4、Failback: 失败自动恢复,后台记录失败请求,定时重发。
5、Forking:并行调用多个服务器,只要一个成功即返回。
6、Broadcast:广播调用所有提供者,逐个调用,任意一台报错则报错。
这些容错机制提高了服务的可用性和稳定性,适用于不同的业务需求和场景。
15.Dubbo中,如何实现服务的版本控制?
在Dubbo中,服务的版本控制可以通过以下方式实现:
1、版本号定义: 在服务提供者和消费者的配置中,指定服务的版本号。
2、版本匹配: 消费者在调用服务时,会请求匹配其版本号的服务。
3、多版本并行:可以同时运行多个不同版本的服务,以实现平滑升级和兼容性测试。
服务版本控制使得在服务升级和维护过程中,减少对消费者的影响,提高系统稳定性。
16.Dubbo默认使用什么协议?
Dubbo缺省的默认协议是自身的dubbo协议,采用的是单一长连接和NIO异步通信的方式,适用于小数据量以及大并发的服务调用,消费者远大于提供者,Dubbo的传输层协议TCP,异步的,使用Hessian序列化。
17.Dubbo 支持哪些协议,每种协议的应用场景,优缺点?
dubbo:Dubbo缺省协议是dubbo协议,采用的是单一长连接和NIO异步通信的方式,适用于小数据量以及大并发的服务调用,消费者远大于提供者,Dubbo的传输层协议TCP,异步的,使用Hessian序列化。
rmi(remote Method invocation):采用的是我们的JDK标准的rmi的实现,传输以及返回参数的时候都需要实现Serializable接口,使用java标准的序列化机制,使用的是阻塞式的短连接,传输数据包可以大小混合,并且我们的消费者与提供者可以差不多数量,可以传文件。传输协议TCP,同步传输,适用于常规的远程服务调用以及rmi的相互操作。序列化安全漏洞。
webservice:基于 WebService 的远程调用协议,集成 CXF 实现,提供和原生 WebService 的互操作。多个短连接,基于 HTTP 传输,同步传输,适用系统集成和跨语言调用;
http:基于 Http 表单提交的远程调用协议,使用 Spring 的 HttpInvoke 实现。多个短连接,传输协议 HTTP,传入参数大小混合,提供者个数多于消费者,需要给应用程序和浏览器 JS 调用;
hessian:集成 Hessian 服务,基于 HTTP 通讯,采用 Servlet 暴露服务,Dubbo 内嵌 Jetty 作为服务器时默认实现,提供与 Hession 服务互操作。多个短连接,同步 HTTP 传输,Hessian 序列化,传入参数较大,提供者大于消费者,提供者压力较大,可传文件;
18.RPC与HTTP的区别?
通过一张图来说明:
19.如何选择RPC与Rest风格的HTTP?
RPC:远程方法调用,远程直接调用你的方法,可以选择Http做为我们的最终协议。Http2.0,
Rest风格的HTTP:Rest风格,可读性好,跨语言,得到防火墙的支持。异构设计,开发快。缺陷:效率低,带来大量的无用信息。
如果你的项目不是那么大,并且希望快速开发,那么你使用Rest风格的HTTP,但是如果你的公司牛人很多,建议你使用RPC,你的项目比较大,对于网络传输的速率要求比较严格,那么你也可以使用RPC。
20.Dubbo 的整体架构设计有哪些分层?
十层分层,遵循了领域驱动设计原则,并且他是在分层架构设计的基础上进行衍生的。
Service 这一层次是与业务相关的,根据我们的服务提供者以及服务的消费者进行对应的业务接口设计与实现
Config 配置层:对外配置接口,以ServiceConfig以及ReferenceConfig做为中心。
Proxy 服务接口透明代理,生成客户端Stub以及服务端的骨架Skeketon,以ServiceProxy为中心点,扩展点是ProxyFactory
Registry:服务注册层:封装服务地址的注册与发现,
Cluster:封装了我们的提供者的路由以及负载策略,并且我们会通过这个层面去桥接注册中心,以invoker为中心,去进行相应的接口拓展
Monitor:监控层:PPC的调用次数和调用时间,Statistics为中心,去进行接口拓展
Protocol :封装RPC调用,以invocation以及Result做为中心点,去进行拓展接口
Exchange :封装请求响应的模式,同步转异步,Request以及Response为中心
Transport :抽象mina,或者netty3,Netty4。以Message做为中心
Sreialize :可复用的工具。
21.Dubbo超时设置有哪些方式
超时设置可以在服务提供者端设置也可以在服务消费者端设置,但是我们一般会选择设置在服务提供者这边,因为消费者是没有办法感知服务提供者的特性的,所以尽可能优先设置在服务提供者端,如果消费者以及提供者都设置了超时时间,那么这个时候默认优先消费端设置,如果你在消费端设置,也有好处,好处是如果消费方超时,不会影响到提供者,提供者只会报警告不会报异常。
22.如果我们的Dubbo调用超时了会怎么办?
dubbo在调用服务不成功的时候,默认重试两次。
23.Dubbo服务之间的调用是阻塞的吗?
默认是同步等待结果的阻塞的,但是我们可以去设置成异步。
Dubbo是基于NIO非阻塞实现的并行调用,客户端不用读线程启动就可以完成并行调用远程服务,相对于原本的多线程,我们的线程开销较小。
24.Dubbo的管理控制台能够做什么?
管理控制台:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡策略等相关的管理功能。
25.当一个服务接口有多种实现的时候,我们应该怎么做?
分组问题:当一个接口有多种实现的时候,我们可以用group属性进行分组,可以让服务的提供方,以及服务的消费者都指定同一个Group。
26.出现调用超时com.alibaba.dubbo.remoting.TimeoutException异常怎么办?
一般情况下都是你的业务处理太慢,那么这个时候你可以首先去jstack.log分析线程是卡在哪个方法的调用上。
如果不能将业务处理好的话,那么这个时候请调整超时时间timeout。
27.出现java.util.concurrent.RejectedExecutionException或者Thread pool exhausted怎么办?
代表你的线程池已经到达了最大值,并且没有空闲的连接。拒绝执行你的任务。
//建议你出现了这样的错误,将最大的线程池连接数以及最小的设置成一样
dubbo.service.min.thread.pool.size=200
dubbo.service.max.thread.pool.size=200
这个参数是Dubbo.properties中的。
28.Dubbo的安全性如何得到保障
在有注册中心的情况下,我们是可以通过Dubbo的路由规则,指定固定的IP的消费方来访问。在直连的情况下,那么这个时候我可以通过服务提供者的令牌(token),我们的消费方也需要在消费的时候输入这个token,才能够直连成功。Dubbo还可以提供服务白名单,防止接口被刷。
29.dubbo的服务发布
服务的暴露起始于 Spring IOC 容器刷新完毕之后,会根据配置参数组装成 URL, 然后根据 URL 的参数来进行本地或者远程调用。
会通过 proxyFactory.getInvoker,利用 javassist 来进行动态代理,封装真的实现类,然后再通过 URL 参数选择对应的协议来进行 protocol.export,默认是 Dubbo 协议。
30.Dubbo中用到了哪些设计模式?
简单工厂:提供一个方法,返回创建好的对象 他在Dubbo源码中的体现:LoggerFactory
工厂方法模式:对创建过程有修改,所以需要抽象一个工厂类,如果增加一个产品,就直接增加一个工厂类。
抽象工厂:抽象工厂就是我们可以把不用的结果放到同一个工厂类之中 源码体现:ProxyFactory
策略模式:SPI本身就是典型的策略模式,比如我们的负载均衡策略。
装饰器模式:ClassLoadFilter的过滤器 ,在这里对于他的主功能做了增强,所以,是装饰器模式。
观察者模式:服务自动注册的时候,或者说服务启动的时候,我们会有监听,我们的ApplicationContextListen。
代理模式:我们的整个RPC实际上就是代理对象传递信息的过程。
单例模式:这个不多说,很多地方。
适配器模式:Dubbo可以支撑多个日志框架,但是我们每个日志框架都需要有对应的Adapter类,所以我们需要用适配器模式去对应Dubbo本身以及实现类的日志级别。
责任链模式:我们会有判断回升测试的判断,ProtocolFilterWrapper的buildInvokerChain用到了责任链模式。