Dubbo 调用是同步的吗?
默认同步
Dubbo 的异常处理机制?
dubbo的异常处理类是com.alibaba.dubbo.rpc.filter.ExceptionFilter
1)如果provider实现了GenericService接口,直接抛出
2)如果是checked异常,直接抛出
3)在方法签名上有声明,直接抛出
4)异常类和接口类在同一jar包里,直接抛出
5)是JDK自带的异常,直接抛出
6)是Dubbo本身的异常,直接抛出
7)否则,包装成RuntimeException抛给客户端
网上有些文章对7)的处理有疑问,不理解原因,其实就是为了防止客户端反序列化失败.前面几种情况都能保证反序列化正常.
Dubbo 如何做参数校验?
参数验证功能是基于 JSR303 实现的,用户只需标识 JSR303 标准的验证 annotation,并通过声明 filter 来实现验证。
参数校验功能,通过参数校验过滤器 ValidationFilter 来实现。
Dubbo 可以对调用结果进行缓存吗?
Dubbo 通过 CacheFilter 过滤器,提供结果缓存的功能
Dubbo 目前提供三种实现:
lru :基于最近最少使用原则删除多余缓存,保持最热的数据被缓存。
threadlocal :当前线程缓存,比如一个页面渲染,用到很多 portal,每个 portal 都要去查用户信息,通过线程缓存,可以减少这种多余访问。
jcache :与 JSR107 集成,可以桥接各种缓存实现。
注册中心挂了还可以通信吗?
可以。对于正在运行的 Consumer 调用 Provider 是不需要经过注册中心,所以不受影响。并且,Consumer 进程中,内存已经缓存了 Provider 列表
那么,此时 Provider 如果下线呢?如果 Provider 是正常关闭,它会主动且直接对和其处于连接中的 Consumer 们,发送一条“我要关闭”了的消息。那么,Consumer 们就不会调用该 Provider ,而调用其它的 Provider 。
如果 Consumer 重启,依然能够通过本地缓存的文件,获得到 Provider 列表。
Dubbo 在 Zookeeper 存储了哪些信息?
provider和consumer分别写入自己的URL
Dubbo Consumer 只能调用从注册中心获取的 Provider 么?
在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连
Dubbo 支持哪些通信协议?
【重要】dubbo://
【重要】rest://
rmi://
webservice://
hession://
redis://
...
什么是本地暴露和远程暴露,他们的区别?
本地调用使用了 injvm:// 协议,是一个伪协议,它不开启端口,不发起远程调用,只在 JVM 内直接关联,但执行 Dubbo 的 Filter 链.
举个例子,Spring Boot Controller 调用 Service 逻辑,就变成了调用 Dubbo Service Proxy 对象。这样,如果未来有一天,本地 Dubbo Service 迁移成远程的 Dubbo Service ,只需要进行配置的修改,而对 Controller 是透明的。
Dubbo 支持哪些序列化方式?
【重要】Hessian2 :基于 Hessian 实现的序列化拓展。dubbo:// 协议的默认序列化方案。
Dubbo 自己实现的序列化拓展。
Dubbo 有哪些负载均衡策略?
四种
【默认】Random LoadBalance:按权重设置随机概率。
RoundRobin LoadBalance:按公约后的权重设置轮询比率,存在慢的提供者累积请求的问题。
LeastActive LoadBalance:最少活跃调用数,使慢的提供者收到更少请求
ConsistentHash LoadBalance:一致性 Hash,相同参数的请求总是发到同一提供者,当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
Dubbo 有哪些集群容错策略?
六种
Failover Cluster:失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。
Failfast Cluster:快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录
Failsafe Cluster:失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
Failback Cluster:失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster:并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。
Broadcast Cluster:广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
Dubbo 有哪些动态代理策略?
Dubbo 使用的是Javassit 字节码 bytecode 生成方式。
Dubbo SPI 的设计思想是什么?