概念
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
同类型的框架
Apache:Thrift、Hessian;WebService;java:RMI;淘宝:HSF;京东:JSF
- Thrift对多语言的支持比较好,但是负载均衡和SOA服务治理比较缺乏;
- Hessian、WebService都是一个传统的Http调用框架,由于Http调用时都是短连接形式,大部分的资源将会浪费掉服务器的io上面;
- RMI只支持java语言且性能一般;
- HSF、JSF并未开源;
线上版本稳定;社区文档多;成熟的运维
支持扩展;大量生产应用
涉及的知识
远程调用
RMI;hassion;webservice;thrift
通信交互
HTTP;mina;netty
容器
jetty;spring
多线程
异步;线程池
负载均衡
zookeeper
Dubbo的应用场景
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2000+个服务提供3000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点
Dubbo应用
- 作为对内提供服务应用的容器
- 拆分复杂Web应用到服务容器
- 应用负载均衡协调
- 应用服务治理
Dubbo模块
Dubbo各个角色
- consumer:服务的消费者,
- provider:服务的提供者
- registry:Dubbo服务的注册中心,实际上Dubbo并没有这样一个注册服务中心的应用,只是抽象出了这样一个注册中心的概念。
- monitor:监控类型的一个角色
首先provider将服务注册到registry注册中心上,然后consumer获取到这些服务来调用provider,或者当provider提供的服务有变化时,也会相应的通知consumer,provider和consumer在调用时都会发送相应的统计信息给monitor
Dubbo的RPC过程
由服务消费端发起,在用户的代码中调用了某个接口的方法,调用方法之后,就会调用到对应的代理层,而代理层根据提供的服务去调用对应的dubbo Invoker或者是Hessian RPC Invoker等等。Invoker再去调用对应的Exporter,在Exporter中就会调用到类的一个代理,服务端抽象出来的AbstractProxyInvoker,再调用到具体的实现类。这样就完成了一个简单的Dubbo RPC调用。
Dubbo的服务注册
这张图是Dubbo服务注册的主要过程。首先Dubbo会将xml配置生成对应的ServiceConfig Bean对象,ServiceConfig类拿到对外实际的引用ref,就是bean对象的名字,通过ProxyFactory的getInvoker方法来为这个引用的bean对象生成一个AbstractProxyInvoker的代理对象,这步就将服务的代理对象转化成Invoker的对象,然后相应的配置,将Invoker转化成Dubbo协议的DubboProtocol,根据相应配置来将Invoker Exporter从Exporter发布指令时可以指定Dubbo、Hessian、Rmi、WebService等等协议,当一个服务Exporter之后如果它有注册中心的话,它就会注册到对应的注册中心上。
Dubbo的服务调用
相应的消费者的xml配置也会转换成ReferenceConfig Bean对象,然后通过上面的指定转换成Dubb、Hessian等等协议的Invoker,再通过ProxyFactory来生成对应的ref的代理类,再将ref的代理类放到spring容器之中,在spring任意的地方就能使用这个ref来调用对应其接口的bean对象。
Dubbo模块
服务接口层(Service)
该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现。
Config配置层
dubbo源码:dubbo-config
对外配置接口,以ServiceConfig和ReferenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类。
作用
- 负责所有dubbo相关的xml配置和注释配置转换为config对象,我们知道,Spring的xml其实是将很多xml配置的bean转换为真正的bean对象,加载到容器中,而dubbo也是这样,dubbo可以配置例如dubbo:service、dubbo:reference这样的xml配置,最终通过dubbo.xsd将其转换为ServiceConfig和referenceConfig等。
- Config中拥有ServiceConfig、referenceConfig、ProtocolConfig、RegisterConfig这样的API的配置类,我们也可以使用API的方法来注册一个dubbo服务,常用的我们都是使用xml方式
核心类
- ServiceBean、ReferenceBean(对应<dubbo:service /><dubbo:reference />)
- ProtocolConfig、RegisterConfig(对应<dubbo:protocol /><dubbo:register />)
Proxy服务代理层
dubbo源码:dubbo-rpc
服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory。
作用
- 负责生成消费者的代理对象,以及服务提供方的Invoker。对于消费者来说,只能拿到一个接口,这个接口并没有真正实现,而我们在调用时,要像普通的调用bean对象一样来处理调用的话,就必须要对这个接口生成对应的代理对象,方便我们在Spring的开发
核心类
- ProxyFactory接口的2中实现JDKProxyFactory、JavassistProxyFactory
Registry服务注册层
dubbo源码:dubbo-registry
封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory、Registry和RegistryService。可能没有服务注册中心,此时服务提供方直接暴露服务。
作用
- 负责服务注册与查询服务,以及注册服务的本地缓存
- 支持多种协议注册发现服务(常用)。如redis、zookeeper(常用)、multicast
核心类
- 接口:RegistryFactory、Registry
- AbstractRegistry以及ZookeeperRegistry、ZookeeperRegistryFactory
Cluster集群层/路由层
dubbo源码:dubbo-cluster
封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster、Directory、Router和LoadBalance。将多个服务提供方组合为一个服务提供方,实现对服务消费方来透明,只需要与一个服务提供方进行交互。
作用
- 负责负载均衡的策略,以及失败策略
- 缺省设置:RandomLoadBalance,FailoverCluster
- 支持轮询、随机、一致性哈希等负载均衡策略
核心类
- 接口:LoadBalance、Cluster
- RandomLoadBalance以及RoundRobinLoadBalance
Monitor监控层
dubbo源码:dubbo-monitor
作用
- RPC调用次数和调用时间监控
- dubbo-simple下面的dubbo-monitor-simple提供了简单的控制台,我们可以在简单的控制台看到调用次数和调用时间
核心类
- DubboMonitor、Statistics
Protocol远程调用层
dubbo源码:dubbo-rpc
封将RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker和Exporter。Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。
作用
- 封将RPC调用,支持多种RPC协议,不包含IO通信部分
- 支持多协议调用RMI、Hessian、Http、WebService、thrift等RPC调用方式
核心类
- 接口Protocol、Exporter、Invoker
- DubboProtocol、DubboInvoker、DubboExporter、DubboCodec(编辑dubbo报文相关内容)
Exchange信息交换层
dubbo源码:dubbo-remoting
封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。
作用
- 封装请求响应模式,同步转异步
- 处理各种协议的通信请求,支持netty、mina、http等
- 默认采用Netty进行通信
核心类
- 接口:Server(网络模块监听所用,可以监听对应的端口)、Channel、Client
- NettyClient、NettyServer
Transport网络传输层
dubbo源码:dubbo-remoting
抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec。
Serialize数据序列化层
dubbo源码:dubbo-common
可复用的一些工具,扩展接口为Serialization、 ObjectInput、ObjectOutput和ThreadPool。
作用
- 数据序列化层和可复用的一些工具,包括序列化线程池等
- dubbo协议缺省为hessian2,rmi协议缺省为java,http协议缺省为json
核心类
- 接口:ThreadPool、Serialization
- FixedThreadPool、Hessian2Serialization