什么是dubbo
Dubbo是一款高性能的的、轻量级的、开源的Java RPC框架,它提供了三大核心功能:面向接口的远程方法调用;智能容错和负载均衡及服务自动注册和发现。
面向接口远程方法调用: 提供多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
**智能容错和负载均衡:**提供基于接口方法的透明远程过程调用,包括多协议支持、负载均衡、失败容错、地址路由和动态配置等集群支持。
自动注册和发现: 基于注册中心的目录服务,是服务消费者能够动态的查询服务提供方。服务方地址透明且可以平滑的增加和减少机器。
Dubbo的架构
Registry: 服务注册中心
Provider: 服务提供者
Consumer: 服务消费者
Monitor: 服务监控中心
Container: 服务容器
我们简单解读一下这个架构图:
第0、1、2作为服务初始化环节,对应的是服务启动、服务注册和服务订阅,第3步为异步操作,主要作用是通知Consumer服务注册的变化信息(如发现新增服务注册)。第4步为同步(实线)操作,消费者作为invoke的提供者,在实质调用过程中Provider相对于Consumer是透明的,当前调用的服务的位置与下一次调用服务的位置是不确定的,服务注册中心也是通过这个环节来实现负载均衡。第5步是异步操作,为服务监控中心提供数据支持(一般数据采集时间1min一个周期)。
Monitor在系统架构中不是必须的,它的存在与否对服务的调用不会有影响,客户可以根据实质需要进行配置。
dubbo原理
1. 服务初始化: start环节就是讲服务装载到容器中,为服务注册做准备。和spring中的启动过程类似,将bean装载到容器中首先要解析bean,所以dubbo也是先读取配置文件解析服务。
2. 解析服务:
基于dubbo.jar的Meta-inf/spring.handlers配置,spring在遇到dubbo名称空间时会回调DubboNamespaceHandler类。所有的dubbo标签都统一用DubboBeanDefinitionParser进行解析,基于一对一属性映射,将xml标签解析为bean对象。生产者或消费者初始化的时候,会将bean转化为url格式并将bean的属性转化成url参数,然后将url传给Protocol拓展点,基于拓展点的Adaptive机制,根据url的协议头进行不同协议的服务暴露和引用。
3. 暴露服务:
- 直接暴露服务
在没有使用注册中心的时候(这种情况一般适用于开发环境),服务的调用方和提供方都在同一个ip上,这时只需要打开一个端口即可。当配置 Or serviceConfig解析出的url格式为Dubbo://service-host/com.xxx.TxxService?version=1.0.0 基于拓展点的Adaptiver机制,通过url的dubbo协议头识别,直接调用DubboProtocol的export()方法打开服务端口。 - 向注册中心暴露服务
向服务中心暴露服务需要将服务的ip和端口一块暴露给注册中心,serviceConfig解析的url路径格式为:registry://registry-host/com.alibaba.dubbo.registry.RegistryService?export=URL.encode(“dubbo://service-host/com.xxx.TxxService?version=1.0.0”)。基于拓展点的Adaptive机制,通过register://协议头识别,调用RegisterProtocol的export()方法将export参数中的提供者URL先注册到注册中心,在重新传递给Protocol拓展点进行服务暴露。
Dubbo://service-host/com.xxx.TxxService?version=1.0.0
4. 引用服务:
- 直接引用
在没有服务注册中心,直连服务提供者的情况下ReferenceConfig解析得到的URL格式为 Dubbo://service-host/com.xxx.TxxService?version=1.0.0。基于拓展点Adaptive的机制,通过url的 dubbo://协议头,直接调用DubboProtocol的refer方法获取服务提供者的引用。 - 从注册中心引用
通过注册中心引用服务时RefrenceConfig解析URL得到的格式为 registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode(“consumer://consumer-host/com.foo.FooService?version=1.0.0”)。基于拓展点Adaptive的机制,通过url的registry://协议头,直接调用RegistryProtocol的refer()方法获取服务提供者的引用。然后RegistryProtocol将多个提供者的引用,通过Cluster拓展点伪装成单个提供引用返回。