當我們的web系統很大的時候,我們就需要使用分佈式框架
分佈式框架都用到了RPC
可以讓客戶端像調用本地服務一樣調用遠程服務
其本質是通過Socket鏈接服務端, 然後向服務端發送需要調用的服務的接口
然後服務端向客戶端返回實現了接口的對象
客戶端就直接調用了
我們看一下最終效果
IStudent invokeServer = new ServerInvoker<IStudent>().getInvokeServer(IStudent.class, "localhost", 9999);
invokeServer.ml();
接下來我們看一下服務類
服務類有兩個主方法 註冊和啓動
首先我們需要將接口的對象保存到容器中
private void inflate(Map<Class,Object> container,File file) throws Exception {
if(file!=null&&file.isFile()){
if(file.getName().endsWith(".java")){
Class<?> aClass = Class.forName(getClassName(file.getAbsolutePath()));
if(aClass.isInterface())
return;
Object o = aClass.newInstance();
container.put(Class.forName(getClassName(file.getAbsolutePath())), o);
//還要將接口和實現類的映射關係放到map
for(Class c:aClass.getInterfaces()){
container.put(Class.forName(c.getName()),o);
}
}
}
//如果是文件夾,遞歸調用
if(file!=null&&file.isDirectory()){
for(File f:file.listFiles()){
inflate(container,f);
}
}
}
然後啓動服務
//開啓服務,接受客戶端的服務調用
public void start(int port) {
try {
ServerSocket serverSocket=new ServerSocket(port);
System.out.println("服務端已經開啓了");
while(true){
Socket accept = serverSocket.accept();
InputStream is = accept.getInputStream();
OutputStream outputStream = accept.getOutputStream();
ObjectInputStream objectInputStream=new ObjectInputStream(is);
ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
System.out.println("收到客戶端的服務調用請求");
Object o = objectInputStream.readObject();
System.out.println(o);
//給客戶端寫入
objectOutputStream.writeObject(container.get(o));
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
服務啓動後就等客戶端來調用了
//從遠程服務獲得對象
public T getInvokeServer(Class c,String address,int port) throws IOException, ClassNotFoundException {
Socket socket=new Socket(address,port);
String name = c.getName();
OutputStream outputStream = socket.getOutputStream();
ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
System.out.println("客戶端向服務端發送請求調用服務");
objectOutputStream.writeObject(c);
ObjectInputStream objectInputStream=new ObjectInputStream(socket.getInputStream());
return (T) objectInputStream.readObject();
}
完整代碼可以去我的GitHub