共计 3918 个字符,预计需要花费 10 分钟才能阅读完成。
开篇介绍
大家好,我是 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 拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,依照本地存储的地址进行调用;
注册核心对等集群,任意一台宕机后,将会切换到另一台注册核心;全副宕机后,服务的提供者和消费者仍能通过本地缓存通信。服务提供者无状态,任一台宕机后,不影响应用;服务提供者全副宕机,服务消费者会无奈应用,并有限次重连期待服务者复原;挂掉是不要紧的,但前提是你没有减少新的服务,如果你要调用新的服务, 则是不能办到的。