分布式基础概念-RPC之Dubbo[2]

2023-11-13 18:47:04 浏览数 (2)

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文件中

代码语言:javascript复制
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缺点:

  1. 需要遍历所有实现并实例化,假设一个实现类初始化过程比较消耗资源且耗时,但是你的代码里面又用不上它,这就产生了资源的浪费。也无法准确引用
  2. 没有使用缓存每次load都需要重新加载

Dubbo SPI

  1. 给每个实现类配了个名字,通过名字去文件里面找到对应的实现类全限定名然后加载实例化,按需加载。
  2. 增加了缓存存储实例,提高读取性能。
  3. 提供了对IOC和AOP等高级功能的支持,以实现更多类型的扩展。

Dubbo和Spring Cloud对比

  1. Dubbo由于是二进制的传输,占用带宽会更少
  2. Spring Cloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大
  3. Dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决
  4. Spring Cloud的接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级
  5. 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,备注- 技术交流 。或关注微信公众号【码上遇见你】。


0 人点赞