1.什么是Dubbo
Dubbo
是阿里巴巴
公司开源
的一个高性能
的RPC分布式服务框架
,使得应用可通过高性能的RPC实现服务的输出和输入功能
,可以和Spring框架
无缝集成,现已成为Apache基金会孵化项目
。
2.为什么要用Dubbo
随着服务化的进一步发展,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的框架体系(SOA),也因此衍生了一系列相应的技术,如对服务提供、服务调用、连接处理、通性协议、序列号方式、服务发现、服务路由、日志输出等行为进行封装的服务框架。就这样分布式系统的服务治理的框架就出现了,Dubbo就这样产生了,它实现了面向接口代理的RPC调用,服务注册和发现,负载均衡
,容错,扩展性等等功能。
3.Dubbo的整体架构设计有哪些分层
大致分为三层:业务层、RPC
层、Remoting
层
- 接口服务层(
Service
):与业务逻辑相关,根据provider
和consumer
的业务设计对应的接口和实现 - 配置层(
config
):用来初始化配置信息,用来管理Dubbo
的配置 - 服务代理层(
Proxy
):服务接口透明代理,provider
和consumer
都会生成Proxy
,它用来调用远程接口。生成服务的客户端Stub
和服务端的Skeleton
,以ServiceProxy
为中心,扩展接口为ProxyFactory
- 服务注册层(
Registry
):封装服务地址的注册和发现,以URL为中心,扩展接口为RegistryFactory、Resitry、ResitryService
- 路由层(
Cluster
):封装多个提供者的路由和负载均衡吗,并桥接注册中心,扩展接口为Cluster、Directory、Router和LoadBlancce
- 监控层(
Monitor
):PRC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory、Monitor 和 MonitorService
- 远程调用层(
Protocol
):封装RPC
调用的具体过程,以Invocation
和Result
为中心,扩展接口为Protocal、Invoker 和 Exporter
- 信息交换层(
Exchange
):封装请求响应模式,同步转异步,以Request
和Response
为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient 和 ExchangeServer
- 网络传输层(
Transport
):将网络传输封装成统一接口,可以在这之上扩展更多的网络传输方式,扩展接口为Channel、Transporter、Client、Server 和 Codec
- 数据序列层(
Serialize
): 负责网络传输的序列化和反序列化,扩展接口为Serialization、ObjectInput、ObjectOutput 和 ThreadPool
import java.util.ArrayList;
4.Dubbo里面有哪几种节点角色
节点 | 角色说明 |
---|---|
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
5.注册与发现的流程图
6.Dubbo核心的配置有哪些
配置 | 配置说明 |
---|---|
dubbo:service | 服务配置 |
dubbo:reference | 引用配置 |
dubbo:protocol | 协议配置 |
dubbo:application | 应用配置 |
dubbo:module | 模块配置 |
dubbo:registry | 注册中心配置 |
dubbo:monitor | 监控中心配置 |
dubbo:provider | 提供方配置 |
dubbo:consumer | 消费方配置 |
dubbo:method | 方法配置 |
dubbo:argument | 参数配置 |
7.在Provider上可以配置的Consumer端的属性有哪些
- timeout:方法调用超时
- retries:失败重试次数,默认重试2次
- loadbalance:负载均衡算法,默认随机
- actives:消费者端,最大并发调用限制
8.Dubbo有哪几种集群容错方案,默认是哪种
集群容错方案 | 说明 |
---|---|
Failover Cluster | 失败自动切换,自动重试其他服务器(默认) |
Failfast Cluster | 快速失败,立即报错,只发起一次调用 |
Failsafe Cluster | 失败安全,出现异常时,直接忽略 |
Failback Cluster | 失败自动恢复,记录失败请求,定时重发 |
Forking Cluster | 并行调用多个服务器,只要一个成功即返回 |
Broadcast Cluster | 广播逐个调用所有提供者,任意一个报错则报错 |
9.Dubbo有哪几种负载均衡策略,默认是哪种
负载均衡策略 | 说明 |
---|---|
Random LoadBalance | 随机,按权重设置随机概率(默认) |
RoundRobin LoadBalance | 轮询,按公约后的权重设置轮询比率 |
LeastActive LoadBalance | 最少活跃调用数,相同活跃数的随机 |
ConsistentHash LoadBalaclava | 一致性Hash,相同参数的请求总是发到同一提供者 |
10.Dubbo服务调用流程
工作流涉及到服务提供者,注册中心,网络和服务消费者
- 服务提供者在启动的时候,会通过读取一些配置将服务实例化。
- Proxy封装服务调用接口,方便调用者调用。客户端获取Proxy时,可以像调用本地服务一样,调用远程服务。
- Proxy在封装时,需要调用Protocol定义协议格式,例如:Dubbo Protocol。
- 将Proxy封装成Invoker,它是真实服务调用的实例。
- 将Invoker转化成Exporter,Exporter只是把Invoker包装了一层,是为了在注册中心中暴露自己,方便消费者使用。
- 将包装好的Exporter注册到注册中心。
- 服务消费者建立好实例,会到服务注册中心订阅服务提供者的元数据。元数据包括服务IP和端口以及调用方式(Proxy)。
- 消费者会通过获取的Proxy进行调用。通过服务提供方包装过程可以知道,Proxy实际包装了Invoker实体,因此需要使用Invoker进行调用。
- 在Invoker调用之前,通过Directory获取服务提供者的Invoker列表。在分布式的服务中有可能出现同一个服务,分布在不同的节点上。
- 通过路由规则了解,服务需要从哪些节点获取。
- Invoker调用过程中,通过Cluster进行容错,如果遇到失败策略进行重试。
- 调用中,由于多个服务可能会分布在不同的节点,就要通过LoadBalance来实现负载均衡。
- Invoker调用之前还需要经过Filter,它是以恶搞过滤链,用来处理上下文,限流何计数的工作。
- 生成过滤以后的Invoker。
- 用Clinet进行数据传输。
- Codec会根据Protocol定义的协议,进行协议的构造。
- 构造完成的数据,通过序列化Serialization传输给服务提供者。
- Request已经到达了服务提供者,它会被分配到线程池(ThreadPool)中进行处理。
- Server拿到请求以后查找对应的Exporter(包含有Invoker)。
- 由于Export也会被Filter层层包裹,通过Filter后获得Invoker最后,对服务提供者实体进行调用。