1. Dubbo背景介绍:
orm->mvc->rpc->soa
简化增删改查工作量->加速前端页面开发的web框架->提高业务复用以及整合->提高机器利用率的资源调度和治理中心
2. Dubbo解决了哪几个问题?
1. 服务越来越多,服务URL配置管理变得非常困难----注册中心
2. F5负载均衡器的单点压力越来越大----负载均衡算法
3. 服务之间的依赖关系错综复杂
4. 服务容量的分配问题
3. dubbo的架构
1.角色:五大角色,服务提供者、注册中心、服务调用者、监控中心、服务运行容器;调用关系说明
2.特性:连通性、健壮性、伸缩性、升级性
4. dubbo协议的优缺点:
1. 优点:采用nio服用单一长连接,并使用线程池并发处理请求和加大效率
2. 缺点:在大文件传输时,单一长连接会成为瓶颈
5. dubbo失败重试策略有哪些?
FailoverCluser :失败自动切换,当出现失败,重试其他服务器,通常用于读操作
FailfastCluser:快速失败,只发起一次调用,失败立即报错,通常用于非幂等的写操作
FailsafeCluster:失败安全,出现异常时直接忽略,通常用于写入审计日志等操作
FailbackCluster:失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知操
ForkingCluster:并行调用多个服务器,只要一个成功返回即返回,通常用于实时性较高的读操作
BroadcastCluster:广播所有提供者,任意一台报错都报错,通常用于更新本地状态
6. dubbo负责均衡算法有哪些?
轮询、随机、最小活跃调用数、一致性hash
7. dubbo集群容错方案有哪些?
缺省值为:faileover重试
8. dubbo的派发策略和线程池模型是什么?
场景的适用策略:
- 如果事件处理的逻辑能迅速完成,并且不会发起新的 IO 请求,则直接在 IO 线程上处理更快,因为减少了线程池调度。
- 如果事件处理逻辑较慢,或者需要发起新的 IO 请求, 则必须派发到线程池,否则 IO 线程阻塞,将导致不能接收其它请求。
- 如果用 IO 线程处理事件,又在事件处理过程中发起新的 IO 请求, 会报“可能引发死锁”异常,但不会真死锁。
派发策略:
- all 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。
- direct 所有消息都不派发到线程池,全部在 IO 线程上直接执行。
- message 只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在 IO 线程上执行。
- execution 只有请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在 IO 线程上执行。
- connection 在 IO 线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。
线程池:
- fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
- cached 缓存线程池,空闲一分钟自动删除,需要时重建。
- limited 可伸缩线程池,但池中的线程数只会增长不会收缩。只增长不收缩的目的是为了避免收缩时突然来了大流量引起的性能问题。
d. eager 优先创建Worker线程池。在任务数量大于corePoolSize但是小于maximumPoolSize时,优先创建Worker来处理任务。当任务数量大于maximumPoolSize时,将任务放入阻塞队列中。阻塞队列充满时抛出RejectedExecutionException。(相比于cached:cached在任务数量超过maximumPoolSize时直接抛出异常而不是将任务放入阻塞队列)
9. 什么是dubbo的多协议?
Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。
不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议
10. 服务分组的使用场景是什么?
当一个接口有多种实现时,可以用 group 区分。
11. 多版本的使用场景是什么?
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
可以按照以下的步骤进行版本迁移:
- 在低压力时间段,先升级一半提供者为新版本
- 再将所有消费者升级为新版本
3. 然后将剩下的一半提供者升级为新版本
12. dubbo的优雅停机是什么?
Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果用户使用 kill -9 PID 等强制关闭指令,是不会执行优雅停机的,只有通过 kill PID 时,才会执行。
原理:
服务提供方:停止时,先标记为不接收新请求,新请求过来时直接报错,让客户端重试其它机器。然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。
服务消费方:停止时,不再发起新的调用请求,所有新的调用在客户端即报错。然后,检测有没有请求的响应还没有返回,等待响应返回,除非超时,则强制关闭。
13. dubbo的2.7.5版本对消费端线程池模型做了哪些优化?
2.7.5之前,当面临需要消费大量服务且并发数比较大的大流量场景时,经常会出现消费端线程数分配过多的问题,改进后的消费端线程池模型,通过服用业务端被阻塞的线程,很好的解决了这个问题。相比于老的线程池模型,由于业务线程自己负责检测并解析返回结果,免去了额外的消费端线程池开销
优化前:
- 业务线程发出请求,拿到一个 Future 实例。
- 业务线程紧接着调用 future.get 阻塞等待业务结果返回。
- 当业务数据返回后,交由独立的 Consumer 端线程池进行反序列化等处理,并调用 future.set 将反序列化后的业务结果置回。
- 业务线程拿到结果直接返回
优化后:
- 业务线程发出请求,拿到一个 Future 实例。
- 在调用 future.get() 之前,先调用 ThreadlessExecutor.wait(),wait 会使业务线程在一个阻塞队列上等待,直到队列中被加入元素。
- 当业务数据返回后,生成一个 Runnable Task 并放入 ThreadlessExecutor 队列
- 业务线程将 Task 取出并在本线程中执行:反序列化业务数据并 set 到 Future。
e. 业务线程拿到结果直接返回
14. dubbo的服务降级策略是什么?
通过服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。
15. 覆盖规则为了解决哪些问题?配置的时候需要注意什么?
Dubbo 设计的在无需重启应用的情况下,动态调整 RPC 调用行为的一种能力。支持从服务和应用两个粒度来调整动态配置
16. 令牌校验解决了哪些问题?
通过令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者,可以防止消费者绕过注册中心访问提供者,另外通过注册中心可灵活改变授权方式,而不需修改或升级提供者。
17. 粘滞连接的作用?
粘滞连接用于有状态服务,尽可能让客户端总是向同一提供者发起调用,除非该提供者挂了,再连另一台。
粘滞连接将自动开启延迟连接,以减少长连接数。
18. 延迟连接的作用?
用于减少长连接数。当有调用发起时,再创建长连接。
19. 连接控制的作用?
限制服务器端接受的连接数
20. 并发控制的作用?
从服务和应用两个粒度来控制并发数目、策略
21. 延迟暴露的作用?
服务需要预热时间,比如初始化缓存,等待相关资源就位等,可以使用 delay 进行延迟暴露
22. 本地伪装的作用?
本地伪装 1 通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败。
23. 事件通知的作用?
在调用之前、调用之后、出现异常时,会触发 oninvoke、onreturn、onthrow 三个事件,可以配置当事件发生时,通知哪个类的哪个方法。
24. 参数回调的作用?
参数回调方式与调用本地 callback 或 listener 相同,只需要在 Spring 的配置文件中声明哪个参数是 callback 类型即可。Dubbo 将基于长连接生成反向代理,这样就可以从服务器端调用客户端逻辑
25. 异步调用的优点缺点?
优点:基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。
缺点:传输数据量大的时候会被阻塞
26. 异步执行的作用?
Provider端异步执行将阻塞的业务从Dubbo内部线程池切换到业务自定义线程,避免Dubbo线程池的过度占用,有助于避免不同服务间的互相影响。异步执行无益于节省资源或提升RPC响应性能,因为如果业务执行需要阻塞,则始终还是要有线程来负责执行。
27. provider超时打断的作用?
支持provider根据超时时间进行业务打断
28. 服务化最佳实践有哪些?
1. 分包
2. 粒度
3. 版本
4. 兼容性
5. 枚举值
6. 序列化
7. 异常
29. 推荐用法?
1. 在provider端尽可能配置consumer端属性
2. 在provider端尽可能合理配置consumer端属性
30. 谈一下dubbo序列化
Kryo 和 FST 序列化 | Apache Dubbo