dubbo invoke 日期参数怎么传_整理五题Dubbo中非主流程但非常加分的面试题

很多人我相信在准备Dubbo相关的面试题时时常认为只要准备几题常用的面试题即可,比如:面试官经常会问Dubbo中有几种负载均衡机制以及如何自定义实现Dubbo负载均衡机制(还不懂Dubbo负载均衡?看完让你秒杀面试官)、Dubbo中默认有几种集群容错策略(集群容错?看看Dubbo是如何实现的)、Dubbo的SPI机制(用最清晰明了的方式讲述Dubbo的SPI机制)是如何实现、Dubbo是如何进行服务暴露和调用(之后有时间给大家详细说明)等等。但是有些有心机的面试官通常为了考察大家的高阶水平通常会问几题重要但是略微偏门的问题来考察大家对Dubbo的熟悉程度!

下面我就整理了五题非主流程但非常加分的面试题!

d3e9a8894e796aa4afd9625cf9f5f082.png

请简单说说Dubbo中的层级结构?

这个问题非常考验大家对Dubbo整体框架结构的熟悉程度!下面这种图非常的经典,但是也非常明确的反应出Dubbo的整体层级架构。

41850138bd8d895bfdb3b3c4c5f20b25.png

图1:Dubbo层级结构和关系

config 配置层:对外配置接口,以 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 为中心,扩展接口为 Channel, Transporter, Client, Server, Codec

serialize 数据序列化层:可复用的一些工具,扩展接口为 Serialization, ObjectInput, ObjectOutput, ThreadPool

对于这么多层级结构其实我们重点关注我们常见的就可以了,比如:config 配置层、proxy 服务代理层、registry 注册中心层、cluster 路由层、protocol 远程调用层这种,能知道这么多层的作用已经非常不错了。

Dubbo如何实现RPC调用的统一异常处理?

首先我们需要知道为什么需要异常处理:对于Dubbo的RPC调用都有可能会出现返回报错的情况,这个时候我们就需要对Dubbo调用进行try-catch的异常捕获以防止错误日志的丢失,导致无法定位到原始错误日志。

再就是解决方案了,一般解决方案就是两种:1.通过Dubbo的Filter全局处理;2.通过Spring AOP切面进行处理(中间还需要处理事务问题);

我这边就简单举一下第一种方案:

@Activate(group = Constants.PROVIDER) public class ExceptionFilter implements Filter {// ...非关键代码...@Override  public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {Result result = invoker.invoke(invocation); if (result.hasException() && GenericService.class != invoker.getInterface()) {      // ...异常处理...    }}}

Dubbo中隐式传参是如何实现的?

要实现隐式传参的功能,我首需要知道Dubbo中有一个比较重要的对象RpcContext。

RpcContext 是一个ThreadLocal的临时状态记录器,当接收到 RPC 请求,或发起 RPC 请求时,RpcContext 的状态都会变化。比如:A 调 B,B 再调 C,则 B 机器上,在 B 调 C 之前,RpcContext 记录的是 A 调 B 的信息,在 B 调 C 之后,RpcContext 记录的是 B 调 C 的信息。

所以可以通过 RpcContext 上的 setAttachment 和 getAttachment 在服务消费方和提供方之间进行参数的隐式传递。

ce6849e06a37ba54e6a76d718d75c093.png

图2:RpcContext使用

再有就是Filter(过滤器)了,这个主要是为了做统一的处理,使用时需要定义一个ConsumerFilter和ProviderFilter。ConsumerFilter用于setAttachment(key, value),而ProviderFilter用于getAttachment(key),这样就能实现信息链路传递。

Dubbo优雅停机整体流程是怎么样的?

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

Dubbo优雅停机主要的两个配置:

dubbo.shutdown.hook=true # 是否开启优雅停机dubbo.service.shutdown.wait=20000 #优雅停机等待的时间

Provider在接收到停机指令后

  1. 1.从注册中心上注销所有服务
  2. 2.从配置中心取消监听动态配置
  3. 3.向所有连接的客户端发送只读事件,停止接收新请求
  4. 4.等待一段时间以处理已到达的请求,然后关闭请求处理线程池
  5. 5.断开所有客户端连接

Consumer在接收到停机指令后

  1. 1.拒绝发出新的请求,直接返回调用异常
  2. 2.等待当前已发送请求执行完毕,如果响应超时则强制关闭连接。

在使用Dubbo过程中有没有遇到那些奇怪的问题?你是如何解决这些问题的?

这是一个开放性问题,主要是考察大家使用Dubbo的经验问题以及如何去处理问题。例如下面几个例子:

  1. Dubbo生产者注册中心注册时读取网卡错误(多网卡时),导致消费者无法调用生产者
  2. 如果注册中心是nacos且使用域名的方式对外提供,Dubbo会连接不上注册中心
  3. Dubbo本地缓存文件被占用(.dubbo/dubbo-registry-xxxxxx.cache)
  4. 出现调用超时com.alibaba.dubbo.remoting.TimeoutException异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用户指南 入门 背景 需求 架构 用法 快速启动 服务提供者 服务消费者 依赖 必需依赖 缺省依赖 可选依赖 成熟度 功能成熟度 策略成熟度 配置 Xml配置 属性配置 注解配置 API配置 示例 启动时检查 集群容错 负载均衡 线程模型 直连提供者 只订阅 只注册 静态服务 多协议 多注册中心 服务分组 多版本 分组聚合 参数验证 结果缓存 泛化引用 泛化实现 回声测试 上下文信息 隐式参 异步调用 本地调用 参数回调 事件通知 本地存根 本地伪装 延迟暴露 并发控制 连接控制 延迟连接 粘滞连接 令牌验证 路由规则 配置规则 服务降级 优雅停机 主机绑定 日志适配 访问日志 服务容器 Reference Config缓存 分布式事务13-1-13 U serG uide-zh -D ubbo -A libaba O pen S esam e code.alibabatech.com /w iki/display/dubbo/U ser+G uide-zh#U serG uide-zh-S im ple% E 7% 9B % 91% E 6% κ 2/100 API参考手册 配置API 注解API 模型API 上下文API 服务API 配置参考手册 <dubbo:service/> <dubbo:reference/> <dubbo:protocol/> <dubbo:registry/> <dubbo:monitor/> <dubbo:application/> <dubbo:module/> <dubbo:provider/> <dubbo:consumer/> <dubbo:method/> <dubbo:argument/> <dubbo:parameter/> 协议参考手册 dubbo:// rmi:// hessian:// http:// webservice:// thrift:// memcached:// redis:// 注册中心参考手册 Multicast注册中心 Zookeeper注册中心 Redis注册中心 Simple注册中心 Simple监控中心 Telnet命令参考手册 ls ps cd pwd trace count invoke status log help clear exit Maven插件参考手册 mvn dubbo:registry mvn dubbo:create 服务化最佳实践 分包 粒度 版本 兼容性 枚举值 序列化 异常 调用 推荐用法 容量规划 基准测试工具包 性能测试报告 测试说明 测试环境 测试目的 测试脚本 测试结果 测试分析 测试覆盖率报告

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值