Dubbo组成结构:
-
Provider暴漏服务的服务提供方
Protocol 负责提供者和消费者之间协议交互数据
Service真实的业务服务信息,接口和实现类
Container Dubbo的运行环境
-
Consumer:调用远程服务的服务消费方
Protocol 负责提供者和消费者之间协议交互数据
Cluster 感知提供者的列表信息
Proxy 提供者服务的调用代理类,由它接管Consumer中的接口调用逻辑
-
Register 注册中心,用于服务发现和路由配置等工作,提供者和消费者都会在这里进行注册
-
Monitor 用于提供和消费者的统计
Dubbo的启动和执行流程
- 提供者端启动,容器负责把Service信息加载,并通过Protocol注册到注册中心
- 消费者端启动,通过监听提供者列表感知提供者信息,并在提供者发生改变是,通过注册中心及时通知消费端
- 消费方通过Proxy模块发起请求
- 利用Cluster模块来选择真实的要发送给提供者的信息
- 交由Consumer中的Protocol把信息发送给提供者
- 提供者同样需要通过Protocol模块来处理消费者信息
- 最后由真正的服务提供者Service进行处理
Dubbo整体链路调用流程
- 消费者通过Interface进行方法调用,统一交由消费者端的Proxy,通过ProxyFactory进行代理对象的创建,使用jdk、javassist技术
- 交给Filter这个模块,做统一的过滤请求,在SPI案例中设计过
- 进入最主要的Invoker调用逻辑
- 通过Directory去配置中读取信息,最终通过list方法获取所有的Invoker
- 通过Cluster模块,根据选择的具体路由规则,来选取Invoker列表
- 通过loadBalance模块,根据负载均衡策略,选择一个具体的Invoker来处理我们的请求
- 如果执行中出现错误,并且Consumer阶段配置了重试机制,则会重新尝试执行
- 继续经过Filter进行执行功能的前后封装,Invoker选择具体的执行协议
- 客户端进行编码和序列化,然后发送数据
- 到达Consumer中的Server,在这里进行反编码和反序列化来接收数据
- 使用Exported选择执行器
- 交给Filter进行一个提供者端的过滤,达到Invoker执行器
- 通过Invoker调用接口的具体实现,然后返回