Dubbo集群容错策略有哪些
Failover Cluster失败自动切换:dubbo的默认容错方案,当调用失败时自动切换到其他可用的节点,具体的重试次数和间隔时间可通过引用服务的时候配置,默认重试次数为1也就是只调用一次。
Failback Cluster失败自动恢复:在调用失败,记录日志和调用信息,然后返回空结果给consumer,并且通过定时任务每隔5秒对失败的调用进行重试
Failfast Cluster快速失败:只会调用一次,失败后立刻抛出异常
Failsafe Cluster失败安全:调用出现异常,记录日志不抛出,返回空结果
Forking Cluster并行调用多个服务提供者:通过线程池创建多个线程,并发调用多个provider,结果保存到阻塞队列,只要有一个provider成功返回了结果,就会立刻返回结果
Broadcast Cluster广播模式:逐个调用每个provider,如果其中一台报错,在循环调用结束后,抛出异 常。
Dubbo的SPI机制
SPI:service provider interface服务发现机制
通过接口全限定名找到指定目录下对应的文件,获取具体的实现类然后加载即可,做到了灵活的替换具 体的实现类。
如图所示:
demo代码:
代码语言:javascript复制@SPI("dubbo")
public interface Protocol {
int getDefaultPort();
@Adaptive
<T> Exporter<T> export(Invoker<T> invoker) throws RpcException;
@Adaptive
<T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;
void destroy();
}
Dubbo的jar包,在/META_INF/dubbo/internal/com.alibaba.dubbo.rpc.Protocol
文件中
dubbo=com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol
http=com.alibaba.dubbo.rpc.protocol.http.HttpProtocol
hessian=com.alibaba.dubbo.rpc.protocol.hessian.HessianProtocol
Protocol接口@Adaptive注解,在运行时会针对Protocol生成代理类,该代理类的方法中会有代理代码,代理代码会在运行时动态根据url中的protocol来获取key(默认是dubbo),也可以自己指定,如果指定了别的key,那么就会获取别的实现类的实例,通过这个url中的参数不同,就可以控制动态使用不同的组件实现类。
为什么Dubbo不用JDK的SPI,而是要自己实现?
Java SPI缺点:
- 需要遍历所有实现并实例化,假设一个实现类初始化过程比较消耗资源且耗时,但是你的代码里面又用不上它,这就产生了资源的浪费。也无法准确引用
- 没有使用缓存每次load都需要重新加载
Dubbo SPI:
- 给每个实现类配了个名字,通过名字去文件里面找到对应的实现类全限定名然后加载实例化,按需加载。
- 增加了缓存存储实例,提高读取性能。
- 提供了对IOC和AOP等高级功能的支持,以实现更多类型的扩展。
Dubbo和Spring Cloud对比
- Dubbo由于是二进制的传输,占用带宽会更少
- Spring Cloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大
- Dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决
- Spring Cloud的接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级
- Dubbo只是Spring Cloud的一个子集,解决的是分布式中的服务调用问题,而Spring Cloud提供了全 套的解决方案
Dubbo中ZK集群挂掉,发布者和订阅者还能通信么?
可以。
因为当启动dubbo容器时,消费者会去zookeeper拉取注册的生产者地址列表,并将其缓存在本地。每次发起调用时,都会按照本地的地址列表,以负载均衡的策略去进行调用。但是zookeeper挂掉则后续新的生产者无法被消费者发现。
- 注册中心对等集群,任意一台宕掉后,会自动切换到另一台
- 注册中心全部宕掉,服务提供者和消费者仍可以通过本地缓存通讯
- 服务提供者无状态,任一台宕机后,不影响使用
- 服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复
ZK实际是如何存储生产者和消费者信息
- 服务提供者启动时:向/dubbo/com.foo.BarService/providers目录下写入自己的URL地址
- 服务消费者启动时:订阅/dubbo/com.foo.BarService/providers目录下的提供者URL地址。并向/dubbo/com.foo.BarService/consumers目录下写入自己的URL地址
- 监控中心启动时:订阅/dubbo/com.foo.BarService目录下的所有提供者和消费者URL地址。
Dubbo支持的协议有哪些
Dubbo协议(官方推荐协议)
- 采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用)
- 大文件上传时,可能出现问题(不使用Dubbo文件上传)
RMI(Remote Method Invocation)协议
- JDK自带的能力。可与原生RMI互操作,基于TCP协议、短连接
Hessian协议
- 可与原生Hessian互操作,基于HTTP协议,对于数据包比较大的情况比较友好
- 需Hessian.jar支持,Http短连接的开销大,它的参数和返回值都需要实现Serializable接口
Http协议Webservice:基于CXF的Frontend-simple和Transports-http实现;基于WebService的远程调用协议。
- 序列化:SOAP文本序列化
- 适用场景:系统集成,跨语言调用。
Thrif:Thrift是Facebook捐给Apache的一个RPC框架,
- 语言中立
- 平台中立
如有问题,欢迎加微信交流:w714771310,备注- 技术交流 。或关注微信公众号【码上遇见你】。