您的位置:首页 > 职场人生

对于Dubbo一些面试题自己的答案

2017-09-10 19:51 405 查看
   Dubbo      头几天瞧到《Java顶尖口试必问-Dubbo口试题汇总》,对于内里得难点本人试着答复少许,有错误得请民众指正。      Dubbo固然大概不革新了,可是背靠阿里得措施能力,中文报告得多样,非常合适很多几中小型分散式类型得开辟。

一、Dubbo通讯协议

      第一、dubbo Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。



Transporter: mina, netty, grizzy
Serialization: dubbo, hessian2, java, json
Dispatcher: all, direct, message, execution, connection
ThreadPool: fixed, cached

特性

缺省协议,使用基于 mina
1.1.7
和 hessian
3.2.1
的 tbremoting 交互。
连接个数:单连接
连接方式:长连接
传输协议:TCP
传输方式:NIO 异步传输
序列化:Hessian 二进制序列化
适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。
适用场景:常规远程服务方法调用

   第二、RMI      

rmi://

RMI 协议采用 JDK 标准的
java.rmi.*
实现,采用阻塞式短连接和 JDK 标准序列化方式。
注意:如果正在使用 RMI 提供服务给外部访问 1,同时应用里依赖了老的 common-collections 包 2 的情况下,存在反序列化安全风险 3

特性

连接个数:多连接
连接方式:短连接
传输协议:TCP
传输方式:同步传输
序列化:Java 标准二进制序列化
适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。
适用场景:常规远程服务方法调用,与原生RMI服务互操作

      第三、hessian     
Hessian 1 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。
Dubbo 的 Hessian 协议可以和原生 Hessian 服务互操作,即:
提供者用 Dubbo 的 Hessian 协议暴露服务,消费者直接用标准 Hessian 接口调用
或者提供方用标准 Hessian 暴露服务,消费方用 Dubbo 的 Hessian 协议调用。

特性

连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:Hessian二进制序列化
适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。
适用场景:页面传输,文件传输,或与原生hessian服务互操作

      第四、Http      基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现 1

特性

连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:表单序列化
适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。
适用场景:需同时给应用程序和浏览器 JS 使用的服务。
      第五、WebService      基于 WebService 的远程调用协议,基于 Apache CXF 1
frontend-simple
transports-http
实现 2
可以和原生 WebService 服务互操作,即:
提供者用 Dubbo 的 WebService 协议暴露服务,消费者直接用标准 WebService 接口调用,
或者提供方用标准 WebService 暴露服务,消费方用 Dubbo 的 WebService 协议调用。

特性

连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:SOAP 文本序列化
适用场景:系统集成,跨语言调用

      第六、thrift      当前 dubbo 支持 1的 thrift 协议是对 thrift 原生协议 2 的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等。
使用 dubbo thrift 协议同样需要使用 thrift 的 idl compiler 编译生成相应的 java 代码,后续版本中会在这方面做一些增强。      第七、缓存

memcached://

基于 memcached 1 实现的 RPC 协议 2

redis://

基于 Redis 1 实现的 RPC 协议 2

二、注册中心

     

1)Multicast 注册中心

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



提供方启动时广播自己的地址
消费方启动时广播订阅请求
提供方收到订阅请求时,单播自己的地址给订阅者,如果设置了
unicast=false
,则广播给订阅者
消费方收到提供方地址时,连接该地址进行 RPC 调用。
组播受网络结构限制,只适合小规模应用或开发阶段使用。组播地址段: 224.0.0.0 - 239.255.255.255

2)zookeeper 注册中心

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



流程说明:
服务提供者启动时: 向
/dubbo/com.foo.BarService/providers
目录下写入自己的 URL 地址
服务消费者启动时: 订阅
/dubbo/com.foo.BarService/providers
目录下的提供者 URL 地址。并向
/dubbo/com.foo.BarService/consumers
目录下写入自己的 URL 地址
监控中心启动时: 订阅
/dubbo/com.foo.BarService
目录下的所有提供者和消费者 URL 地址。
支持以下功能:
当提供者出现断电等异常停机时,注册中心能自动删除提供者信息
当注册中心重启时,能自动恢复注册数据,以及订阅请求
当会话过期时,能自动恢复注册数据,以及订阅请求
当设置
<dubbo:registry check="false" />
时,记录失败注册和订阅请求,后台定时重试
可通过
<dubbo:registry username="admin" password="1234" />
设置 zookeeper 登录信息
可通过
<dubbo:registry group="dubbo" />
设置 zookeeper 的根节点,不设置将使用无根树
支持
*
号通配符
<dubbo:reference group="*" version="*" />
,可订阅服务的所有分组和所有版本的提供者

3)Redis 注册中心

基于 Redis 1 实现的注册中心 2



使用 Redis 的 Key/Map 结构存储数据结构:
主 Key 为服务名和类型
Map 中的 Key 为 URL 地址
Map 中的 Value 为过期时间,用于判断脏数据,脏数据由监控中心删除 3
使用 Redis 的 Publish/Subscribe 事件通知数据变更:
通过事件的值区分事件类型:
register
,
unregister
,
subscribe
,
unsubscribe

普通消费者直接订阅指定服务提供者的 Key,只会收到指定服务的
register
,
unregister
事件
监控中心通过
psubscribe
功能订阅
/dubbo/*
,会收到所有服务的所有变更事件
调用过程:
服务提供方启动时,向
Key:/dubbo/com.foo.BarService/providers
下,添加当前提供者的地址
并向
Channel:/dubbo/com.foo.BarService/providers
发送
register
事件
服务消费方启动时,从
Channel:/dubbo/com.foo.BarService/providers
订阅
register
unregister
事件
并向
Key:/dubbo/com.foo.BarService/providers
下,添加当前消费者的地址
服务消费方收到
register
unregister
事件后,从
Key:/dubbo/com.foo.BarService/providers
下获取提供者地址列表
服务监控中心启动时,从
Channel:/dubbo/*
订阅
register
unregister
,以及
subscribe
unsubsribe
事件
服务监控中心收到
register
unregister
事件后,从
Key:/dubbo/com.foo.BarService/providers
下获取提供者地址列表
服务监控中心收到
subscribe
unsubsribe
事件后,从
Key:/dubbo/com.foo.BarService/consumers
下获取消费者地址列表

4)Simple 注册中心

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

三、集群容错

Failover Cluster

失败自动切换,当出现失败,重试其它服务器 1。通常用于读操作,但重试会带来更长延迟。可通过
retries="2"
来设置重试次数(不含第一次)。
重试次数配置如下:
<dubbo:service retries="2" />
<dubbo:reference retries="2" />
<dubbo:reference>
<dubbo:method name="findFoo" retries="2" />
</dubbo:reference>

Failfast Cluster

快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

Failsafe Cluster

失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

Failback Cluster

失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

Forking Cluster

并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过
forks="2"
来设置最大并行数。

Broadcast Cluster

广播调用所有提供者,逐个调用,任意一台报错则报错 2。通常用于通知所有提供者更新缓存或日志等本地资源信息。
http://www.njszjw.gov.cn/jrjd/02017082114135.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: