Dubbo基础知识
1、dubbo高可用
负载均衡
权重设置
服务降级
集群容错
2、负载均衡:
dubbo内置4种负载均衡机制:
RandomLoadBalance:随机策略、默认策略:随机负载均衡,可设置权重,根据权重设置生成一个随机数,权重越大,被选中的概率越大。权重相同时,直接Random索引,权重不同,基于权重随机生成。
RoundRobinLoadBalance:轮询策略:根据权重轮询,在权重轮询完后,不再轮询该机器;缺点:速度慢的提供方,累积请求导致轮询该机器会很慢。
LeastActiveLoadBalance:最少活跃调用数:相同活跃数随机,活跃数指的是调用前后计数差,使慢的提供者收到更少的请求,越慢的提供者的调用,前后的计数差越大。例:每个服务维护一个活跃计数器,当A机器开始处理请求,该计数器+1,此时A还未完成处理。若处理完毕则计数器-1。而B机器接收请求后很快处理完,此时A,B活跃数分别是1,0;当又产生请求,选择B去执行,以减少A的请求压力
CosistentHashLoadBalance:一致性哈希,相同参数的请求总数是发到同义提供者,当某一台提供者宕机时,原本发往该提供者的请求(基于虚拟节点)平摊到其他提供者,不会引起剧变。缺省只对第一个参数hash,修改如下:<dubbo:paramter key="hash.arguments" value="0,1"/>。缺省用160份虚拟节点,修改如下:<dubbo:paramter key="hash.nodes" value="320"/>
3、直连:若注册中心宕机,服务提供者和消费者仍然能够通过本地缓存通讯,此时不能注册新服务,不能采样数据。服务提供者全部宕机,服务消费者将无限次重连,知道恢复。
4、服务降级:服务器压力巨大时,根据实际业务,对部分服务不进行处理或者简单处理(如返回null),从而释放资源访问压力。在dubbo admin上屏蔽某个服务,并定义降级后返回策略
5、集群容错:
FailOver:默认方式,失败自动切换,重试其他服务器,配置示例:retires="2";
FailFast:快速失败,只发一次,失败返回,用于非幂等性(多次操作结果不同)写操作,如新增记录;
FailBack:失败自动回复,记录请求,定时重发,用于消息通知
FailSafe:失败安全,异常直接忽略,通常用于写审计日志操作
Forking:并行调度多个服务,一个成功返回即返回,可设置并行数forks="2",用于实时要求高的服务,需要浪费服务资源
Broadcast:广播调用所有提供者,逐个调用,任意一台报错则报错;
6、dubbo配置优先级:
方法优先,接口次之,全局配置最后
级别相同时消费方优先,提供方次之
参数覆盖策略:Java -D 参数优先,xml次之,properties最后
7、dubbo整体架构:
接口服务层(Service):provider和comsumer的接口
配置层(Config):对外接口配置,ServiceConfig、ReferenceConfig
服务代理层(Proxy):服务接口代理,客户端stub(存根),服务端skeleton以ServiceProxy为中心,扩展ProxyFactory
服务注册层(Registry):封装服务地址的注册和发现以服务URL为中心,扩展接口为RegistryFactory、Registry、RegistryService
路由层(Cluster):封装多个提供者的路由和负载均衡,桥接注册中心,Invoker中心,扩展:Cluster 、Directory、 Route、 LoadBalance
监控层(Monitor):RPC调用次数和调用时间监控,以statistics为中心,扩展接口为:MonitorFactory、Monitor、MonitorService
远程调用层(Protocal):封装RPC调用,以Invocation为中心
信息交换层(Exchange):封装请求响应模式,同步转异步
网络传输层(TransPort):抽象Netty、mina为统一接口
数据序列化层(Serialize):可复用的序列化工具
8、常见知识:
dubbo通讯框架:默认netty,可选mina
dubbo NIO:默认阻塞,可异步调用,基于NIO非阻塞实现并行调用
dubbo注册中心:推荐ZK,可选Redis\Multicast\Simple
dubbo序列化:推荐使用Hessian,可用Dubbo\FastJson\Java序列化
dubbo服务失效踢出:基于ZK的临时节点原理
dubbo结合zipkin实现分布式链路追踪
dubbo协议:推荐dubbo://,支持rim:// hessian:// http:// redis://
dubbo设计模式:工厂模式、装饰器模式、观察者模式、动态代理模式
dubbo不支持分布式事务,可以与TCC实现
dubbo缓存配置:<dubbo:reference cache="true"/>