rpc调用
- 代码地址 查看代码
rpc称远程调用过程,在rpc调用过程中需要解决的几个问题。
- 代理
- 协议
- 序列化
技术选型
- 协议,我们使用java的socket编程套接字
- 代理,使用java的动态代理
- 序列化,使用java的原生的序列化。
rpc衍生出来的问题
- 注册中心的集群
- 负载均衡
- 服务的治理
- 容灾
这些问题我们不做处理,就是用最简单的bio对rpc远程调用进行简单的封装。
架构模型
- 注册中心提供服务注册,服务发现,注册中心之间的集群(暂不实现)
- 客户端启动时,向注册中心注册自己提供的服务。
- 调用方查询像注册中心查询到当前的服务,在本地进行存储。
- 数据结构说明 - 注册中心提供服务注册接口类
public class RegisterServerMesage implements Serializable
{
/**
* 提供服务id
*/
private String ip;
/**
* 端口
*/
private Integer port;
/**
* 实现类全限定名
*/
private String implClassName;
/**
* 接口全限定名
*/
private String interfaceClassName;
}
服务批量注册
public class GeneralHandleData implements Serializable
{
/**
* {@link ServerType}
*/
private Integer type;
/**
* 服务注册信息
*/
private List<RegisterServerMesage> list ;
/**
* 返回结果
*/
private Boolean result;
}
- 服务调用传输数据结构
public class Invoke implements Serializable
{
/** 调用方法名称*/
private String method;
/** 接口全限定名称*/
private String interfaceClassName;
/** 实现类全限定名称*/
private String implClassName;
/** 参数列表*/
private Object[] args;
/** 参数类型*/
private Class<?>[] paramsTypes;
/** 返回结果*/
private Object result;
}
-
客户端需要对调用参数进行封装为Invoke对象,并且对接口实行动态代理,封装好参数,请求服务方的ServerSocket即可
-
服务方提供服务,只需要拿到接口名称查询到实现类的class,进行反射调用。
-
就简单讲下数据结构吧,详细参考楼主代码。 代码中有调用示例, 依次启动,注册中心 - 两个server - 两个client 即可测试rpc的调用。