溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

掌握之分布式-1.Dubbo

發(fā)布時(shí)間:2020-08-15 03:24:41 來(lái)源:網(wǎng)絡(luò) 閱讀:226 作者:學(xué)習(xí)Lr 欄目:編程語(yǔ)言

掌握高并發(fā)、高可用架構(gòu)

第三章 分布式

本章介紹分布式架構(gòu)的底層技術(shù)。主要說(shuō)明面試過(guò)程中可能被問(wèn)到的技術(shù)點(diǎn)。

第一節(jié) Dubbo

Duboo 服務(wù)治理 Zookeeper

1. Dubbo的概念

Dubbo是一個(gè)分布式、高性能、透明化的RPC(遠(yuǎn)程服務(wù)調(diào)用)服務(wù)框架, 提供服務(wù)自動(dòng)注冊(cè)、自動(dòng)發(fā)現(xiàn)等高效服務(wù)治理方案,可以和Spring無(wú)縫集成。

2. Dubbo的由來(lái)

掌握之分布式-1.Dubbocdn.com/08158f23adc5919667e6715eaa23825f030dadee.jpeg">

當(dāng)網(wǎng)站流量很小時(shí),可以把所有功能都部署在一個(gè)項(xiàng)目中,叫單體應(yīng)用框架。

隨著流量的增大,應(yīng)用拆分必不可少,此時(shí)會(huì)出現(xiàn)多個(gè)垂直應(yīng)用,在美格爾應(yīng)用中處理各自的業(yè)務(wù)邏輯。

當(dāng)垂直應(yīng)用越來(lái)越多,應(yīng)用之間的交互不可避免,將核心業(yè)務(wù)抽離出來(lái),作為獨(dú)立的服務(wù),逐漸形成穩(wěn)定的服務(wù)中心。此時(shí),用于提高業(yè)務(wù)復(fù)用和整合的 分布式服務(wù)框架 RPC 是關(guān)鍵。

當(dāng)服務(wù)越來(lái)越多,容量的評(píng)估、小服務(wù)資源的浪費(fèi)等問(wèn)題逐漸顯現(xiàn),此時(shí)需要增加一個(gè)調(diào)度中心基于訪問(wèn)壓力實(shí)時(shí)管理集群容量,提高集群利用率。此時(shí),用于提高集群利用率的 資源調(diào)度和治理中心 SOA 是關(guān)鍵。

3. Dubbo的主要特點(diǎn)
  • 透明化的遠(yuǎn)程方法調(diào)用,沒(méi)有API侵入
  • 負(fù)載均衡及容錯(cuò)機(jī)制,降低成本,拒絕單點(diǎn)
  • 服務(wù)自動(dòng)注冊(cè)與發(fā)現(xiàn),不再需要寫(xiě)死服務(wù)提供者地址,注冊(cè)中心基于接口名查詢(xún)服務(wù)提供者的IP地址,并能夠平滑的添加或刪除服務(wù)提供者
4. Dubbo的核心組件
  • Provider,暴露服務(wù)的服務(wù)提供方
  • Consumer,調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)者
  • Registry,服務(wù)注冊(cè)與發(fā)現(xiàn)的服務(wù)中心
  • Monitor,統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的監(jiān)控中心
  • Container,服務(wù)運(yùn)行容器

掌握之分布式-1.Dubbo

掌握之分布式-1.Dubbo

下面來(lái)解釋上述的兩張圖:

  1. 服務(wù)容器啟動(dòng)、加載、運(yùn)行服務(wù)提供者
  2. 服務(wù)提供者在啟動(dòng)時(shí),向注冊(cè)中心注冊(cè)自己提供的服務(wù)
  3. 服務(wù)消費(fèi)者在啟動(dòng)時(shí),向注冊(cè)中心訂閱自己所需的服務(wù),并將獲得的地址列表進(jìn)行緩存。如果沒(méi)有訂閱到自己想訂閱的服務(wù),它會(huì)不斷嘗試訂閱
  4. 注冊(cè)中心返回服務(wù)提供者地址列表給消費(fèi)者。當(dāng)新的服務(wù)注冊(cè)到注冊(cè)中心后,注冊(cè)中心會(huì)基于長(zhǎng)連接將這些服務(wù)通過(guò)notify到消費(fèi)者
  5. 服務(wù)消費(fèi)者從緩存的提供者地址列表中,基于軟負(fù)載均衡算法,選一臺(tái)進(jìn)行服務(wù)調(diào)用(此處有容錯(cuò)機(jī)制)
  6. 服務(wù)提供者和消費(fèi)者,在各自的內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心
5. Dubbo的核心配置
配置 配置說(shuō)明
dubbo:service 服務(wù)配置,用于暴露服務(wù),定義服務(wù)的元信息,一個(gè)服務(wù)可用多個(gè)協(xié)議暴露,也可以注冊(cè)到多個(gè)注冊(cè)中心,對(duì)應(yīng)ServiceBean
dubbo:reference 引用配置,用于創(chuàng)建一個(gè)遠(yuǎn)程服務(wù)代理,一個(gè)引用可以指向多個(gè)注冊(cè)中心。對(duì)應(yīng)ReferenceBean
dubbo:protocol 協(xié)議配置,用于配置提供服務(wù)的協(xié)議信息,協(xié)議由提供方指定,消費(fèi)方被動(dòng)接受。對(duì)應(yīng)ProtocolConfig
dubbo:application 應(yīng)用配置,用于配置當(dāng)前應(yīng)用信息,不管應(yīng)用是服務(wù)提供方還是消費(fèi)方 。對(duì)應(yīng)ApplicationConfig
dubbo:module 模塊配置,用于配置當(dāng)前模塊信息,可選。對(duì)應(yīng)ModuleConfig
dubbo:registry 注冊(cè)中心配置。對(duì)應(yīng)RegistryConfig
dubbo:monitor 監(jiān)控中心配置。對(duì)應(yīng)MonitorConfig
dubbo:provider 提供者配置,當(dāng)沒(méi)有配置ProtocolConfigServiceBean時(shí),采用該配置項(xiàng),可選。對(duì)應(yīng)ProviderConfig
dubbo:consumer 消費(fèi)方配置,當(dāng)沒(méi)有配置ReferenceBean時(shí),采用該配置項(xiàng),可選。對(duì)應(yīng)ConsumerConfig
dubbo:method 方法配置
dubbo:argument 參數(shù)配置
6. Dubbo支持的協(xié)議
協(xié)議名稱(chēng) 實(shí)現(xiàn)描述 連接 使用場(chǎng)景
dubbo協(xié)議(默認(rèn)) 傳輸:mina、netty、grizzly<br />序列化:hessian2、java、json 缺省采用單一長(zhǎng)連接和NIO異步通信,TCP 1.傳入傳出參數(shù)數(shù)據(jù)包較小<br />2.消費(fèi)者數(shù)量遠(yuǎn)大于生產(chǎn)者<br />3.常規(guī)遠(yuǎn)程服務(wù)調(diào)用<br />4.不適合傳輸大數(shù)據(jù)量的服務(wù),比如文件、視頻等
rmi 傳輸:rmi java<br />序列化:java標(biāo)準(zhǔn)序列化 連接個(gè)數(shù):多連接<br />連接方式:短連接<br />傳輸協(xié)議:TCP/IP<br />傳輸方式:BIO 1.常規(guī)RPC調(diào)用<br />2.傳入傳出參數(shù)大小包混合<br />3.可傳文件<br />4.不支持防火墻穿透<br />5.生產(chǎn)者和消費(fèi)者數(shù)量差不多
hessian 傳輸:servlet容器<br />序列化:hessian2 連接個(gè)數(shù):多連接<br />連接方式:短連接<br />傳輸協(xié)議:HTTP<br />傳輸方式:同步傳輸 1.生產(chǎn)者的數(shù)量比消費(fèi)者多<br />2.可傳文件<br />3.傳入傳輸參數(shù)數(shù)據(jù)包較大<br />4.跨語(yǔ)言傳輸
http 傳輸:servlet容器<br />序列化:表單序列化JSON<br />采用Spring的httpInvoker實(shí)現(xiàn),基于表單的遠(yuǎn)程服務(wù)調(diào)用 連接個(gè)數(shù):多連接<br />連接方式:短連接<br />傳輸協(xié)議:HTTP<br />傳輸方式:同步傳輸 1.生產(chǎn)者多余消費(fèi)者<br />2.數(shù)據(jù)包大小混合<br />3.需同時(shí)給應(yīng)用程序和瀏覽器使用的服務(wù)
webservice 傳輸:HTTP<br />序列化:SOAP文本序列化 連接個(gè)數(shù):多連接<br />連接方式:短連接<br />傳輸協(xié)議:HTTP<br />傳輸方式:同步傳輸 1.系統(tǒng)集成<br />2.跨語(yǔ)言傳輸
thrift 與thrift rpc實(shí)現(xiàn)集成,并在基礎(chǔ)上修改了報(bào)文頭 長(zhǎng)連接、NIO異步傳輸
memcached
redis
7.支持的序列化框架

hessian(默認(rèn))、dubbo(不建議)、fastjson、Java自帶序列化

8. 支持的通信框架

默認(rèn)是Netty的NIO通信,還支持mina、Grizzly、Http等

9. 支持的集群容錯(cuò)機(jī)制
集群容錯(cuò)方案 說(shuō)明
Failover Cluster(默認(rèn)) 失敗自動(dòng)切換,自動(dòng)重試其他服務(wù)器
Failfast Cluster 快速失敗,立即報(bào)錯(cuò),只發(fā)起一次調(diào)用
Failsafe Cluster 失敗安全,出現(xiàn)異常時(shí),直接忽略
Failback Cluster 失敗自動(dòng)恢復(fù),記錄失敗請(qǐng)求,定時(shí)重發(fā)
Forking Cluster 并行調(diào)用多個(gè)服務(wù)器,只要一個(gè)成功立即返回
Broadcast Cluster 廣播逐個(gè)調(diào)用所有生產(chǎn)者,任意一個(gè)報(bào)錯(cuò)則報(bào)錯(cuò)

讀操作建議使用Failover失敗自動(dòng)切換,默認(rèn)重試兩次

寫(xiě)操作建議使用Failfast快速失敗,調(diào)用一次失敗就報(bào)錯(cuò)

10. 支持的負(fù)載均衡算法
負(fù)載均衡測(cè)量 說(shuō)明
Random LoadBalance(默認(rèn)) 隨機(jī),按權(quán)重分配隨機(jī)概率
RoundRobin LoadBalance 輪詢(xún),按公約后的權(quán)重設(shè)置輪詢(xún)比率
LeastActive LoadBalance 最少活躍調(diào)用數(shù),相同活躍數(shù)的隨機(jī)
ConsistendHash LoadBalance 一致性Hash,相同參數(shù)的請(qǐng)求總是發(fā)到同一生產(chǎn)者
11. 支持的注冊(cè)中心
  • Multicast注冊(cè)中心
  • Zookeeper注冊(cè)中心
  • Redis注冊(cè)中心
  • Simple注冊(cè)中心
12. 服務(wù)暴露和服務(wù)消費(fèi)的過(guò)程

服務(wù)暴露:在容器啟動(dòng)時(shí),按照Spring的加載流程初始化BeanDefinition,把服務(wù)提供者解析成ServiceBean。然后調(diào)用export()方法進(jìn)行暴露。(暴露過(guò)程相當(dāng)長(zhǎng),以后慢慢看吧)

掌握之分布式-1.Dubbo

  1. ServiceBean拿到對(duì)外提供服務(wù)的實(shí)際類(lèi)ref(如HelloWorldImpl)
  2. 通過(guò)ProxyFactorygetInvoker()方法使用ref生成一個(gè)AbstractProxyInvoker實(shí)例。到這一步就完成了到Invoker的轉(zhuǎn)換
  3. Invoker轉(zhuǎn)換為Exporter,這個(gè)根據(jù)不同的協(xié)議會(huì)有不同的實(shí)現(xiàn)
    • Dubbo的實(shí)現(xiàn):發(fā)生在DubboProtocolexport(),主要是打開(kāi)socket偵聽(tīng)服務(wù),并接收客戶(hù)端發(fā)來(lái)的各種請(qǐng)求
    • RMI的實(shí)現(xiàn):發(fā)生在RmiProtocolexport()

服務(wù)消費(fèi),分為消費(fèi)端的初始化和服務(wù)引用過(guò)程。

初始化:

  1. 把服務(wù)引用的信息封裝成URL,并注冊(cè)到zk中心
  2. 監(jiān)聽(tīng)注冊(cè)中心服務(wù)的上下線
  3. 連接服務(wù)提供端,創(chuàng)建NettyClient對(duì)象
  4. 將這些信息包裝成DubboInvoker消費(fèi)端的調(diào)用鏈,創(chuàng)建消費(fèi)端Invoker實(shí)例的服務(wù)代理并返回

服務(wù)引用:

  1. 經(jīng)過(guò)負(fù)載均衡策略,調(diào)用提供者
  2. 選擇其中一個(gè)服務(wù)的URL與提供者netty建立連接,使用ProxyFactory創(chuàng)建遠(yuǎn)程代理或本地通信的Invoker,并將Invoker發(fā)送到netty提供端
  3. 服務(wù)提供端接到該Invoker請(qǐng)求后,找到對(duì)應(yīng)的本地Invoker,處理
  4. 獲取異步、同步處理結(jié)果
    • 異步調(diào)用,不需要立即拿到返回值,使用ExchangeClient.send()
    • 同步調(diào)用,需要立即拿到返回值,使用ExchangeClient.request(),返回一個(gè)ResponseFuture,一直阻塞到拿到返回值

掌握之分布式-1.Dubbo

  1. ReferenceBeaninit()方法調(diào)用Protocalref()方法生成Invoker實(shí)例
  2. Invoker實(shí)例轉(zhuǎn)換成客戶(hù)端需要的接口類(lèi)
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI