RPC在Java中的实现

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

内容简介: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中的实现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Lighttpd

Lighttpd

Andre Bogus / Packt Publishing / 2008-10 / 39.99

This is your fast guide to getting started and getting inside the Lighttpd web server. Written from a developer's perspective, this book helps you understand Lighttpd, and get it set up as securely an......一起来看看 《Lighttpd》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具