Dubbo基础浅析
-
是一款高性能的Java RPC框架 --远程过程调用
-
其中Dubbo支持的协议有:dubbo、rmi、hessian、http、webservice、rest、redis等。
推荐使用的是dubbo协议.
-
层级
第一层:service层,接口层,给服务提供者和消费者来实现的
第二层:config层,配置层,主要是对dubbo进行各种配置的,ServiceConfig 和 ReferenceConfig。
第三层:proxy层,服务代理层,透明生成客户端的stub和服务单的skeleton
第四层:registry层,服务注册层,负责服务的注册与发现
第五层:cluster层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务,还还负责远程调用失败的容错措施。
第六层:monitor层,监控层,对rpc接口的调用次数和调用时间进行监控
第七层:protocol层,远程调用层,封装rpc调用
第八层:exchange层,信息交换层,封装请求响应模式,同步转异步
第九层:transport层,网络传输层,抽象mina和netty为统一接口
第十层:serialize层,数据序列化层
服务暴露过程
业务流程:
- Provider启动。
- 通过Proxy,根据协议Protocol将接口包装成Invoker
- 再经过Exporter包装一层,目的为了在注册中心暴露自己。
- Exporter通过 Registry 注册到注册中心。
代码流程:
- 起始于 Spring IOC 容器刷新完毕之后。
- 根据配置参数组装成 URL。
- 根据 URL 的参数来进行本地或者远程调用。
- 通过 proxyFactory.getInvoker,利用 javassist 来进行动态代理,封装真的实现类。
- 通过 URL 参数选择对应的协议来进行 protocol.export,默认是 Dubbo 协议。
- 第一次暴露的时候会调用 createServer 来创建 Server,默认是 NettyServer。
- 将 export 得到的 exporter 存入一个 Map 中。
- 向注册中心注册提供者的信息。
服务引入过程
业务流程:
- 消费者启动会向注册中心拉取服务提供者的元信息。 Proxy调用Invoker对象。
- 通过Directory获取所有可以调用的Invoker列表。
- 通过 LoadBalance从Invoker列表 做负载均衡选取一个。
- 再经过 Filter 做一些统计筛选。
- Client 做数据传输(Netty )。
- 经过 Codec 接口做协议构造,再序列化。
代码流程:
- 饿汉式就是加载完毕就会引入,懒汉式是只有当这个服务被注入到其他类中时启动引入流程,默认是懒汉式。
- 检查配置,通过配置构建出一个map。
- 根据map组装成 URL 。
- 单个URL,根据URL上的协议调用不同的Prorocol.refer,得到相应的invoker(调用 RegistryProtocol 的 refer 构建 Invoker 实例)。
- 如果有多个注册中心或多个服务提供者,则遍历生成invoker(调用 RegistryProtocol 的 refer 构建 Invoker 实例),并构建StaticDirectory,再由封装成一个invoker对象。
refer过程如下:
- 构建 RegistryDirectory 向注册中心注册消费者的信息,并且订阅提供者、配置、路由等节点。
- 进入 Dubbo 协议的引入,创建 Invoker,期间会包含 NettyClient,来进行远程通信。
- 最后通过 Cluster 来包装 Invoker,默认是 FailoverCluster,最终返回代理类。