服務(wù)注冊(cè)與發(fā)現(xiàn)
https://zhuanlan.zhihu.com/p/367854163
服務(wù)提供者(Service Provider):服務(wù)啟動(dòng)時(shí)將服務(wù)信息注冊(cè)到服務(wù)注冊(cè)表宽闲,服務(wù)退出時(shí)將服務(wù)注冊(cè)表的服務(wù)信息刪除掉。
服務(wù)消費(fèi)者(Service Consumer):從服務(wù)注冊(cè)表獲取服務(wù)提供者的最新網(wǎng)絡(luò)位置等服務(wù)信息,維護(hù)與服務(wù)提供者之間的通信窄瘟。
服務(wù)注冊(cè)表(Service Registry):聯(lián)系服務(wù)提供者和服務(wù)消費(fèi)者的橋梁秧了,維護(hù)服務(wù)提供者的最新網(wǎng)絡(luò)位置等服務(wù)信息赃泡。
服務(wù)注冊(cè)表是一個(gè)分布式的kv數(shù)據(jù)庫遍蟋,因此税灌,存在CAP問題限匣。根據(jù)CAP原則:分布式系統(tǒng)不能同時(shí)支持 C(一致性)、A(可用性)谍夭、P(分區(qū)容錯(cuò)性)需要根據(jù)自己的實(shí)際業(yè)務(wù)需求選擇CAP的其中兩個(gè)。
其提供了一個(gè)管理API和一個(gè)查詢API卤材。
Zookeeper
https://www.cnblogs.com/adamans/articles/13409234.html
Zookeeper 支持 CP,當(dāng)集群中如果有節(jié)點(diǎn)宕機(jī)則需要選舉 leader(FastLeaderElection),選舉過程需要 30 至 120 秒,選舉過程時(shí)集群不可用坯认,犧牲時(shí)間來保證數(shù)據(jù)一致性。
注冊(cè)與發(fā)現(xiàn)的工作流程
1.假設(shè) ZK 已經(jīng)啟動(dòng)氓涣,服務(wù)提供者啟動(dòng)時(shí)把服務(wù)注冊(cè)到 ZK 注冊(cè)中心;
2.ZK注冊(cè)中心和服務(wù)提供者之間建立一個(gè) Socket 長連接陋气,ZK 注冊(cè)中心定時(shí)向每個(gè)服務(wù)提供者發(fā)數(shù)據(jù)包劳吠,如果服務(wù)提供者沒響應(yīng),則剔除該服務(wù)提供者實(shí)例巩趁,把更新后的服務(wù)列表發(fā)送給所有服務(wù)消費(fèi)者(即通知)痒玩;(ZK通過創(chuàng)建當(dāng)前服務(wù)臨時(shí)節(jié)點(diǎn),當(dāng)ZK與服務(wù)提供者斷開連接(session超時(shí))則會(huì)刪除該臨時(shí)節(jié)點(diǎn))
3.服務(wù)消費(fèi)者啟動(dòng)時(shí)到 ZK 注冊(cè)中心獲取一份服務(wù)列表緩存到本地供以后使用议慰;
4.服務(wù)消費(fèi)者遠(yuǎn)程調(diào)用服務(wù)時(shí)蠢古,先從本地緩存找,如果找到則直接發(fā)起服務(wù)調(diào)用别凹,如果沒有則到 ZK 注冊(cè)中心獲取服務(wù)列表緩存到本地后再發(fā)起服務(wù)調(diào)用草讶;
5.當(dāng)其中一個(gè)服務(wù)提供者宕機(jī)或正常關(guān)閉時(shí),ZK 注冊(cè)中心會(huì)把該節(jié)點(diǎn)剔除炉菲,并通知所有服務(wù)消費(fèi)者更新本地緩存堕战;(ZK節(jié)點(diǎn)watch機(jī)制)
6.當(dāng)這個(gè)服務(wù)提供者正常啟動(dòng)后,ZK 注冊(cè)中心也能感知到拍霜,并通知所有服務(wù)消費(fèi)者更新本地緩存嘱丢。
Eureka
Eureka Server 集群當(dāng)中的每個(gè)節(jié)點(diǎn)都是通過 Replicate(即復(fù)制)來同步數(shù)據(jù),沒有主節(jié)點(diǎn)和從節(jié)點(diǎn)之分祠饺,所有節(jié)點(diǎn)都是平等而且數(shù)據(jù)都保持一致越驻。因?yàn)榻Y(jié)點(diǎn)之間是通過異步方式進(jìn)行同步數(shù)據(jù),不保證強(qiáng)一致性道偷,保證可用性缀旁,所以是 AP。
注冊(cè)與發(fā)現(xiàn)的工作流程
1.假設(shè) Eureka Server 已經(jīng)啟動(dòng)勺鸦,Eureka Client(服務(wù)提供者)啟動(dòng)時(shí)把服務(wù)注冊(cè)到 Eureka Server诵棵;
2.Eureka Client(服務(wù)提供者)每 30 秒(默認(rèn)可配置)向 Eureka Sever 發(fā) http 請(qǐng)求(即心跳),即服務(wù)續(xù)約祝旷;
3.Eureka Server90 秒沒有收到向 Eureka Client(服務(wù)提供者)的心跳請(qǐng)求履澳,則統(tǒng)計(jì) 15 分鐘內(nèi)是否存在 85% 的 Eureka Client(服務(wù)提供者)沒有發(fā)心跳嘶窄,如果是則進(jìn)行自我保護(hù)狀態(tài)(比如網(wǎng)絡(luò)不穩(wěn)定),如果不是則剔除該 Eureka Client(服務(wù)提供者)實(shí)例距贷;
4.Eureka Client(服務(wù)消費(fèi)者)定時(shí)調(diào)用 Eureka Server 接口獲取服務(wù)列表更新本地緩存柄冲;
5.Eureka Client(服務(wù)消費(fèi)者)遠(yuǎn)程調(diào)用服務(wù)時(shí),先從本地緩存找忠蝗,如果找到則直接發(fā)起服務(wù)調(diào)用现横,如果沒有則到 Eureka Server 獲取服務(wù)列表緩存到本地后再發(fā)起服務(wù)調(diào)用;
6.Eureka Client(服務(wù)提供者)應(yīng)用關(guān)閉時(shí)會(huì)發(fā) HTTP 請(qǐng)求到 Eureka Server阁最,服務(wù)端接受請(qǐng)求后把該實(shí)例剔除戒祠。
RPC
rpc:對(duì)于Java程序員而言,RPC就是遠(yuǎn)程方法調(diào)用速种。
遠(yuǎn)程方法調(diào)用和本地方法調(diào)用是相對(duì)的兩個(gè)概念姜盈,本地方法調(diào)用指的是進(jìn)程內(nèi)部的方法調(diào)用,而遠(yuǎn)程方法調(diào)用指的是兩個(gè)進(jìn)程內(nèi)的方法相互調(diào)用配阵。
如果實(shí)現(xiàn)遠(yuǎn)程方法調(diào)用馏颂,基本的就是通過網(wǎng)絡(luò),通過傳輸數(shù)據(jù)來進(jìn)行調(diào)用棋傍。
- RPC over Http:基于Http協(xié)議來傳輸數(shù)據(jù)
- PRC over Tcp:基于Tcp協(xié)議來傳輸數(shù)據(jù)
Dubbo
Dubbo一開始的定位就是RPC救拉,專注于兩個(gè)服務(wù)之間的調(diào)用。但隨著微服務(wù)的盛行瘫拣,除開服務(wù)調(diào)用之外亿絮,Dubbo也在逐步的涉獵服務(wù)治理、服務(wù)監(jiān)控麸拄、服務(wù)網(wǎng)關(guān)等等壹无,所以現(xiàn)在的Dubbo目標(biāo)已經(jīng)不止是RPC框架了,而是和Spring Cloud類似想成為了一個(gè)服務(wù)框架感帅。
- 負(fù)載均衡斗锭、集群容錯(cuò)、服務(wù)降級(jí)
- 本地存根失球、本地偽裝岖是、參數(shù)回調(diào)
- 異步調(diào)用、泛化調(diào)用实苞、動(dòng)態(tài)配置
- 管理臺(tái)豺撑、動(dòng)態(tài)配置、服務(wù)路由
Feign 可以與 Hystrix 組合使用黔牵,支持熔斷回退
Feign 可以與ProtoBuf實(shí)現(xiàn)快速的RPC調(diào)用