Dubbo 框架是用来处理分布式系统中,服务发现与注册以及调用问题的,并且管理调用过程。
一,工作流程:
二、各个部分整体机制
1、提供者暴露服务的整体机制:
在服务提供者初始化的时候,会通过 Config 组件中的 ServiceConfig 读取服务的配置信息。这个配置信息有三种形式,分别是 XML 文件,注解(Annoation)和属性文件(Properties 和 yaml)。
在读取配置文件生成服务实体以后,会通过 ProxyFactory 将 Proxy 转换成 Invoker。
此时,Invoker 会被定义 Protocol,之后会被包装成 Exporter。
最后,Exporter 会发送到注册中心,作为服务的注册信息
2.注册中心
其主要作用如下:
Dubbo 有四种注册中心的实现,分别是 ZooKeeper,Redis,Simple 和 Multicast。
ZooKeeper 是负责协调服务式应用的。通过树形文件存储的 ZNode 在 /dubbo/Service 目录下面建立了四个目录,分别是:
Providers 目录下面,存放服务提供者 URL 和元数据。
Consumers 目录下面,存放消费者的 URL 和元数据。
Routers 目录下面,存放消费者的路由策略。
Configurators 目录下面,存放多个用于服务提供者动态配置 URL 元数据信息。
客户端第一次连接注册中心的时候,会获取全量的服务元数据,包括服务提供者和服务消费者以及路由和配置的信息。
根据 ZooKeeper 客户端的特性,会在对应 ZNode 的目录上注册一个 Watcher,同时让客户端和注册中心保持 TCP 长连接。
如果服务的元数据信息发生变化,客户端会接受到变更通知,然后去注册中心更新元数据信息。变更时根据 ZNode 节点中版本变化进行。
3.服务消费者
服务消费者首先持有远程服务实例生成的 Invoker,然后把 Invoker 转换成用户接口的动态代理引用,服务引用的入口点在 ReferenceBean
4.Dubbo 集群容错
分布式服务多以集群形式出现,在消费服务发起调用的时候,会涉及到 Cluster,Directory,Router,LoadBalance 几个核心组件。
cluster生成 Invoker 对象后就获取可调用的服务列表,在 Directory 获取所有 Invoker 列表之后,会调用路由接口(Router)。其会根据用户配置的不同策略对 Invoker 列表进行过滤,只返回符合规则的 Invoker。生成的 Invoker服务有可能分布在不同的节点上面。所以,需要经过 LoadBalance。
5.Dubbo 远程调用
服务消费者经过容错,Invoker 列表,路由和负载均衡以后,会对 Invoker 进行过滤,之后通过 Client 编码,序列化发给服务提供者。