摘要:一直都在使用Dubbo,前面也写了一些Dubbo相关的文章,今天总结一下,仅供参考,如有哪里不对,请各位友友指正批评!

一:Dubbo介绍和总结系列一:

1、什么是Dubbo?

Dubbo是阿里巴巴开发用来治理服务的中间件,资源调度和治理中心的管理工具。

2、ZooKeeper节点类型?

ZooKeeper节点是有生命周期的,这取决于节点的类型,在ZooKeeper中,节点类型可以分为:

- 持久性节点(PERSISTENT)

是指在节点创建后,就一直存在,直到有删除操作来主动清除这些节点

- 临时节点(EPHEMERAL)

临时节点的生命周期和客户端绑定。如果客户端会话失效,那么这个节点就会自动被清除掉。在临时节点下面不能创建子节点。

- 持久顺序节点(PERSISTENT_SEQUENTIAL)

在持久性节点的基础上,在ZooKeeper中,每个父节点会为它的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序

- 临时顺序节点(EPHEMERAL_SEQUENTIAL)

可以用来实现分布式锁,具体可以Google相关分布式锁的文章

3、Dubbo节点角色说明

- Provider: 暴露服务的提供方(servicee服务层)

- Consumer: 调用远程服务的服务消费方(web表现层)

- Registry: 服务注册与发现的注册中心(ZooKeeper)

- Monitor: 统计服务的调用次数和调用时间的监控中心

- Container: 服务运行的容器(tomcat容器,spring容器)

4、Dubbo的注册原理(ZooKeeper流程)

- 服务提供者启动时向/dubbo/com.foo.BarService/providers 目录下写入自己的 URL 地址。

- 服务消费者启动时订阅/dubbo/com.foo.BarService/providers 目录下的提供者 URL 地址。

- 并向/dubbo/com.foo.BarService/consumers 目录下写入自己的 URL 地址。

- 监控中心启动时订阅/dubbo/com.foo.BarService 目录下的所有提供者和消费者 URL 地址。

5、注册中心包括

- Multicast 注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现。

- Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用

- 基于 Redis 实现的注册中心

- Simple 注册中心本身就是一个普通的 Dubbo 服务,可以减少第三方依赖,使整体通讯方式一致。

6、dubbo,zookeeper流程,从生产者到消费者

- 生产者和消费者都要进行dubbo的配置 ,都需要注册zookeeper主机地址,

- 生产者要配置dubbo使用的协议(默认dubbo)和端口号用来暴露服务,

- 生产者定义接口和实现类,并在配置文件中进行注册服务,

- 生产者启动时会自动把注册的接口的信息转化为一个url,

- 并通过hessian二进制序列化存储到zookeeper的节点中

- 消费者在配置文件中引入要使用的服务接口,

- 消费者启动时会从zookeeper中获取与引用的接口匹配的url

- 并把自己的信息留在zookeeper中

- 服务者和消费者在zookeeper中的信息都会被监控中心monitor获取到

- 可以通过monitor服务对zookeeper中的内容进行管理

7、服务的配置

- 服务者 -

<!--【服务者】 给服务起一个名称,唯一标识,用来监控服务器调用关系,调用次数 -->

<dubbo:application name="provider" />

<!-- 使用dubbo官方推荐注册中心模式注册对象 -->

<dubbo:registry address="zookeeper://192.168.1.180:2181" />

<!-- 用dubbo协议在20880端口暴露服务 -->

<dubbo:protocol name="dubbo" port="20880" />

<!-- 发布服务:itemService 注册对象,通过接口来注册对象 -->

<!-- 和本地bean一样实现服务 -->

<bean id="xxx.xxx.xxx.XxxImpl" class="xxx.xxx.xxx.XxxImpl" />

<dubbo:service interface="xxx.xxx.xxx.Ixxx" ref="xxxImpl" />

- 消费者 -

<!-- 【消费者】给服务起一个名称,唯一标识,用来监控服务器调用关系,调用次数 -->

<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->

<dubbo:application name="consumer" />

<!-- 使用multicast广播注册中心暴露发现服务地址 -->

<dubbo:registry address="zookeeper://192.168.17.129:2181" />

<!-- 生成远程服务代理,可以和本地bean一样使用itemService -->

<dubbo:reference id="xxx" interface="xxx.xxx.xxx.Ixxx" timeout="1000000" retries="2"/>

 

二:Dubbo介绍和总结系列二:

1、默认使用的是什么通信框架,还有别的选择吗?

默认也推荐使用netty框架,还有mina。

2、服务调用是阻塞的吗?

默认是阻塞的,可以异步调用,没有返回值的可以这么做。

3、一般使用什么注册中心?还有别的选择吗?

推荐使用zookeeper注册中心,还有redis等不推荐。

4、默认使用什么序列化框架,你知道的还有哪些?

默认使用Hessian序列化,还有Duddo、FastJson、Java自带序列化。

5、服务提供者能实现失效踢出是什么原理?

服务失效踢出基于zookeeper的临时节点原理。

6、服务上线怎么不影响旧版本?

采用多版本开发,不影响旧版本。

7、如何解决服务调用链过长的问题?

可以结合zipkin实现分布式服务追踪。

8、说说核心的配置有哪些?

核心配置有

 dubbo:service/

dubbo:reference/

dubbo:protocol/

dubbo:registry/

dubbo:application/

dubbo:provider/

dubbo:consumer/

dubbo:method/
9、dubbo推荐用什么协议?

默认使用dubbo协议。

10、同一个服务多个注册的情况下可以直连某一个服务吗?

可以直连,修改配置即可,也可以通过telnet直接某个服务。

11、Dubbo集群容错怎么做?

读操作建议使用Failover失败自动切换,默认重试两次其他服务器。写操作建议使用Failfast快速失败,发一次调用失败就立即报错。

12、dubbo和dubbox之间的区别?

dubbox是当当网基于dubbo上做了一些扩展,如加了服务可restful调用,更新了开源组件等。

13、你还了解别的分布式框架吗?

别的还有spring的spring cloud,facebook的thrift,twitter的finagle,sina的motan等。

14、dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?

可以的,zookeeper的信息会缓存到本地作为一个缓存文件,并且转换成properties对象方便使用。

 <!-- 使用zookeeper注册中心暴露服务地址 subscribe 默认:true 是否向此注册中心订阅服务,如果设为false,将只注册,不订阅 check 默认:true 注册中心不存在时,是否报错 -->

<dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}" file="${dubbo.registry.file}" check="false"/>

dubbo.registry.address=172.16.1.130:2181,172.16.1.133:2181,172.16.1.120:2181 dubbo.registry.file=/root/.dubbo/pay/dubbo.cache 

15、项目中有使用过多线程吗?有的话讲讲你在哪里用到了多线程?

<!-- 生产者配置 生产者 远程默认调用3次 参数 retries="2" async="true" 异步返回结果 默认是同步 timeout="10000" 毫秒 用dubbo协议在20882端口暴露服务 固定线程池 10 启动时建立线程,不关闭,一直持有 负载均衡策略 轮询 -->

<dubbo:provider timeout="10000" threads="10" threadpool="fixed" loadbalance="roundrobin"/>

16、Zookeeper的Java客户端你使用过哪些?

Dubbo 学习、面试、总结_zookeeper

 三:Dubbo介绍和总结系列三:

1、了解Dubbo么?

Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目。 官网:http://dubbo.apache.org

2、为什么要用Dubbo?

因为是阿里开源项目,国内很多互联网公司都在用,已经经过很多线上考验。内部使用了 Netty、Zookeeper,保证了高性能高可用性。

使用 Dubbo 可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展,使前端应用能更快速的响应多变的市场需求。

下面这张图可以很清楚的诠释,最重要的一点是,分布式架构可以承受更大规模的并发流量。

Dubbo 学习、面试、总结_spring_02

下面是 Dubbo 的服务治理图。

Dubbo 学习、面试、总结_spring_03

3、Dubbo 和 Spring Cloud 有什么区别?

两个没关联,如果硬要说区别,有以下几点。

1)通信方式不同

Dubbo 使用的是 RPC 通信,而 Spring Cloud 使用的是 HTTP RESTFul 方式。

2)组成部分不同

Dubbo 学习、面试、总结_序列化_04

4、dubbo都支持什么协议,推荐用哪种?

dubbo://(推荐)

rmi://

hessian://

http://

webservice://

thrift://

memcached://

redis://

rest://

5、Dubbo需要 Web 容器吗?

不需要,如果硬要用 Web 容器,只会增加复杂性,也浪费资源。

6、Dubbo内置了哪几种服务容器?

Spring Container

Jetty Container

Log4j Container

Dubbo 的服务容器只是一个简单的 Main 方法,并加载一个简单的 Spring 容器,用于暴露服务。

7、Dubbo里面有哪几种节点角色?

Dubbo 学习、面试、总结_序列化_05

8、画一画服务注册与发现的流程图

Dubbo 学习、面试、总结_spring_06

该图来自 Dubbo 官网,供你参考,如果你说你熟悉 Dubbo, 面试官经常会让你画这个图,记好了。

9、Dubbo默认使用什么注册中心,还有别的选择吗?

推荐使用 Zookeeper 作为注册中心,还有 Redis、Multicast、Simple 注册中心,但不推荐。

10、Dubbo有哪几种配置方式?

1)Spring 配置方式

2)Java API 配置方式

11、Dubbo 核心的配置有哪些?

我曾经面试就遇到过面试官让你写这些配置,我也是蒙逼。。

Dubbo 学习、面试、总结_zookeeper_07

配置之间的关系见下图。

Dubbo 学习、面试、总结_序列化_08

12、在 Provider 上可以配置的 Consumer 端的属性有哪些?

1)timeout:方法调用超时
2)retries:失败重试次数,默认重试 2 次
3)loadbalance:负载均衡算法,默认随机
4)actives 消费者端,最大并发调用限制

13、Dubbo启动时如果依赖的服务不可用会怎样?

Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,默认 check="true",可以通过 check="false" 关闭检查。

14、Dubbo推荐使用什么序列化框架,你知道的还有哪些?

推荐使用Hessian序列化,还有Duddo、FastJson、Java自带序列化。

15、Dubbo默认使用的是什么通信框架,还有别的选择吗?

Dubbo 默认使用 Netty 框架,也是推荐的选择,另外内容还集成有Mina、Grizzly。

16、Dubbo有哪几种集群容错方案,默认是哪种?

Dubbo 学习、面试、总结_Dubbo_09

17、Dubbo有哪几种负载均衡策略,默认是哪种?

Dubbo 学习、面试、总结_zookeeper_10

18、注册了多个同一样的服务,如果测试指定的某一个服务呢?

可以配置环境点对点直连,绕过注册中心,将以服务接口为单位,忽略注册中心的提供者列表。

19、Dubbo支持服务多协议吗?

Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。

20、当一个服务接口有多种实现时怎么做?

当一个接口有多种实现时,可以用 group 属性来分组,服务提供方和消费方都指定同一个 group 即可。

21、服务上线怎么兼容旧版本?

可以用版本号(version)过渡,多个不同版本的服务注册到注册中心,版本号不同的服务相互间不引用。这个和服务分组的概念有一点类似。

22、Dubbo可以对结果进行缓存吗?

可以,Dubbo 提供了声明式缓存,用于加速热门数据的访问速度,以减少用户加缓存的工作量。

23、Dubbo服务之间的调用是阻塞的吗?

默认是同步等待结果阻塞的,支持异步调用。
Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个 Future 对象。
异步调用流程图如下。

Dubbo 学习、面试、总结_Dubbo_11

24、Dubbo支持分布式事务吗?

目前暂时不支持,后续可能采用基于 JTA/XA 规范实现,如以图所示。

Dubbo 学习、面试、总结_序列化_12

25、Dubbo telnet 命令能做什么?

dubbo 通过 telnet 命令来进行服务治理,具体使用看这篇文章《dubbo服务调试管理实用命令》。
telnet localhost 8090

26、Dubbo支持服务降级吗?

Dubbo 2.2.0 以上版本支持。

27、Dubbo如何优雅停机?

Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果使用 kill -9 PID 等强制关闭指令,是不会执行优雅停机的,只有通过 kill PID 时,才会执行。

28、服务提供者能实现失效踢出是什么原理?

服务失效踢出基于 Zookeeper 的临时节点原理。

29、如何解决服务调用链过长的问题?

Dubbo 可以使用 Pinpoint 和 Apache Skywalking(Incubator) 实现分布式服务追踪,当然还有其他很多方案。

30、服务读写推荐的容错策略是怎样的?

读操作建议使用 Failover 失败自动切换,默认重试两次其他服务器。

写操作建议使用 Failfast 快速失败,发一次调用失败就立即报错。

31、Dubbo必须依赖的包有哪些?

Dubbo 必须依赖 JDK,其他为可选。

32、Dubbo的管理控制台能做什么?

管理控制台主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能。

33、说说 Dubbo 服务暴露的过程。

Dubbo 会在 Spring 实例化完 bean 之后,在刷新容器最后一步发布 ContextRefreshEvent 事件的时候,通知实现了 ApplicationListener 的 ServiceBean 类进行回调 onApplicationEvent 事件方法,Dubbo 会在这个方法中调用 ServiceBean 父类 ServiceConfig 的 export 方法,而该方法真正实现了服务的(异步或者非异步)发布。

34、Dubbo 停止维护了吗?

2014 年开始停止维护过几年,17 年开始重新维护,并进入了 Apache 项目。

35、Dubbo 和 Dubbox 有什么区别?

Dubbox 是继 Dubbo 停止维护后,当当网基于 Dubbo 做的一个扩展项目,如加了服务可 Restful 调用,更新了开源组件等。

36、你还了解别的分布式框架吗?

别的还有 Spring cloud、Facebook 的 Thrift、Twitter 的 Finagle、Sina的Motan 等。

37、Dubbo 能集成 Spring Boot 吗?

可以的,项目地址如下。
https://github.com/apache/incubator-dubbo-spring-boot-project

38、在使用过程中都遇到了些什么问题?

Dubbo 的设计目的是为了满足高并发小数据量的 rpc 调用,在大数据量下的性能表现并不好,建议使用 rmi 或 http 协议。

39、你读过 Dubbo 的源码吗?

要了解 Dubbo 就必须看其源码,了解其原理,花点时间看下吧,网上也有很多教程。

40、你觉得用 Dubbo 好还是 Spring Cloud 好?

扩展性的问题,没有好坏,只有适合不适合,不过我好像更倾向于使用 Dubbo, Spring Cloud 版本升级太快,组件更新替换太频繁,配置太繁琐,还有很多我觉得是没有 Dubbo 顺手的地方……