承接着上一节,手把手教你写一个RPC框架(二) 我们定义了两个注解、编写了的连接Zookeeper注册中心的逻辑,这一节,我们继续来完成RPC框架吧!
七 序列化
RPC框架中,离不开网络请求,服务A调用服务B的方法,要发送一个网络请求,服务B收到网络请求后,解析请求,然后把方法的执行结果返回给服务A。为了实现这些步骤,需要编写消息请求体、消息相应体、序列化与反序列化的相关逻辑。下面一起来看看怎么写吧~
import lombok.Data;
import java.io.Serializable;
/**
* RPC请求体
*
* @author zhongmingyi
* @date 2021/12/12 1:01 下午
*/
@Data
public class RpcRequest implements Serializable {
/**
* 所请求的服务接口名
*/
private String serviceName;
/**
* 所请求的服务接口中,具体的方法名
*/
private String method;
/**
* 所请求的方法的参数类型
*/
private Class<?>[] methodParameterTypes;
/**
* 所请求的方法的参数
*/
private Object[] methodParameters;
}
上面这四个属性是一个RPC请求中必不可少的
- 所请求的服务接口名
- 所请求的服务接口中,具体的方法名
- 所请求的方法的参数类型
- 所请求的方法的参数
有了这些属性,我们才能从注册中心中找到对应的服务。当然有小伙伴肯定会问,RpcRequest中并没有所请求服务的IP地址和端口号,该怎么找到对应的地址啊?
其实在上一节,在注册中心编写的代码中,就有写到注册的逻辑:
package com.zhongger.rpc.register.impl;
import com.alibaba.fastjson.JSON;
import com.zhongger.rpc.entity.ServerNode;
import com.zhongger.rpc.register.RpcServiceRegister;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryNTimes;
import org.apache.zookeeper.CreateMode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URLEncoder;
/**
* @author zhongmingyi
* @date 2021/12/11 12:20 下午
*/
public class ZookeeperRpcServiceRegister implements RpcServiceRegister {
@Override
public void register