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也算是使用的延迟加载。但是通过遍历获取,接口的实现类全部实例化一遍,不灵活浪费。 META-INF/dubbo/internal/、META-INF/dubbo/、META-INF/services/
三个classpath目录下的配置文件。配置文件以具体扩展接口全名命名。 1. XML 配置文件方式;
2. properties 配置文件方式(Dubbo 将自动加载 classpath 根目录下的 dubbo.properties);
3. annotation 配置方式;
4. API 配置方式;
- 方法级优先,接口级次之,全局配置再次之。
- 如果级别一样,则消费方优先,提供方次之。
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服务。 17、如何解决服务调用链过长的问题?
18、注册了多个同一样的服务,如果测试指定的某一个服务呢?
19、Dubbo 和 Spring Cloud 有什么区别?
20、dubbo集群负载均衡策略?loadbalance 属性
默认使用 javassist 动态字节码生成,创建代理类。
但是可以通过 spi 扩展机制配置自己的动态代理策略。
21.dubbo隐士传参数
RpcContext
(ThreadLocal 实现)上的 setAttachment
和 getAttachment
在服务消费方和提供方之间进行参数的隐式传递。实现filter 接口。 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等。