rpc是什么
rpc全名是Remote Procedure Call撩满。意思就是遠(yuǎn)程接口調(diào)用葵第。一般用于我們的分布式系統(tǒng)中圣拄,從系統(tǒng)A調(diào)用系統(tǒng)B的一個(gè)接口嘴秸。可能你有個(gè)疑問庇谆,從系統(tǒng)A調(diào)用一個(gè)系統(tǒng)B的接口赁遗,我們平常使用http請(qǐng)求,或者webservice都可以調(diào)到系統(tǒng)B的接口族铆。但是這種方式的調(diào)用岩四,我們都需要寫一份建立http請(qǐng)求的代碼。一般的rpc框架哥攘,需要做到的是調(diào)用遠(yuǎn)程的服務(wù)跟調(diào)用本地的服務(wù)一樣剖煌。
比如系統(tǒng)B有如下接口:
public interface HelloService {
public String sayHello(String name);
}
然后系統(tǒng)B的實(shí)現(xiàn)是:
public class HelloServiceImpl implements HelloService {
public String sayHello(String name) {
return "Hello " + name;
}
}
如果我們?cè)谙到y(tǒng)B調(diào)用這個(gè)類的這個(gè)方法。我們一般會(huì)這么寫
HelloService helloService = new HelloService();
System.out.println(helloService.sayHello("123"));
rpc框架逝淹,所需要達(dá)到的效果耕姊,就是想讓你在系統(tǒng)A中也能使用類似上述的方式來進(jìn)行調(diào)用系統(tǒng)B的接口,即能類似調(diào)用本地方法的方式來調(diào)用遠(yuǎn)程方法
實(shí)現(xiàn)一個(gè)rpc需要什么
1.首先需要有服務(wù)的提供方provider吧
2.然后要有服務(wù)的調(diào)用方comusmer吧
3.consumer要知道對(duì)應(yīng)的provider在哪里栅葡,那就需要一個(gè)注冊(cè)中心吧茉兰,從這個(gè)注冊(cè)中心可以找到provider
4.有了注冊(cè)中心,可能同一個(gè)服務(wù)有好幾個(gè)服務(wù)器提供欣簇,那consumer需要選擇哪個(gè)服務(wù)器進(jìn)行服務(wù)調(diào)用规脸,這就是負(fù)載均衡坯约,所以也還要有一個(gè)負(fù)載均衡的算法
5.調(diào)用的協(xié)議要有把,http協(xié)議莫鸭,netty啥的闹丐?
6.網(wǎng)絡(luò)間傳輸需要序列化吧,序列化可以使用jdk默認(rèn)的序列化方式被因。
7.上述的從注冊(cè)中心發(fā)現(xiàn)服務(wù)卿拴,然后使用負(fù)載均衡算法選擇其中的一個(gè)服務(wù)器進(jìn)行調(diào)用,再選擇對(duì)應(yīng)的網(wǎng)絡(luò)傳輸協(xié)議梨与,再使用對(duì)應(yīng)的序列化方式堕花。這些我們進(jìn)行服務(wù)調(diào)用的時(shí)候希望使用上述的方式來調(diào)用,那調(diào)用的HelloService肯定是一個(gè)代理對(duì)象粥鞋,這個(gè)代理對(duì)象里封裝了上面的所有的操作航徙。
按照上面的邏輯,可以自己搭建一個(gè)簡(jiǎn)易的rpc框架陷虎。
依照上述邏輯寫了一個(gè)rpc的demo:https://github.com/nanjunbo/rpcDemo
更復(fù)雜的可以去看下dubbo的邏輯到踏,他分了10層服務(wù)。擴(kuò)展性很好尚猿,每一層都可以單獨(dú)抽出來供更上層調(diào)用窝稿。