DUBBO
2021-01-14 16:02:32 49 举报
AI智能生成
Dubbo思维导图
作者其他创作
大纲/内容
特性
面向接口代理的高性能RPC调用
智能负载均衡
服务自动注册与发现
高度可扩展能力
运行期流量调度
子主题
架构
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Registry:注册中心
Provider:服务提供者
Consumer:服务消费者
Monitor:监控中心
Container:服务运行容器
基础知识
dubbo-demo
基于xml配置
基于注解配置
基于 API 配置
URL配置总线
protocol://username:password@host:port/path?key=value&key=value
protocol:URL 的协议。我们常见的就是 HTTP 协议和 HTTPS 协议,当然,还有其他协议,如 FTP 协议、SMTP 协议等
username/password:用户名/密码。 HTTP Basic Authentication 中多会使用在 URL 的协议之后直接携带用户名和密码的方式
host/port:主机/端口。在实践中一般会使用域名,而不是使用具体的 host 和 port
path:请求的路径。
parameters:参数键值对
Dubbo SPI
JDK SPI
在 Classpath 下的 META-INF/services/ 目录里创建一个以服务接口命名的文件,此文件记录了该 jar 包提供的服务接口的具体实现类
Dubbo SPI
META-INF/services/ 目录:该目录下的 SPI 配置文件用来兼容 JDK SPI
META-INF/dubbo/ 目录:该目录用于存放用户自定义 SPI 配置文件
META-INF/dubbo/internal/ 目录:该目录用于存放 Dubbo 内部使用的 SPI 配置文件
META-INF/dubbo/ 目录:该目录用于存放用户自定义 SPI 配置文件
META-INF/dubbo/internal/ 目录:该目录用于存放 Dubbo 内部使用的 SPI 配置文件
SPI 配置文件改成了 KV 格式
@SPI 注解
时间轮定时任务
失败重试
Provider 向注册中心进行注册失败时的重试操作,或是 Consumer 向注册中心订阅时的失败重试等
周期性定时任务
定期发送心跳请求,请求超时的处理,或是网络连接断开后的重连机制
zookeeper
Client 节点
Leader 节点
Follower 节点
Observer 节点
ZNode 节点类型
持久节点
持久顺序节点
临时节点
临时顺序节点
代理模式
JDK 动态代理
CGLib
是一个基于 ASM 的字节码生成库
CGLib 与 JDK 动态代理之间可以相互补充:在目标类实现接口时,使用 JDK 动态代理创建代理对象;当目标类没有实现接口时,使用 CGLib 实现动态代理的功能
Javassist
开源的生成 Java 字节码的类库
netty
Netty I/O 模型设计
传统阻塞 I/O 模型
I/O 多路复用模型
Netty 线程模型设计
单 Reactor 单线程
单 Reactor 多线程
主从 Reactor 多线程
基本用法
启动时检查
缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true"
集群容错
Failover Cluster(默认)
失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)
Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录
Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作
Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作
Forking Cluster
并行调用多个服务器,只要一个成功即返回
Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错
负载均衡
Random LoadBalance(默认)
随机,按权重设置随机概率
有一组服务器 servers = [A, B, C],他们对应的权重为 weights = [5, 3,
2],权重总和为10。现在把这些权重值平铺在一维坐标值上,[0, 5) 区间属于服务器 A,[5, 8) 区间属于
服务器 B,[8, 10) 区间属于服务器 C
2],权重总和为10。现在把这些权重值平铺在一维坐标值上,[0, 5) 区间属于服务器 A,[5, 8) 区间属于
服务器 B,[8, 10) 区间属于服务器 C
RoundRobin LoadBalance
轮询,按公约后的权重设置轮询比率
LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差
根据目标集群服务器列表,处理性能最高的,权重也越高。处理性能较低的,权重也比较低
根据请求处理的吞吐量 -> 发起一次请求(开始),计数器+1、 一次请求处理完成,计数器-1
根据请求处理的吞吐量 -> 发起一次请求(开始),计数器+1、 一次请求处理完成,计数器-1
ConsistentHash LoadBalance
一致性 Hash,相同参数的请求总是发到同一提供者
根据参数进行hash取模。 默认是根据 {第一个参数}。
多协议
dubbo
hessian
thrift
grpc http2.0 / protobuff
rest
rmi
泛化调用
实现一个通用的服务测试框架,可通过 GenericService 调用所有服务实现
隐式参数
通过 RpcContext 上的 setAttachment 和 getAttachment 在服务消费方和提供方之间进行参数的隐式传递
服务降级
主机绑定
查找环境变量中是否存在启动参数 [DUBBO_IP_TO_BIND] =服务注册的ip
读取配置文件, dubbo.protocols.dubbo.host= 服务注册的ip
InetAddress.getLocalHost().getHostAddress() 获得本机ip地址
通过Socket去连接注册中心,从而获取本机IP
会轮询本机的网卡,直到找到合适的IP地址
上面获取到的ip地址是bindip,如果需要作为服务注册中心的ip, DUBBO_IP_TO_REGISTRY -
dDUBBO_IP_TO_REGISTRY=ip
读取配置文件, dubbo.protocols.dubbo.host= 服务注册的ip
InetAddress.getLocalHost().getHostAddress() 获得本机ip地址
通过Socket去连接注册中心,从而获取本机IP
会轮询本机的网卡,直到找到合适的IP地址
上面获取到的ip地址是bindip,如果需要作为服务注册中心的ip, DUBBO_IP_TO_REGISTRY -
dDUBBO_IP_TO_REGISTRY=ip
配置的优先级问题
方法层面的配置要优先于接口层面的配置, 接口层面的配置要优先于全局配置
如果级别一样,以客户端的配置优先,服务端次之
如果级别一样,以客户端的配置优先,服务端次之
整体设计
0 条评论
下一页