1、什么是 Dubbo ?
Dubbo是基于Java的高性能轻量级的RPC分布式服务框架,致力于提供透明化的RPC远程服务调用方案,以及SOA服务治理方案。现已成为Apache 基金会孵化项目。
2、为什么要使用Dubbo?
背景:
随着互联网的快速发展,Web应用程序的规模不断扩大,最后我们发现传统的垂直体系结构(整体式)已无法解决。分布式服务体系结构和流计算体系结构势在必行,迫切需要一个治理系统来确保体系结构的有序发展。
◆ 开源免费
◆ 一些核心业务被提取并作为独立的服务提供服务,逐渐形成一个稳定的服务中心,这样前端应用程序就可以更好地响应变化多端的市场需求
◆ 分布式框架能承受更大规模的流量
◆ 内部基于netty性能高
3、Dubbo提供了哪3个关键功能?
(1) 基于接口的远程调用:网络通信框架,提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。
(2) 容错和负载均衡:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
(3) 自动服务注册和发现:服务注册,基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
4、Dubbo核心组件:
(1) 生产者(provider)
服务端,生产内容,生产前需要依赖容器(先启动容器)
(2) 消费者(consumer)
客户端,从注册中心获取到方法,可以调用生产者中的方法。
(3) 注册中心(registry)
生产者在此注册并发布内容,消费者在此订阅并接收发布的内容。
(4) 监控中心(Monitor)
统计服务的调用次数和调用时间
(5) 容器(container)
服务运行容器,生产者在启动执行的时候,必须依赖容器才能正常启动(默认依赖的是spring容器)
5、Dubbo 服务注册流程如下:
(1) 服务容器负责启动,加载,运行服务提供者。
(2) 服务提供者在启动时,向注册中心注册自己提供的服务。
(3) 服务消费者在启动时,向注册中心订阅自己所需的服务。
(4) 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
(5) 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败再选另一台调用。
(6) 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
服务注册流程图如下:
6、Dubbo架构的特点:
连通性、健壮性、伸缩性、以及向未来架构的升级性。
7、对 jdk 的最小版本需求
jdk1.6+
8、注册中心的选择?
一般来说选中Zookeeper更稳定更合适。
除了 Zookeeper 还有 Redis 注册中心、Multicast 注册中心、Simple 注册中心。
9、Dubbo的核心配置及用途:
(1) 服务配置(dubbo:service/):用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。
(2) 引用配置(dubbo:reference/):用于创建一个远程服务代理,一个引用可以指向多个注册中心。
(3) 协议配置(dubbo:protocol/):用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。
(4) 应用配置(dubbo:application/):用于配置当前应用信息,不管该应用是提供者还是消费者。
(5) 模块配置(dubbo:module/):用于配置当前模块信息,可选。
(6) 注册中心配置(dubbo:registry/):用于配置连接注册中心相关信息
(7) 监控中心配置(dubbo:monitor/):用于配置连接监控中心相关信息,可选。
(8) 提供方配置(dubbo:provider/):当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选。
(9) 消费方配置(dubbo:consumer/):当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选。
(10) 方法配置(dubbo:method/):用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息。
(11) 参数配置(dubbo:argument/):用于指定方法参数配置。
10、配置优先级规则:
优先级从高到低:
◆ JVM -D参数,当你部署或者启动应用时,它可以轻易地重写配置,比如,改变dubbo协议端口;
◆ XML, XML中的当前配置会重写dubbo.properties中的;
◆ Properties,默认配置,仅仅作用于以上两者没有配置时;
11、如何用代码方式绕过注册中心点对点直连?
ReferenceConfig<XxxService> reference = new ReferenceConfig<XxxService>);
//此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
//如果点对点直连,可以用reference.setUrl()指定目标地址,设置url后将绕过注册中心,
//其中,协议对应provider.setProtocol()的值,端口对应provider.setPort()的值
//路径对应service.setPath()的值,如果未设置path,缺省path为接口名
reference.setUrl("dubbo://10.20.130.230:20880/com.xxx.XxxService");
12、Dubbo 配置来源有如下4种:
◆ JVM System Properties,-D参数
◆ Externalized Configuration,外部化配置
◆ ServiceConfig、ReferenceConfig 等编程接口采集的配置
◆ 本地配置文件 dubbo.properties
13、如何禁用某个服务的启动检查?
<dubbo:reference interface="com.foo.BarService" check ="false" />
14、Dubbo 负载均衡策略?默认是?
◆ 随机负载平衡(默认)
◆ RoundRobin 负载平衡
◆ 最小活动负载平衡
◆ 一致的哈希负载平衡
15、上线兼容老版本
多版本号(version)
16、开发测试环境,想绕过注册中心如何配置?
◆ XML
<dubbo:reference id=xxxserviceinterface="com.alibaba.xxx.XxxService'url="dubbo://localhost:20890"/>
◆ -D
iava -Dcom.alibaba.xxx.XxxService=dubbo://localhost:20890
◆ properties
java -Ddubbo.resolve.file=xxx.properties
com.alibaba.xxx.XxxService=dubbo://localhost:20890
17、Dubbo 目前支持以下容错策略:
(1) 失败自动切换(Failover Cluster):调用失败后基于retries=“2” 属性重试其它服务器(默认)
(2) 快速失败(Failfast Cluster):快速失败,只发起一次调用,失败立即报错。
(3) 勿略失败(Failsafe Cluster):失败后勿略,不抛出异常给客户端。
(4) 失败重试(Failback Cluster):失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作
(5) 并行调用(Forking Cluster): 只要一个成功即返回,并行调用指定数量机器,可通过 forks=“2” 来设置最大并行数。
(6) 广播调用:广播调用所有提供者,逐个调用,任意一台报错则报错。
18、Dubbo有几种配置方式?
◆ Spring
◆ Java API
19、Dubbo有哪些协议?推荐?
◆ dubbo://(推荐)
◆ rmi://
◆ hessian://
◆ http://
◆ webservice://
◆ thrift://
◆ memcached://
◆ redis://
◆ rest://
20、Dubbo使用什么通信框架?
dubbo 使用 netty
21、dubbo协议默认端日号?http协议默认端日?hessian?rmi?
◆ dubbo:20880
◆ http:80
◆ hessian:80
◆ rmi:80
22、Dubbo默认序列化框架?其他的你还知道?
◆ dubbo协议缺省为 hessian2
◆ rmi 协议缺省为 java
◆ http 协议缺省为 json
23、一个服务有多重实现时,如何处理?
可以用group分组,服务提供方和消费放都指定同一个group。
24、Dubbo 服务调用默认是阻寒的?还有其他的?
默认是同步等待结果阻塞的,同时也支持异步调用。
Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个 Future 对象。
25、Dubbo服务追踪解决方案?
◆ Zipkin
◆ Pinpoint
◆ SkyWalking
26、Dubbo不维护了吗?Dubbo 和Dubbox有什么区别?
现在进入了Apache,由apache维护。
Dubbox是当当的扩展项目。
27、Dubbox有什么新功能?
◆ 支持REST风格远程调用(HTTP+JSON/XML)
◆ 支持基于Kryo 和 FST的Java高效序列化实现
◆ 支持基于嵌入式Tomcat的HTTP remoting 体系
◆ 升级Spring
◆ 升级ZooKeeper客户端
28、io线程池大小默认?
cpu 个数+1
29、dubbo://协议适合什么样的服务调用?
◆ 采用单一长链接和NIO异步通讯,适用于小数量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
◆ 不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
30、自动剔除服务什么原理?
zookeeper临时节点,会话保持原理。
31、从 2.0.5 版本开始,dubbo支持通过x命令来进行服务治理?
telnet
32、如何用命令查看服务列表?
telnet localhost 20880
进入命令行。然后执行 1s相关命令:
ls: 显示服务列表
ls -l: 显示服务详细信息列表
ls XxxService: 显示服务的方法列表
ls -l XxxService: 显示服务的方法详细信息列表
33、Dubbo 框架设计原理:
各层说明:
◆ confg 配置层:对外配置接口,以ServiceConfig,ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类
◆ proxy 服务代理层:服务接口透明代理,生成服务的客户端Stub 和服务器端 Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory
◆ registry 注册中心层:封装服务地址的注册与发现,以服务 URL,为中心,扩展接口为RegistryFactory,Registry,RegistryService
◆ cluster 路由层:封装多个提供者的路由及负载均衡,并桥接注册中心,以 Invoker 为中心,扩展接为Cluster,Directory,Router, LoadBalance
◆ monitor 监控层:RPC调用次数和调用时间监控,以Statistics 为中心,扩展接口为MonitorFactory,Monitor, MonitorService
◆ protocol 远程调用层:封装 RPC调用,以 Invocation,Result 为中心,扩展接口为 Protocol,Invoker,Exporter
◆ exchange 信息交换层:封装请求响应模式,同步转异步,以 Request,Response 为中心,扩展接口为Exchanger,ExchangeChannel,ExchangeClient,ExchangeServer
◆ transport 网络传输层:抽象 mina 和 netty 为统一接口,以Message 为中心,扩展接口为 ChannelTransporter, Client,Server,Codec
◆ serialize 数据序列化层:可复用的一些工具,扩展接口为Serialization,0bjectInputObiectOutput,ThreadPool