Dubbo面试

Dubbo

    Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方法,以及SOA服务治理方案。

dubbo支持哪些协议
  • dubbo://(推荐)
        Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况
  • rmi://。采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现 Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。多个短连接,TCP 协议传输,同步传输,适用常规的远程服务调用和 rmi 互操作
  • http://
  • webservice://
  • redis://
  • rest://
 

Dubbo底层原理

provider

暴露服务的提供者

consumer

调用远程服务的服务消费方

registry

服务注册与发现的注册中心

monitor

统计服务的调用次数和调用时间的监控中心

container

服务运行容器

    Dubbo是一个分布式服务框架。

    Dubbo的架构有Provider(服务提供者)、Consumer(服务消费者)、Register(服务注册中心)、Monidor(统计服务和调用次数,监控中心)、Container(服务运行容器)

     1、服务器负责启动、加载、运行提供者,

     2、提供者在启动后,向注册中心注册服务,

       3、消费者启动时 ,向注册中心订阅所需服务,

    4、注册中心返回提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者,

    5、消费者,从远程接口列表中,调用远程接口,dubbo会基于负载均衡算法,选一台提供者进行调用,如果调用失败则选择另一台。

    6、消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。(可以在dubbo的可视化界面看到)

 

dubbo的管理控制台功能

        管理控制台主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能。

当一个服务接口有多种实现时怎么做?

        当一个接口有多种实现时,可以用 group 属性来分组,服务提供方和消费方都指定同一个 group 即可。

 

rpc调用过程

  • 服务端为某个服务创建好中转对象,该对象可以调用本地的service
  • 消费端会建立一个动态代理对象,用来发送请求消息
  • dubbo的中转对象与代理对象建立的关系通过url传递
  • 消费方,把请求的目标/方法/参数发送给中转对象,中转对象就能执行方法并返回

dubbo初始化过程

  • 把dubbo的配置信息全部读取出来,set进ReferenceBean(ServiceBean)对象,对象实例由ioc容器管理
  • ReferenceBean实现了initializingBean接口,所有在初始化完成的时候会调用afterPropertiesSet方法
  • 在afterPropertiesSet方法内进行dubbo服务配置(创建消费端的代理对象、服务端的中转对象、向zk注册信息、订阅信息等)
  • doExportUrls循环获取每个协议,循环处理
  • 在协议中创建中转对象、消费代理

 

服务发布

  • 接着上面的初始化后
  • 获取到对外提供服务的接口,实现类以及注册url交给ProcxyFactory生成本地代理invoker;当消费者请求过来的时候,最后都是交给invoker去执行,然后invoker通过反射调用真正的实例;
  • 生成完本地代理Invoker后,在DubboProtocol中对invoker进行暴露,先将invoker包装生成exporter,再将export作为value,服务接口和端口号组合成key存入到DubboProtocol的map中,这个可以看成是本地注册
  • 通过invoker里面的url信息获取获取注册中心,将服务者信息注册到注册中心,此节点存储了服务提供方ip、端口、group、接口名称、版本、应用名称,这样可以让消费者从注册中心获取到服务者的信息
  • 为了感知注册中心的一些配置变化,提供者会监听注册中心路径/dubbo/${interfaceClass}/configurators的节点,监听该节点在注册中心的一些配置信息变更。zookeeper注册中心通过zookeeper框架的监听回调接口进行监听(redis注册中心通过订阅命令(subscribe)监听),服务器缓存注册中心的配置,当配置发生变更时,服务会刷新本地缓存

 

服务订阅

  • 接着上面的初始化后
  • 由RegistryProtocol将消费者信息注册到注册中心,开启监听注册中心的模式和订阅服务者的信息,再由DubboProtocol获取到服务者信息后连接服务端,并生成相应的Invoke
  • Invoker负责发送请求和获取处理结果。Invoke还会交由cluster封装,cluster将多个Invoker生成一个Invoker,并且还负责负载均衡和容错机制;
  • 将生成好的Invoker交给ProxyFactory生成代理对象,代理对象实现了远端的接口,并能调用代理处理器InvokerInvocationHandler,InvokerInvocationHandler再调用Invoker处理相关的请求

 

在使用过程中都遇到了些什么问题

dubbo 缺省会在启动时检查依赖是否可用,不可用就抛出异常,阻止 spring 初始化完成,check 属性默认为 true。

测试时有些服务不关心或者出现了循环依赖,将 check 设置为 false

同时配置了 XML 和 properties 文件,则 properties 中的配置无效

只有 XML 没有配置时,properties 才生效。

出现” 消息发送失败” 异常

通常是接口方法的传入传出参数未实现 Serializable 接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值