Dubbo

Dubbo

概念

  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
posted @ 2018-01-09 10:00 小白知浅 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值