Dubbo知识点
![](https://img2018.cnblogs.com/blog/1694759/201906/1694759-20190604183646730-1392821316.png)
2.dubbo底层实现原理?
客服端一个线程调用远程接口,生成一个唯一的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属性
4、dubbo哪几种节点角色?
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
5、dubbo服务注册与发现的流程?
目前已有的容器实现 Spring Container、Jetty Container、Log4j Container、Logback Container。dubbo的服务容器只是一个简单的 Main 方法,并加载一个简单的 Spring 容器,用于暴露服务。不需要web容器。
7.dubbo的 SPI扩展
META-INF/services
下,文件名就是服务接口的全限定名。缺点:ServiceLoader也算是使用的延迟加载。但是通过遍历获取,接口的实现类全部实例化一遍,不灵活浪费。![](https://img2020.cnblogs.com/blog/1694759/202012/1694759-20201208113636467-267846481.png)
META-INF/dubbo/internal/、META-INF/dubbo/、META-INF/services/
三个classpath目录下的配置文件。配置文件以具体扩展接口全名命名。![](https://img2018.cnblogs.com/blog/1694759/201906/1694759-20190604183820451-1447881694.png)
1. XML 配置文件方式;
2. properties 配置文件方式(Dubbo 将自动加载 classpath 根目录下的 dubbo.properties);
3. annotation 配置方式;
4. API 配置方式;
- 方法级优先,接口级次之,全局配置再次之。
- 如果级别一样,则消费方优先,提供方次之。
默认是同步等待结果阻塞的,支持异步调用。
Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个 Future 对象。
管理控制台主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能。
Dubbo 的设计目的是为了满足高并发小数据量的 rpc 调用,在大数据量下的性能表现并不好,建议使用 rmi 或 http 协议。
14、Dubbo 停止维护了吗?
15、说说 Dubbo 服务暴露的过程。
基于 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接口,关于InitializingBean
,DisposableBean
,ApplicationContextAware
,BeanNameAware。
Spring初始化完成Bean的组装,会调用InitializingBean
的afterPropertiesSet
方法,在Spring容器加载完成,会接收到事件ContextRefreshedEvent
,调用ApplicationListener
的onApplicationEvent
方法。
afterPropertiesSet
中,和onApplicationEvent
中,会调用export()
,在export()
中,会暴露dubbo服务,具体区别在于是否配置了delay
属性,是否延迟暴露,如果delay
不为null
,或者不为-1
时,会在afterPropertiesSet
中调用export()
暴露dubbo服务,如果为null
,或者为-1
时,会在Spring容器初始化完成,接收到ContextRefreshedEvent
事件,调用onApplicationEvent
,暴露dubbo服务。![](https://img2018.cnblogs.com/blog/1694759/201906/1694759-20190604183854412-577208468.png)
17、如何解决服务调用链过长的问题?
Dubbo 可以使用 Pinpoint 和 Apache Skywalking(Incubator) 实现分布式服务追踪,当然还有其他很多方案。可以结合zipkin实现分布式服务追踪。
18、注册了多个同一样的服务,如果测试指定的某一个服务呢?
可以配置环境点对点直连,绕过注册中心。Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。
19、Dubbo 和 Spring Cloud 有什么区别?
2)组成部分不同
20、dubbo集群负载均衡策略?loadbalance 属性
默认使用 javassist 动态字节码生成,创建代理类。
但是可以通过 spi 扩展机制配置自己的动态代理策略。
![](https://img2018.cnblogs.com/blog/1694759/201906/1694759-20190604183927559-1406118575.png)
21.dubbo隐士传参数
RpcContext
(ThreadLocal 实现)上的 setAttachment
和 getAttachment
在服务消费方和提供方之间进行参数的隐式传递。实现filter 接口。![](https://img2018.cnblogs.com/blog/1694759/201906/1694759-20190604184000383-1465917682.png)
20、dubbo 熔断限流降级
21、服务提供者能实现失效踢出是什么原理?
22、Dubbo的集群容错方案有哪些?
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等。