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 配置方式;
- 方法级优先,接口级次之,全局配置再次之。
- 如果级别一样,则消费方优先,提供方次之。
默认是同步等待结果阻塞的,支持异步调用。
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服务。
17、如何解决服务调用链过长的问题?
Dubbo 可以使用 Pinpoint 和 Apache Skywalking(Incubator) 实现分布式服务追踪,当然还有其他很多方案。可以结合zipkin实现分布式服务追踪。
18、注册了多个同一样的服务,如果测试指定的某一个服务呢?
可以配置环境点对点直连,绕过注册中心。Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。
19、Dubbo 和 Spring Cloud 有什么区别?
2)组成部分不同
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等。