Dubbo知识点

 

1.Dubbo是什么?
        dubbo官方文档  http://dubbo.apache.org/zh/docs/v2.7/dev/implementation/
 
Dubbo是阿里巴巴开源的一个分布式、高性能、透明化的 RPC 服务框架,提供服务自动注册、自动发现等高效服务治理方案, 可以和 Spring框架无缝集成。
 
    服务治理原因:
          过多的服务URL配置困难
            负载均衡分配节点压力过大的情况下也需要部署集群
            服务依赖混乱,启动顺序不清晰
            过多服务导致性能指标分析难度较大,需要监控
       
  
 
  

2.dubbo底层实现原理?

 
Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。

 客服端一个线程调用远程接口,生成一个唯一的ID(比如一段随机字符串,UUID等),Dubbo是使用AtomicLong从0开始累计数字的

2.   将打包的方法调用信息(如调用的接口名称,方法名称,参数值列表等),和处理结果的回调对象callback,全部封装在一起,组成一个对象object

3.   向专门存放调用信息的全局ConcurrentHashMap里面put(ID, object)

4.   将ID和打包的方法调用信息封装成一对象connRequest,使用IoSession.write(connRequest)异步发送出去

5.   当前线程再使用callback的get()方法试图获取远程返回的结果,在get()内部,则使用synchronized获取回调对象callback的锁, 再先检测是否已经获取到结果,如果没有,然后调用callback的wait()方法,释放callback上的锁,让当前线程处于等待状态。

6.   服务端接收到请求并处理后,将结果(此结果中包含了前面的ID,即回传)发送给客户端,客户端socket连接上专门监听消息的线程收到消息,分析结果,取到ID,再从前面的ConcurrentHashMap里面get(ID),从而找到callback,将方法调用结果设置到callback对象里。

7.   监听线程接着使用synchronized获取回调对象callback的锁(因为前面调用过wait(),那个线程已释放callback的锁了),再notifyAll(),唤醒前面处于等待状态的线程继续执行(callback的get()方法继续执行就能拿到调用结果了),至此,整个过程结束。


 

3、dubbo都支持什么协议,推荐用哪种? protocol属性

     dubbo: 单一长连接和NIO异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议TCP,异步,Hessian序列化;
     rmi: 采用JDK标准的rmi协议实现,传输参数和返回参数对象需要实现Serializable接口,使用java标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议TCP。 多个短连接,TCP协议传输,同步传输,适用常规的远程服务调用和rmi互操作。在依赖低版本的Common-Collections包,java序列化存在安全漏洞;
    webservice: 基于WebService的远程调用协议,集成CXF实现,提供和原生WebService的互操作。多个短连接,同步传输,适用系统集成和跨语言调用,走SOAP文本序列化。
    http: 基于Http表单提交的远程调用协议,使用Spring的HttpInvoke实现。多个短连接, JSON序列化。
    hessian: 集成Hessian服务,基于HTTP通讯,采用Servlet暴露服务,Dubbo内嵌Jetty作为服务器时默认实现,提供与Hession服务互操作。多个短连接,同步HTTP传输,Hessian序列化,传入参数较大,提供者大于消费者,提供者压力较大,可传文件;
    redis: 基于redis实现的RPC协议
 

4、dubbo哪几种节点角色?

Provider: 暴露服务的服务提供方。

Consumer: 调用远程服务的服务消费方。

Registry: 服务注册与发现的注册中心。

Monitor: 统计服务的调用次调和调用时间的监控中心。

Container: 服务运行容器。

     

  

 

5、dubbo服务注册与发现的流程?

 

Provider(提供者)绑定指定端口并启动服务,连接注册中心,并发本机IP、端口、应用信息和提供服务信息发送至注册中心存储
Consumer(消费者),连接注册中心 ,并发送应用信息、所求服务信息至注册中心
注册中心根据 消费 者所求服务信息匹配对应的提供者列表发送至Consumer 应用缓存。
Consumer 在发起远程调用时基于缓存的消费者列表择其一发起调用。
Provider 状态变更会实时通知注册中心、在由注册中心实时推送至Consumer

 

6、Dubbo内置了哪几种服务容器?
    

目前已有的容器实现 Spring Container、Jetty Container、Log4j Container、Logback Container。dubbo的服务容器只是一个简单的 Main 方法,并加载一个简单的 Spring 容器,用于暴露服务。不需要web容器。

 
 

7.dubbo的 SPI扩展

       SPI(Service Provider Interface)服务提供商接口,是一种动态替换发现服务实现者的机制。 JDK 为SPI提供了工具类 java.util.ServiceLoader,指定加载resource目录META-INF/services下,文件名就是服务接口的全限定名。缺点:ServiceLoader也算是使用的延迟加载。但是通过遍历获取,接口的实现类全部实例化一遍,不灵活浪费。
 

 

 

 
       Dubbo SPI对JDK SPI进行了扩展,由原来的提供者类的全限定名列表改成了KV形式的列表,这也导致了Dubbo中无法直接使用JDK ServiceLoader,所以,与之对应的,在Dubbo中有ExtensionLoader是扩展点载入器,用于载入Dubbo中的各种可配置组件。Dubbo默认依次扫描META-INF/dubbo/internal/、META-INF/dubbo/、META-INF/services/三个classpath目录下的配置文件配置文件以具体扩展接口全名命名。
 
  
 
 
8、Dubbo默认使用什么注册中心,还有别的选择吗?
        Zookeeper注册中心: 基于分布式协调系统Zookeeper实现,采用Zookeeper的watcher机制实现数据变更
        redis注册中心: 基于redis实现,采用key/Map存储,住key存储服务名和类型,Map中key存储服务URL,value服务过期时间。基于redis的发布/订阅模式通知数据变更;
        Multicast注册中心: Multicast注册中心不需要任何中心节点,只要广播地址,就能进行服务注册和发现。基于网络中组播传输实现;
 
 
9、Dubbo有哪几种配置方式?

        1. XML 配置文件方式;

        2. properties 配置文件方式(Dubbo 将自动加载 classpath 根目录下的 dubbo.properties);

        3. annotation 配置方式;

        4. API 配置方式;

10.在Provider可以配置的属性
        timeout,方法调用超时 ,如果消费者也配置了,以消费者为准。
        retries,失败重试次数,缺省是2(表示加上第一次调用,会调用3次)
        loadbalance,负载均衡算法(有多个Provider时,如何挑选Provider调用),缺省是随机(random)。
        actives,消费者端,最大并发调用限制,即当Consumer对一个服务的并发调用到上限后,新调用会Wait直到超时。
        group,针对接口多实现配置
        version  接口实现升级版本控制
        check=“false”消费者启动不检查是否可用,消费者配置。
     以 timeout 为例,显示了配置的查找顺序,其它 retries, loadbalance, actives 等类似   
  • 方法级优先,接口级次之,全局配置再次之。
  • 如果级别一样,则消费方优先,提供方次之。
 
11.Dubbo服务之间的调用是阻塞的吗?
        默认是同步等待结果阻塞的,支持异步调用。
        Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个 Future 对象。
 
        
12.Dubbo的管理控制台能做什么?
管理控制台主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能。    
 
13.在使用过程中都遇到了些什么问题?
Dubbo 的设计目的是为了满足高并发小数据量的 rpc 调用,在大数据量下的性能表现并不好,建议使用 rmi 或 http 协议。
 
 

14、Dubbo 停止维护了吗?

 
     Dubbo 2014 年开始停止维护过几年,17 年开始重新维护,并进入了 Apache 项目。
     Dubbox 是继 Dubbo 停止维护后,当当网基于 Dubbo 做的一个扩展项目,如加了服务可 Restful 调用,更新了开源组件等。
 
 

15、说说 Dubbo 服务暴露的过程。

 
              Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

            基于 dubbo.jar 内的 META-INF/spring.handlers 配置,Spring 在遇到 dubbo 名称空间时,会回调 DubboNamespaceHandler

            所有 dubbo 的标签,都统一用 DubboBeanDefinitionParser 进行解析,基于一对一属性映射,将 XML 标签解析为 Bean 对象。

            在 ServiceConfig.export() 或 ReferenceConfig.get() 初始化时,将 Bean 对象转换 URL 格式,所有 Bean 属性转成 URL 的参数。

            然后将 URL 传给 协议扩展点,基于扩展点的 扩展点自适应机制,根据 URL 的协议头,进行不同协议的服务暴露或引用。

 

    ServiceBean 同时也是service标签解析之后的bean之一,继承ServiceConfig

        该Bean实现了很多spring接口,关于InitializingBeanDisposableBeanApplicationContextAwareBeanNameAware。
    Spring初始化完成Bean的组装,会调用InitializingBeanafterPropertiesSet方法,在Spring容器加载完成,会接收到事件ContextRefreshedEvent,调用ApplicationListeneronApplicationEvent方法。
afterPropertiesSet中,和onApplicationEvent中,会调用export(),在export()中,会暴露dubbo服务,具体区别在于是否配置了delay属性,是否延迟暴露,如果delay不为null,或者不为-1时,会在afterPropertiesSet中调用export()暴露dubbo服务,如果为null,或者为-1时,会在Spring容器初始化完成,接收到ContextRefreshedEvent事件,调用onApplicationEvent,暴露dubbo服务。
        
 
    
 
 

17、如何解决服务调用链过长的问题?


Dubbo 可以使用 Pinpoint 和 Apache Skywalking(Incubator) 实现分布式服务追踪,当然还有其他很多方案。可以结合zipkin实现分布式服务追踪。
 
 

18、注册了多个同一样的服务,如果测试指定的某一个服务呢?


可以配置环境点对点直连,绕过注册中心。Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。
 
 

19、Dubbo 和 Spring Cloud 有什么区别?

 
    1)通信方式不同,Dubbo 使用的是 RPC 通信,而 Spring Cloud 使用的是 HTTP RESTFul 方式。
   2)组成部分不同
 
 

20、dubbo集群负载均衡策略?loadbalance 属性

    随机,按权重设置随机概率(默认)。
    轮询,按公约后的权重设置轮询比率
    最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
    一致性 Hash,相同参数的请求总是发到同一提供者。

默认使用 javassist 动态字节码生成,创建代理类。

但是可以通过 spi 扩展机制配置自己的动态代理策略。   

 
  
  
 

21.dubbo隐士传参数

 
        有些参数需要RPC带着传递,但是又不想写入到业务代码里。比如实现dubbo调用链。可是使用dubbo的隐式传参,可以通过 RpcContext (ThreadLocal 实现)上的 setAttachment 和 getAttachment 在服务消费方和提供方之间进行参数的隐式传递。实现filter 接口。
        RpcContext.getContext().setAttachment("index", "1"); // 隐式传参,后面的远程调用都会隐式将这些参数发送到服务器端,类似cookie,用于框架集成,不建议常规业务使用
        
     
 
 

20、dubbo 熔断限流降级

21、服务提供者能实现失效踢出是什么原理?

        
 服务失效踢出基于 zookeeper 的临时节点原理。
 

22、Dubbo的集群容错方案有哪些?

                Failover Cluster  失败自动切换,重试 共3次,通常用于读操作。默认的
                Failfast Cluster    只发起一次调用,失败即报错。用于写入记录。
                Failsafe Cluster   失败安全,出现异常忽略。用于写日志等。
                Failback Cluster  失败后,后台记录失败请求,定时重发。用于消息通知。
                Forking Cluster  并行调用多个服务器,成功一个即返回,通过forks="N" 设置并行数。
                Broadcast Cluster 广播调用模式,逐个调用,任意一台报错即报错。用于刷新缓存
 
 
23、Zookeeper是什么框架?
            ZooKeeper是一个分布式应用程序协调服务,解决了分布式一致性问题,是集群的管理者提供文件系统和通知机制。用于dubbo框架的注册中心,提供注册服务与负载均衡功能。Dubbo框架的提供者会向Zookeeper下的provider目录注册自己的URL。消费者订阅提供者的注册URL,并在consumer下注册自己的URL,以便在后续执行中调用提供者。消费者获取到URL之后,netty调用提供者提供的服务。
 
 
 
ZAB协议
         Zookeeper 的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。
 
 
 
zk集群 至少需要 集群规则为2N+1台,N>0,即至少3台。主要是为了选举算法。
 
Zookeeper分布式锁 
        基于 zookeeper的一致性文件系统 实现的分布式锁,能开销比较高。因为其需要动态产生、销毁瞬时节点来实现锁功能。
        实现原理在zookeeper上的与该功能对应的指定节点的目录下,生成一个唯一的瞬时有序节点。判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个。当释放锁的时候,只需将这个瞬时节点删除即可。同时,其可以避免服务宕机导致的锁无法释放,而产生的死锁问题。直接采用zookeeper第三方库curator即可方便地实现分布式锁。
                
 

1)zookeeper是一个开源的分布式协调服务框架。

2)应用场景:分布式通知/协调、负载均衡、配置中心、分布式锁、分布式队列等。

3)使用ZAB协议。

4)Paxos算法。

5)选举算法及流程。

6)节点类型:持久节点、持久顺序节点、临时节点、临时顺序节点。

7)不是永久的,一次性的,需要借助第三方工具实现重复注册。

8)部署模式:单机模式、伪集群模式、集群模式。

9)集群角色:leader、foller、observer。

10)集群规则为2N+1台,N>0,即3台。

11)集群需要一半以上的机器可用,所以,3台挂掉1台还能工作,2台不能。

12)3.5版本开始支持动态扩容。

13)java客户端:zk自带的zkclient及Apache开源的Curator。

14)chubby是google的,完全实现paxos算法,不开源。zookeeper是chubby的开源实现,使用zab协议,paxos算法的变种。

15)常用命令:ls get set create delete等。

 
Zookeeper 的节点?
zookeeper节点分两种(持久节点Persistent、临时节点Ephemeral),如果严谨的话还需要加上时序节点
 
 
 
 
 
 
 
 
 
posted @ 2019-06-04 18:41  作死的学  阅读(793)  评论(0编辑  收藏  举报