麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

基于TCP的RPC

2019-11-08 03:22:57
字體:
供稿:網(wǎng)友

《大型分布式網(wǎng)站架構(gòu)設(shè)計(jì)與實(shí)踐》

RPC名詞解釋

RPC即遠(yuǎn)程過程調(diào)用,單臺(tái)服務(wù)器的處理能力受到硬件成本的限制,不可能無限制的提升。RPC就將原來的本地調(diào)用轉(zhuǎn)變?yōu)檎{(diào)用遠(yuǎn)端服務(wù)器的方法,給系統(tǒng)的處理能力和吞吐量帶來了近似于無限提升的可能。

RPC的實(shí)現(xiàn)包括客戶端和服務(wù)端,即服務(wù)調(diào)用方、服務(wù)提供方。

隨著業(yè)務(wù)的增加,不同的服務(wù)之間需要進(jìn)行分組以隔離不同的業(yè)務(wù),避免相互影響,這樣,服務(wù)器的路由和負(fù)載均衡則成為必須要考慮的問題。


對(duì)象序列化

數(shù)據(jù)在網(wǎng)絡(luò)上進(jìn)行傳輸就要轉(zhuǎn)化為二進(jìn)制流。(這里使用java api)

import java.io.Serializable;/** * Created by yangenneng on 2017-02-17. * 功能說明: */public class Person implements Serializable { PRivate String name; private String passWord; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Person(){ this.name="zhangsan"; this.password="123456"; }}import java.io.*;/** * Created by yangenneng on 2017-02-17. * 功能說明: */public class ByteDemo { public static void main(String[] args) throws IOException, ClassNotFoundException { Person zhansan=new Person(); //字節(jié)數(shù)組輸出流 ByteArrayOutputStream os=new ByteArrayOutputStream(); ObjectOutputStream out=new ObjectOutputStream(os);//對(duì)象輸出流 out.writeObject(zhansan);//將對(duì)象寫入字節(jié)數(shù)組輸出,進(jìn)行序列化 byte[] zhansanByte=os.toByteArray(); System.out.println("-------------------"+zhansanByte+"----------------------------"); //字節(jié)數(shù)組輸入流 ByteArrayInputStream is=new ByteArrayInputStream(zhansanByte); //執(zhí)行反序列化,從流中讀取對(duì)象 ObjectInputStream in=new ObjectInputStream(is); Person lisi= (Person) in.readObject(); System.out.println("-------------------"+lisi.getName()+" "+lisi.getPassword()+"----------------------------"); }}

這里寫圖片描述


基于TCP協(xié)議實(shí)現(xiàn)RPC

客戶端想去的接口的名稱、需要調(diào)用的方法和需要傳遞的參數(shù),并通過Socket將其發(fā)送到服務(wù)提供方,等待服務(wù)相應(yīng)結(jié)果。 服務(wù)提供端事先將實(shí)例化好后放在serviers這個(gè)Map中,通過while循環(huán),并不斷的接受收到的消息,得到所需要的方法,執(zhí)行后將結(jié)果返回給服務(wù)的消費(fèi)者。

package rpc;/** * Created by yangenneng on 2017-02-17. * 功能說明:問好的接口 */public interface SayHelloService { public String sayHello(String str);}package rpc;/** * Created by yangenneng on 2017-02-17. * 功能說明: */public class SayHelloServiceImpl implements SayHelloService { @Override public String sayHello(String str) { return str.equals("hello") ? "Hello" : "Bye"; }}package rpc;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.Method;import java.net.Socket;/** * Created by yangenneng on 2017-02-17. * 功能說明:服務(wù)請(qǐng)求者 */public class Consumer { public static void main(String[] args) throws NoSuchMethodException, IOException, ClassNotFoundException { //接口名稱 String interfacename=SayHelloService.class.getName(); //需要遠(yuǎn)程執(zhí)行的方法 Method method=SayHelloService.class.getMethod("sayHello",java.lang.String.class); //需要傳遞到服務(wù)端的參數(shù) Object[] arguments={"hello"}; Socket socket=new Socket("127.0.0.1",10001); //將方法名稱和參數(shù)傳遞到遠(yuǎn)端 ObjectOutputStream output=new ObjectOutputStream(socket.getOutputStream()); output.writeUTF(interfacename);//接口名稱 output.writeUTF(method.getName());//方法名稱 output.writeObject(method.getParameterTypes()); output.writeObject(arguments); //從遠(yuǎn)端讀取方法執(zhí)行結(jié)果 ObjectInputStream input=new ObjectInputStream(socket.getInputStream()); Object result=input.readObject(); }}package rpc;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.net.ServerSocket;import java.net.Socket;import java.util.HashMap;import java.util.Map;/** * Created by yangenneng on 2017-02-17. * 功能說明:服務(wù)提供者 */public class Provider { public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalaccessException { ServerSocket server=new ServerSocket(10001); Map services=new HashMap(); services.put(SayHelloService.class.getName(),new SayHelloServiceImpl()); while (true){ Socket socket=server.accept(); //讀取服務(wù)信息 ObjectInputStream input=new ObjectInputStream(socket.getInputStream()); String interfacename=input.readUTF();//接口名稱 String methodName=input.readUTF();//方法名稱 Class<?>[] parameterTypes=(Class<?>[])input.readObject();//參數(shù)類型 Object[] arguments= (Object[]) input.readObject();//參數(shù)對(duì)象 //執(zhí)行調(diào)用 Class serviceinterfaceclass=Class.forName(interfacename);//得到接口的class Object service=services.get(interfacename);//取得服務(wù)實(shí)現(xiàn)的對(duì)象 Method method=serviceinterfaceclass.getMethod(methodName,parameterTypes); Object result=method.invoke(service,arguments); ObjectOutputStream output=new ObjectOutputStream(socket.getOutputStream()); output.writeObject(result); } }}

在生產(chǎn)環(huán)境中,常常是多個(gè)客戶端同時(shí)發(fā)送多個(gè)請(qǐng)求到服務(wù)端,服務(wù)端 則需要同時(shí)接收和處理多個(gè)客戶端請(qǐng)求,涉及并發(fā)處理、服務(wù)路由、負(fù)載均衡等問題。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产精品久久久久久久久久妇女 | 污片视频网站 | 少妇淫片免费一级毛片 | 一区二区高清视频在线观看 | 一区二区视 | 国产成人精品一区二区视频免费 | 成人在线网站 | 毛片在线播放视频 | 国产一级在线免费观看 | av日韩在线免费观看 | 一区二区三区日韩精品 | 99国语露脸久久精品国产ktv | asian超清日本肉体pics | 狠狠久久伊人中文字幕 | 日本在线视 | 中文字幕国产欧美 | 色日本视频 | 一区二区三区欧美在线 | 91美女视频在线观看 | 成人18免费观看 | 日本精品久久久一区二区三区 | 黄色毛片视频在线观看 | 久久久久夜色精品国产老牛91 | 在线播放一区二区三区 | 激情网站免费观看 | 有兽焉免费动画 | 日产精品久久久一区二区开放时间 | 国产69精品久久久久9999不卡免费 | 蜜桃久久一区二区三区 | 日本看片一区二区三区高清 | 国产精品伊人久久 | 9797色 | 久久久精品视频国产 | 特黄一级小说 | 免费观看黄色片视频 | 91一区二区在线观看 | 成人在线视频播放 | 日本在线观看视频网站 | 精品三区视频 | 精品在线免费播放 | 免费看日韩av |