Dubbo
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方法,以及SOA服务治理方案。
-
dubbo://(推荐)
-
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 接口。