java的遠(yuǎn)程調(diào)用核心在于解決rpc序列化和反序列化,但是要完成一個(gè)遠(yuǎn)程調(diào)用,最花力氣的并不是rpc的問(wèn)題,rpc的方案已經(jīng)有非常多的方案可以完成了址否,主要的問(wèn)題在于通訊機(jī)制、負(fù)載碎紊、選舉策略佑附、服務(wù)治理等方向,這些方向與本篇文章越扯越遠(yuǎn)仗考,我在這里只分享如何實(shí)現(xiàn)一個(gè)java的遠(yuǎn)程調(diào)用音同。
為了快速方便,項(xiàng)目是基于springboot開(kāi)發(fā)的秃嗜,2年前的項(xiàng)目了权均,寫(xiě)這個(gè)項(xiàng)目是當(dāng)時(shí)我對(duì)springcloud與dubbo還有spring的一些理解,應(yīng)該能給正在學(xué)習(xí)這些技術(shù)的人起到一些幫助锅锨。
項(xiàng)目地址?https://github.com/liuchengts/spring-boot-remote-invocation
設(shè)計(jì)思想是開(kāi)發(fā)一個(gè)開(kāi)箱即用的starter叽赊,提供了基本的配置,允許一個(gè)實(shí)現(xiàn)類(lèi)同時(shí)暴露多個(gè)服務(wù)(與dubbo不一樣)必搞,允許跨外網(wǎng)遠(yuǎn)程調(diào)用等等必指,有些有意思的地方,最新的分支版本在rewrite-1.0恕洲,穩(wěn)定可用的版本在master塔橡,更多細(xì)節(jié)請(qǐng)查看項(xiàng)目說(shuō)明
實(shí)現(xiàn)思路:
一、自定義注解或配置文件配置必要的信息
1研侣、在競(jìng)選leader上需要指定一個(gè)端口谱邪,不指定將使用當(dāng)前服務(wù)端口
2、在跨外網(wǎng)調(diào)用上需要指定目標(biāo)ip或者dns庶诡,可以多個(gè)
二、starter的實(shí)現(xiàn)
1咆课、注解到一個(gè)class上即可末誓,如果class實(shí)現(xiàn)了多個(gè)接口扯俱,會(huì)將多個(gè)接口全部開(kāi)放
2、這里使用的是hessian的序列化方案喇澡,所以生產(chǎn)者在spring框架啟動(dòng)完成后第一時(shí)間進(jìn)行bean的掃描創(chuàng)建注冊(cè)到springbean中迅栅。
3、在第二步的同時(shí)會(huì)進(jìn)行路由信息生成
4晴玖、當(dāng)生產(chǎn)者完成注冊(cè)后會(huì)進(jìn)行資源就緒事件的發(fā)布
5读存、收到事件觸發(fā)starter的配置中心進(jìn)行整個(gè)starter的啟動(dòng)前的自動(dòng)配置,其中包含有網(wǎng)絡(luò)環(huán)境檢測(cè)呕屎,啟動(dòng)配置掃描让簿,啟動(dòng)參數(shù)自動(dòng)配置、初始化并啟動(dòng)消費(fèi)者掃描器秀睛、初始化服務(wù)路由器尔当、初始化路由緩存組件、初始化網(wǎng)絡(luò)模塊蹂安、最后輸出配置信息
6椭迎、當(dāng)消費(fèi)者進(jìn)行消費(fèi)的時(shí)候會(huì)進(jìn)行提前的預(yù)裝配bean進(jìn)行注入,這里優(yōu)先內(nèi)網(wǎng)調(diào)用田盈,其次進(jìn)行外網(wǎng)調(diào)用畜号。這里可以實(shí)現(xiàn)生產(chǎn)者新增加一個(gè)服務(wù),消費(fèi)者無(wú)需重啟既可以調(diào)用到允瞧,因?yàn)槁酚尚畔⑹侨W(wǎng)分發(fā)的弄兜,只要能分發(fā)到路由信息即可進(jìn)行調(diào)用。資源注入的時(shí)候會(huì)自動(dòng)初始化bean進(jìn)行注入