您好,登錄后才能下訂單哦!
本章介紹分布式架構(gòu)的底層技術(shù)。主要說(shuō)明面試過(guò)程中可能被問(wèn)到的技術(shù)點(diǎn)。
Duboo
服務(wù)治理
Zookeeper
Dubbo是一個(gè)分布式、高性能、透明化的RPC(遠(yuǎn)程服務(wù)調(diào)用)服務(wù)框架, 提供服務(wù)自動(dòng)注冊(cè)、自動(dòng)發(fā)現(xiàn)等高效服務(wù)治理方案,可以和Spring無(wú)縫集成。
cdn.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)鍵。
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)行容器下面來(lái)解釋上述的兩張圖:
配置 | 配置說(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)有配置ProtocolConfig 或ServiceBean 時(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ù)配置 |
協(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 |
hessian(默認(rèn))、dubbo(不建議)、fastjson、Java自帶序列化
默認(rèn)是Netty的NIO通信,還支持mina、Grizzly、Http等
集群容錯(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ò)
負(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)者 |
服務(wù)暴露:在容器啟動(dòng)時(shí),按照Spring的加載流程初始化BeanDefinition,把服務(wù)提供者解析成ServiceBean
。然后調(diào)用export()
方法進(jìn)行暴露。(暴露過(guò)程相當(dāng)長(zhǎng),以后慢慢看吧)
ServiceBean
拿到對(duì)外提供服務(wù)的實(shí)際類(lèi)ref(如HelloWorldImpl)ProxyFactory
的getInvoker()
方法使用ref生成一個(gè)AbstractProxyInvoker
實(shí)例。到這一步就完成了到Invoker的轉(zhuǎn)換Invoker
轉(zhuǎn)換為Exporter
,這個(gè)根據(jù)不同的協(xié)議會(huì)有不同的實(shí)現(xiàn)
DubboProtocol
的export()
,主要是打開(kāi)socket偵聽(tīng)服務(wù),并接收客戶(hù)端發(fā)來(lái)的各種請(qǐng)求RmiProtocol
的export()
服務(wù)消費(fèi),分為消費(fèi)端的初始化和服務(wù)引用過(guò)程。
初始化:
NettyClient
對(duì)象DubboInvoker
消費(fèi)端的調(diào)用鏈,創(chuàng)建消費(fèi)端Invoker實(shí)例的服務(wù)代理并返回服務(wù)引用:
ExchangeClient.send()
ExchangeClient.request()
,返回一個(gè)ResponseFuture
,一直阻塞到拿到返回值ReferenceBean
的init()
方法調(diào)用Protocal
的ref()
方法生成Invoker
實(shí)例Invoker
實(shí)例轉(zhuǎn)換成客戶(hù)端需要的接口類(lèi)免責(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)容。