Dubbo knowledge

 

What 1.Dubbo that?
        dubbo official document   http://dubbo.apache.org/zh-cn/docs/dev/impls/protocol.html
 
Dubbo Ali Baba is a distributed open source, high performance, transparent RPC service framework that provides automatic registration service, automatic discovery and efficient service management solution that can integrate seamlessly with the Spring Framework.
 
    Service governance reasons:
           Too difficult to configure service URL
            Load balancing distribution node pressure is too large also need to deploy clusters
            Services depend confusion, the boot sequence is not clear
            Excessive lead service performance analysis difficult, we need to be monitored
       
  
 
  

2.dubbo underlying implementation principles?

 
Dubbo default protocol uses a single long connection and NIO asynchronous communications, suitable for small amount of data concurrent service calls, customer service and the number of machines is much greater than when the number of service providers machines.

 Kefuduan thread calls a remote interface, generate a unique ID (such as a random string, the UUID, etc.), using AtomicLong Dubbo accumulated number from 0

2. The packaging method call information (e.g. call interface name, method name, list of parameter values, etc.), and the processing result of the callback callback object, all packaged together to form a target object

3. to specially designated global ConcurrentHashMap inside information call 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、服务提供者能实现失效踢出是什么原理?

        
 
 
 

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),如果严谨的话还需要加上时序节点
 
 
 
 
 
 
 
 
 

Guess you like

Origin www.cnblogs.com/a747895159/p/10975391.html