Dubbo

概念

  Dubbo是一個分佈式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。java

同類型的框架

  Apache:Thrift、Hessian;WebService;java:RMI;淘寶:HSF;京東:JSFweb

  • Thrift對多語言的支持比較好,可是負載均衡和SOA服務治理比較缺少;
  • Hessian、WebService都是一個傳統的Http調用框架,因爲Http調用時都是短鏈接形式,大部分的資源將會浪費掉服務器的io上面;
  • RMI只支持java語言且性能通常;
  • HSF、JSF並未開源;

線上版本穩定;社區文檔多;成熟的運維redis

支持擴展;大量生產應用spring

涉及的知識

遠程調用

  RMI;hassion;webservice;thriftjson

通訊交互

  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
相關文章
相關標籤/搜索