1.http://blog.jobbole.com/92290/
?通俗易懂的講解rpc授药,client與server士嚎,服務(wù)的提供與調(diào)用。
java代理可實(shí)現(xiàn)透明化調(diào)用遠(yuǎn)程服務(wù)悔叽,兩種莱衩,jdk動(dòng)態(tài)代理(常用)和cglib(字節(jié)碼生成)
消息的必備結(jié)構(gòu),服務(wù)娇澎、方法笨蚁、requestId、timeout趟庄、參數(shù)類型和值括细,返回結(jié)果有requestId、code岔激、返回值勒极。
消息的編碼和解碼:序列化,hessian虑鼎、thrift等序列化解決方案辱匿。看重三點(diǎn)炫彩,通用性匾七,即支持的數(shù)據(jù)結(jié)構(gòu);性能江兢,空間時(shí)間復(fù)雜度昨忆;擴(kuò)展性,新字段的兼容等杉允。hessian介紹:http://www.cnblogs.com/niejunlei/p/5981910.html
通信方面邑贴,兩種IO模型,BIO/NIO叔磷;鏈接:http://blog.jobbole.com/88984/
requestID的重要性:客戶端先存到concurrentHashMap里拢驾,key是id,value是callback改基,等待結(jié)果繁疤,看一段代碼:客戶端發(fā)送請(qǐng)求后就異步加鎖去取,取不到時(shí),wait方法稠腊,釋放鎖躁染。
客戶端有有專門監(jiān)聽服務(wù)端消息的線程,得到結(jié)果后設(shè)置相應(yīng)的requestId的callback對(duì)象的值架忌,且是通過加鎖操作來喚醒等待的線程吞彤。
public Object get() {??????
??synchronized (this) {??// 旋鎖???????????
?while (!isDone) {??// 是否有結(jié)果了????????????????
wait(); //沒結(jié)果是釋放鎖,讓當(dāng)前線程處于等待狀態(tài)????????????}????????}????}
private void setDone(Response res) {????????
this.res = res;????????isDone = true;???????
?synchronized (this) { //獲取鎖鳖昌,因?yàn)榍懊鎤ait()已經(jīng)釋放了callback的鎖了? ? ? ? ? ??
notifyAll(); // 喚醒處于等待的線程????????}????}
捉急的格式备畦,上述可以理解到同步的同步調(diào)用rpc的實(shí)現(xiàn)方式低飒。
此時(shí)许昨,一個(gè)rpc若想被調(diào)用,不能單靠ip通知褥赊,zookeeper提供了服務(wù)的注冊(cè)與發(fā)現(xiàn)功能糕档,并且通過心跳檢測(cè)(socket長連接),可以找到可用的服務(wù)拌喉。簡(jiǎn)單理解速那,zookeeper可以充當(dāng)一個(gè)服務(wù)注冊(cè)表,zookeeper是個(gè)分布式文件系統(tǒng)尿背。每當(dāng)一個(gè)服務(wù)部署后端仰,都要將自己的服務(wù)注冊(cè)到zookeeper的某一路徑上:/{service}/{version}/{ip:port}, 比如我們的HelloWorldService部署到兩臺(tái)機(jī)器,那么zookeeper上就會(huì)創(chuàng)建兩條目錄:分別為/HelloWorldService/1.0.0/100.19.20.01:16888 ?/HelloWorldService/1.0.0/100.19.20.02:16888田藐。
socket長連接:https://www.cnblogs.com/lcplcpjava/p/6581179.html