内容简介: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中的实现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python编程初学者指南
[美]Michael Dawson / 王金兰 / 人民邮电出版社 / 2014-10-1
Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python可以用于很多的领域,从科学计算到游戏开发。 《Python编程初学者指南》尝试以轻松有趣的方式来帮助初学者掌握Python语言和编程技能。《Python编程初学者指南》共12章,每一章都会用一个完整的游戏来演示其中的关键知识点,并通过编写好玩的小软件这种方式来学习编程,引发读者的兴趣,降低学习的难度。每章最后都会......一起来看看 《Python编程初学者指南》 这本书的介绍吧!