一、RPC简介
分布式系统的成员之一,解决服务之间的调用问题。远程调用时,RPC实现了调用远程服务能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。
二、RPC组成成员
- 动态代理
- 序列化
- 网络传输
- 调用服务API接口
本次RPC搭建使用的接口代理模式、Java默认Serializable序列化以及BIO网络传输方式
三、源码实现
- 动态代理模块封装
package com.ruider.Invoker;
/**
* 动态代理工厂,对相应的class生产其对应代理类
*/
import com.ruider.common.ServiceInformation;
import com.ruider.networkCommunication.BIOService;
import com.ruider.networkCommunication.NetIO;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class InvokerUtils implements InvocationHandler {
/**
* 调用服务类
*/
private Class clazz;
/**
* 调用服务管理
*/
private ServiceInformation serviceInformation;
/**
* 获取代理对象
* @param T
* @param url
* @param port
* @return
*/
public Object getBean (Class T, String url, int port) {
this.clazz = T;
ServiceInformation serviceInformation = new ServiceInformation();
serviceInformation.setServiceURL(url);
serviceInformation.setPort(port);
serviceInformation.setClassName(T.getName());
this.serviceInformation = serviceInformation;
return Proxy.newProxyInstance(T.getClassLoader(), new Class[]{
T}, this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
NetIO BIO = new BIOService();
this.serviceInformation.setMethod(method);
this.serviceInformation.setArgs(args);
return BIO.send(serviceInformation);
}
}
- 网络传输模块封装
package com.ruider.networkCommunication;
import com.ruider.common.ServiceInformation;
/**
* BIO服务
*/
public interface NetIO {
/**
* 客户端发送请求到其他服务端
* @param serviceInformation
* @return
*/
Object send (ServiceInformation serviceInformation);
/**
* 本机作为服务端接受请求并且处理请求
* @param port
*/
void recv (int port);
}
package com.ruider.networkCommunication;
import com.ruider.common.ServiceInformation;
import com.ruider.common.UserApi;
import com.ruider.server.UserService;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.ServerSocket;