开篇介绍
大家好,我是Java最全面试题库
的提裤姐,今天这篇是JavaEE面试题系列的第九篇,主要总结了Dubbo
相关的问题;在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。
Dubbo是什么?
Dubbo 是一个分布式、高性能、透明化的 RPC 服务框架
,提供服务自动注册
、自动发现
等高效服务治理
方案。
Dubbo 的整体架构设计有哪些分层?
接口服务层(Service)
:该层与业务逻辑相关,根据 provider 和 consumer 的业务设计对应的接口和实现配置层(Config)
:对外配置接口,以 ServiceConfig 和 ReferenceConfig 为中心服务代理层(Proxy)
:服务接口透明代理,生成服务的客户端 Stub 和 服务端的 Skeleton,以 ServiceProxy 为中心,扩展接口为 ProxyFactory服务注册层(Registry)
:封装服务地址的注册和发现,以服务 URL 为中心,扩展接口为 RegistryFactory、Registry、RegistryService路由层(Cluster)
:封装多个提供者的路由和负载均衡,并桥接注册中心,以Invoker 为中心,扩展接口为 Cluster、Directory、Router和LoadBlancce监控层(Monitor)
:RPC调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactory、Monitor和MonitorService远程调用层(Protocal)
:封装 RPC 调用,以 Invocation 和 Result 为中心,扩展接口为 Protocal、Invoker和Exporter信息交换层(Exchange)
:封装请求响应模式,同步转异步。以 Request 和 Response 为中心,扩展接口为 Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer网络传输层(Transport)
:抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为Channel、Transporter、Client、Server和Codec数据序列化层(Serialize)
:可复用的一些工具,扩展接口为Serialization、 ObjectInput、ObjectOutput和ThreadPool
Dubbo有哪些协议?
- dubbo://
- rmi://
- hessian://
- http://
- webservice://
- thrift://
- memcached://
- redis://
- rest://
Dubbo配置有哪些?
- dubbo:service 服务提供者暴露服务配置
- dubbo:reference 服务消费者引用服务配置
- dubbo:protocol 服务提供者协议配置
- dubbo:registry 注册中心配置
- dubbo:monitor 监控中心配置
- dubbo:application 应用信息配置
- dubbo:module 模块信息配置
- dubbo:provider 服务提供者缺省值配置
- dubbo:consumer 服务消费者缺省值配置
- dubbo:method 方法级配置
- dubbo:argument 方法参数配置
- dubbo:parameter 选项参数配置
- dubbo:config-center 配置中心
Dubbo 的连接方式有哪些?
Dubbo 的客户端和服务端有三种连接方式,分别是:
- 广播
- 直连
- 使用 zookeeper 注册中心
说说Dubbo暴露过程?
1、ServiceConfig 类拿到对外提供服务的实际类 ref(如:HelloWorldImpl)
2、通过 ProxyFactory 类的 getInvoker 方法使用 ref 生成一个 AbstractProxyInvoker 实例,到这一步就完成具体服务到 Invoker 的转化
3、接下来就是 Invoker 转换到 Exporter 的过程:
- ProxyFactory 是动态代理,用来创建 Invoker 对象,实现代理使用 JavassistProxyFactory和 JdkProxyFactory。
- Invoker 是一个服务对象实例,Dubbo 框架的实体域。它可以是一个本地的实现,一个远程的实现或一个集群的实现,可以向它发起 Invoker 调用。
- Protocol 是服务域,负责 Invoker 的生命周期管理,是 Invoker 暴露和引用的主要功能入口,对应该类的 export和 refer方法。
- Exporter 是根据不同协议暴露 Invoker 进行封装的类,它会根据不同的协议头进行识别(比如:registry://和 dubbo://),调用对应 XXXProtocol的 export()方法。
Dubbo有哪些均衡负载的方法?
1、随机模式
。按权重设置随机概率。在一个截面上碰撞的概率较高,但调用越大分布越均匀
2、轮询模式
。按公约后的权重设置轮询比例。但存在响应慢的服务提供者会累积请求
3、最少活跃调用数
。响应快的提供者接受越多请求,响应慢的接受越少请求
4、一致hash
。根据服务提供者ip设置hash环,携带相同的参数总是发送的同一个服务提供者,若服务挂了,则会基于虚拟节点平摊到其他提供者上
Dubbo有哪些集群容错方案?
1、Failover Cluster:失败重试
当服务消费方调用服务提供者失败后自动切换到其他服务提供者服务器进行重试
2、Failfast Cluster:快速失败
当服务消费方调用服务提供者失败后,立即报错,也就是只调用一次。通常这种模式用于非幂等性的写操作。
3、Failsafe Cluster:失败安全
当服务消费者调用服务出现异常时,直接忽略异常。这种模式通常用于写入审计日志等操作。
4、Failback Cluster:失败自动恢复
当服务消费端用服务出现异常后,在后台记录失败的请求,并按照一定的策略后期再进行重试。这种模式通常用于消息通知操作。
5、Forking Cluster:并行调用
当消费方调用一个接口方法后,Dubbo Client会并行调用多个服务提供者的服务,只要一个成功即返回。这种模式通常用于实时性要求较高的读操作,但需要浪费更多服务资源
6、Broadcast Cluster:广播调用
当消费者调用一个接口方法后,Dubbo Client会逐个调用所有服务提供者,任意一台调用异常则这次调用就标志失败。这种模式通常用于通知所有提供者更新缓存或日志等本地资源信息。
jdk SPI和dubbo SPI的区别?
jdk SPI SPI :
全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的机制, 比如有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。我们经常遇到的就是java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,mysql和postgresql都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。
在jdk6里面引进的一个新的特性ServiceLoader,从官方的文档来说,它主要是用来装载一系列的service provider。而且ServiceLoader可以通过service provider的配置文件来装载指定的service provider。当服务的提供者,提供了服务接口的一种实现之后,我们只需要在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入
dubbo SPI:
Dubbo对JDK SPI进行了扩展,对服务提供者配置文件中的内容进行了改造,由原来的提供者类的全限定名列表改成了KV形式的列表,这也导致了Dubbo中无法直接使用JDK ServiceLoader,所以,与之对应的,在Dubbo中有ExtensionLoader,ExtensionLoader是扩展点载入器,用于载入Dubbo中的各种可配置组件
- Duboo SPI可以根据接口类名和key值获取具体一个实现
- 可以对扩展类实例的属性进行依赖注入,即IOC
- 可以采用装饰器模式实现AOP功能
Dubbo服务注册与发现的流程?
- Provider(提供者)绑定指定端口并启动服务
- 指供者连接注册中心,并发本机IP、端口、应用信息和提供服务信息发送至注册中心存储
- Consumer(消费者),连接注册中心 ,并发送应用信息、所求服务信息至注册中心
- 注册中心根据消费者所求服务信息匹配对应的提供者列表发送至Consumer 应用缓存。
- Consumer 在发起远程调用时基于缓存的消费者列表择其一发起调用。
- Provider 状态变更会实时通知注册中心、在由注册中心实时推送至Consumer
Dubbo中 zookeeper做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?
可以通信;
启动 dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用;
注册中心对等集群,任意一台宕机后,将会切换到另一台注册中心;全部宕机后,服务的提供者和消费者仍能通过本地缓存通讯。服务提供者无状态,任一台宕机后,不影响使用;服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复;挂掉是不要紧的,但前提是你没有增加新的服务,如果你要调用新的服务,则是不能办到的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。