RPC
核心: 遠(yuǎn)程方法調(diào)用
有兩個(gè)微服務(wù)項(xiàng)目a,b,a中需要遠(yuǎn)程調(diào)用b的方法,通過rpc框架,a中只需要使用一個(gè)接口調(diào)用其方法,來實(shí)現(xiàn)調(diào)用到b中接口實(shí)現(xiàn)類的具體方法內(nèi)代碼
和本地方法調(diào)用相反,遠(yuǎn)程方法調(diào)用的方法體是在其他項(xiàng)目里,調(diào)用的項(xiàng)目中只存在一個(gè)接口
實(shí)現(xiàn)
服務(wù)提供方
- 接收網(wǎng)絡(luò)請求:rpc框架內(nèi)部啟動tomcat來接收網(wǎng)絡(luò)請求
- 處理網(wǎng)絡(luò)請求:rpc框架中自定義一個(gè)servlet,通過service()來內(nèi)部處理網(wǎng)絡(luò)請求
- 網(wǎng)絡(luò)請求內(nèi)容:調(diào)用方的網(wǎng)絡(luò)請求包含三部分內(nèi)容:接口名,方法名,方法參數(shù)
- 執(zhí)行服務(wù)調(diào)用:需要根據(jù)接口名找到其實(shí)現(xiàn)類執(zhí)行方法體,通過本地注冊表map來存儲接口及其實(shí)現(xiàn)類,那么b中啟動時(shí)就分為兩步
- 將接口及其實(shí)現(xiàn)類添加到本地注冊表
- 啟動tomcat容器
服務(wù)調(diào)用方只需要按照參數(shù)規(guī)定構(gòu)建http請求發(fā)送接收即可
服務(wù)調(diào)用方
本質(zhì)是構(gòu)建一次http請求,如何將其優(yōu)化為只需要調(diào)用接口方法呢
-->只需要讓接口有實(shí)現(xiàn)類,然后實(shí)現(xiàn)類的方法內(nèi)部構(gòu)建http請求
-->動態(tài)代理生成實(shí)現(xiàn)類,在invoke增強(qiáng)方法內(nèi)獲取參數(shù)構(gòu)建http請求
注冊中心
用于實(shí)現(xiàn)服務(wù)注冊與發(fā)現(xiàn),確保服務(wù)消費(fèi)者和提供者之間的動態(tài)尋址和通信
核心為 共享數(shù)據(jù),心跳機(jī)制,監(jiān)聽機(jī)制
想要不把服務(wù)提供方的ip地址寫死,引入注冊中心,將接口作為key,url組成list作為值進(jìn)行存儲
負(fù)載均衡實(shí)現(xiàn)?
比如將url組成的list取出,然后利用指定隨機(jī)算法取出目標(biāo)url
為什么要采用redis,nacos等單獨(dú)項(xiàng)目
因?yàn)橐WC注冊中心的map是多線程共享的
注冊中心還需要提供哪些實(shí)現(xiàn)?
心跳機(jī)制:如果一臺主機(jī)掛掉,則需要到list中刪除對應(yīng)url
本地緩存,變更監(jiān)控機(jī)制
采用注冊中心,那調(diào)用方每發(fā)一次請求都需要到注冊中心查數(shù)據(jù),然后再發(fā)送請求,等于多了一次網(wǎng)絡(luò)io
那么可以采用本地緩存存儲map數(shù)據(jù)
為了保證數(shù)據(jù)一致性就需要給注冊中心實(shí)現(xiàn)變更監(jiān)控機(jī)制,保證map變更要同步本地緩存中的數(shù)據(jù)
注重點(diǎn)
- 拓展性
- 網(wǎng)絡(luò)請求對象序列化接口應(yīng)對多次序列化方式
- 提供參數(shù)配置來啟動不同類型的網(wǎng)絡(luò)容器
拓展
報(bào)錯重試機(jī)制
記錄fengdongnan的知識產(chǎn)出文檔,歡迎大家來一起交流學(xué)習(xí)