RPC(遠程過程調用)

 

當我們的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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章