RPC在Java中的实现

栏目: Java · 发布时间: 6年前

内容简介:RPC是一种远程过程调用, 它是一种通过网络从远程计算机程序上请求服务, 而不需要了解底层网络技术的协议RPC可以把远程服务像本地服务一样调用, 以在服务端实现这些接口, 客户端通过

RPC是一种远程过程调用, 它是一种通过网络从远程计算机程序上请求服务, 而不需要了解底层网络技术的协议

RPC可以把远程服务像本地服务一样调用, 以 Java 中为例, 客户端与服务端一般共用一个核心包, 核心包中包含了需要调用服务的接口

在服务端实现这些接口, 客户端通过 Socket 等方式连接服务端, 发生调用的信息(方法名, 参数等)

服务端接收后执行相应动作, 最后通过网络返回计算结果, 一次RPC调用就完成了

下面是 Java 中的简单实现

共用接口

public interface TestService {
    String print(String s);
}

一个简单的打印服务, 不包含实现

客户端

在客户端代码中自始至终没有编写服务的实现, 只有一个接口, 但是又可以得到服务的实例,

要做到这点需要用到 Java 中的动态代理 Proxy.newProxyInstance

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Consumer {
    
    public static void main(String[] as) {

        TestService service = (TestService) Proxy.newProxyInstance(TestService.class.getClassLoader(), new Class<?>[]{TestService.class}, (Object proxy, Method method, Object[] args) -> {
            try(Socket socket = new Socket()){
                socket.connect(new InetSocketAddress(12306));
                ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
                os.writeUTF(method.getName());
                os.writeObject(method.getParameterTypes());
                os.writeObject(args);
                return new ObjectInputStream(socket.getInputStream()).readObject();
            }catch (Exception e){
                return null;
            }
        });
        System.out.println(service.print("abc"));
    }
}

通过对象流把参数等信息发生给服务端

服务端

一般服务端是预先实例化服务, 以完整类名为 Key 把服务存进集合供调用, 或者依赖现成的 Springboot 等框架管理服务, 下面是服务端的实现

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Producer {

    public static void main(String[] args)  {

        TestService service = new TestServiceImpl();

        try (ServerSocket serverSocket = new ServerSocket()){
            serverSocket.bind(new InetSocketAddress(12306));

            try(Socket accept = serverSocket.accept()){
                ObjectInputStream is = new ObjectInputStream(accept.getInputStream());
                String methodName = is.readUTF();
                Class<?>[] parameterTypes = (Class<?>[]) is.readObject();
                Object[] arguments = (Object[]) is.readObject();
                Object result = TestService.class.getMethod(methodName,parameterTypes).invoke(service,arguments);
                new ObjectOutputStream(accept.getOutputStream()).writeObject(result);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

服务实例

服务端编写服务实例代码

public class TestServiceImpl implements TestService{

    @Override
    public String print(String s) {
        return "**"+s+"**";
    }
}

结果

至此可以看到客户端调用的

System.out.println(service.print("abc"));

打印出了

**abc**

就好像调用了本地服务一样


以上所述就是小编给大家介绍的《RPC在Java中的实现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

解码宇宙

解码宇宙

(美) 塞费 / 隋竹梅 / 上海科技教育出版社 / 2010-4 / 26.00元

《解码宇宙:新信息科学看天地万物》:宇宙,或许就是一台庞大的计算机。这是查尔斯·塞费在《解码宇宙:新信息科学看天地万物》中对宇宙做出的结论。作者从信息的特点开始谈起,详细论述了信息论和量子计算,向我们展示了一种不可思议的拜占庭式宇宙的情景,涉及生命的本质、热力学、相对论、量子力学、黑洞、多重宇宙,直至宇宙的命运。《解码宇宙:新信息科学看天地万物》资料翔实,内容丰富多彩,思路清晰,观点明确,读后使人......一起来看看 《解码宇宙》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具