RPC
remote procedure call,远程过程调用,顾名思义就是向远程计算机发送请求来获取服务。对于开发人员来说,调用远程服务就像是调用本地服务一样便捷。尤其是在微服务盛行的今天,了解RPC的原理过程是十分有必要的。今天我就来实现一个简单的RPC的功能。
建立三个maven项目
- rpc-sever: 服务端,即服务的提供者
- rpc-client: 客户端,即服务的消费者
- rpc-common: 公共包,提供服务端和客户端依赖的公共包
先编写rpc-common
- 定义一个简单的对象Student
@Data
public class Student implements Serializable {
private String stuName;
private Integer stuAge;
}
上面用到的lombok的注解,可以节省些代码,在maven中引入lombok依赖并在IDE里安装好lombok插件即可。
- 定义一个服务的接口StudentService
public interface StudentService {
String sayHello(String student);
String printStudent(Student student);
}
- 定义一个请求的RpcRequest,来封装请求的服务,以及参数
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RpcRequest implements Serializable {
private String className;
private String methodName;
private Object[] parameters;
}
这些就是rpc-client和rpc-sever依赖的一些公共类,在rpc-client和rpc-sever的pom文件都依赖进去。
再编写rpc-sever
编写服务实现类StudentServiceImpl
public class StudentServiceImpl implements StudentService {
@Override
public String sayHello(String student) {
return "hello," + student;
}
@Override
public String printStudent(Student student) {
return student.toString();
}
}
编写服务的代理类RpcServerProxy,这里用BIO方式,来处理请求。
public class RpcServerProxy {
ExecutorService executorService = Executors.newFixedThreadPool(10);
public void publisher(Object server, int port) {
try (ServerSocket serverSocket = new ServerSocket(port);){
while (true) {
//持续监听请求
Socket socket = serverSocket.