Dubbo你了解多少?
2023新版
官网文档
- 是一款易用的、提供高性能通信和服务治理能力的微服务开发框架 (之前说是java的服务框架,现在是微服务,因为可以支持其他语言了,如 Golang、Node).
- 2017 年,Dubbo 被正式捐献 Apache 软件基金会并成为 Apache 顶级项目
- 阿里的开源java的项目
- …… 巴拉巴拉…… 可以再补充补充
RPC 请解释一下?
维基百科是这么定义RPC的: 在分布式计算,
远程过程调用
(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议
。
该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。
RPC是一种服务器-客户端
(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。
- 所以,对于Java程序员而言,RPC就是
远程方法调用
。 - 远程方法调用和本地方法调用是相对的两个概念,本地方法调用指的是进程内部的方法调用,而远程方法调用指的是两个进程内的方法相互调用。
Dubbo 架构流程描述一下:
- 首先服务提供者Provider启动向注册中心注册自己所能提供的服务;
- 服务消费者Consumer启动向注册中心订阅自己所需的服务;
- 注册中心将提供者元信息通知给Consumer;
- Consumer可以通过负载均衡选择Provider直接调用;
- 监控中心会将服务的提供者和消费者会在内存中记录。
Dubbo 与 Spring Cloud
因为版本变化,建议参考 Dubbo3 最新文档解释,这里不做文本搬运工。
官方连接
Dubbo 负载均衡 策略介绍一下?
Dubbo3 最新文档解释:官方连接
这里后续应该附上算法(后期补充)暂时写上自己实现的思路
- 【默认】(加权)随机:节点序号放到一个数组上,用随机数做数组下标的取模操作即可。
- (加权)轮询:增加一个计数器在数组上轮询; — 平滑轮询:算法(合计权重减去本轮分数最高的,淘汰的增加自己的权重到一下轮)
- (加权)最小调用数:消费端会记录当前那个节点持有的请求数最小,最小则发送请求。
- 一致性Hash:对参数或者方法名做Hash计算,相同的参数调用同一个节点。
- 【Dubbo3新增】(加权)最小响应时间:消费端记录上一次请求的最小响应时间。
Dubbo集群容错?
参考 Dubbo v2.7版 文档
- 失败重试【默认】:调用失败后会切换服务节点并重试两次;
- 快速失败:调用失败直接给抛出异常;- 可以捕获异常,后续手动处理。
- 失败安全:失败则直接忽略;- 适合不重要的任务,如写日志操作。
- 失败恢复:调用失败需要定时去重复调用;- 非实时性任务的调用。
- 并发调用:多个服务节点同时调用,有一个成功则返回成功;
- 广播调用:多个服务节点同时调用,有一个报错则代表服务异常。
Dubbo的SPI机制是什么?
SPI:Service Provider Interface 服务提供接口
Dubbo的SPI借鉴了JavaSPI的机制,但是两者还是有很多不同的;
Dubbo的SPI过程如下:
1、 获取类型加载器:ExtensionLoader。通过类的泛型找到对应的类型加载器。
2、 扫描文件:三个目录下是否包含对应的文件,找到类型对应的key-value信息。
3、 构建一个Holder对象,通过Double Check方式通过反射构建对象。
4、 反射实现对象的IOC 属性注入等。
5、 判断对应的配置中是否有Wrapper对象,有的话则使用其包装类。
6、 没有配置Wrapper则自己进行包装,也就是AOP操作。然后返回。
Dubbo的服务暴露(导出)
服务导出的入口为 ServiceBean的export方法
1、首先Dubbo监听Spring容器的 ContextRefreshedEvent事件,触发服务导出
2、先进行配置扫描,将 操作系统、JVM、配置中心、应用配置、文件配置等加载为Map;
3、根据配置信息构建URL,分为所有注册中的URL和服务节点的URL,生成对应Invoker对象;
4、启动网络服务器,将Invoker对象和对应的请求执行方法映射为RequestHandler。
5、将服务对象注册到对应的注册中心上,同时在服务端设置监听,监听配置中心和应用配置。
5、发布服务导出完成的事件。
Dubbo的服务导入
服务导入的入口味主要为 RefrenceBean的get方法;
1、和服务导入一样,先验证Dubbo对应的配置并初始化
2、通过protocol的refer方法构建Invoker对象