手写RPC---⑦实现server模块(上)

在server包下创建一个配置类RpcServerConfig
在这里插入图片描述
这个配置类 主要有三个作用:

@Data
//server配置类
public class RpcServerConfig {
    //1.使用哪个网络模块。
    //2.使用哪个序列化的实现。
    //3.RPC的server启动之后,监听什么端口。

                    //接口可以继承接口
    private Class<? extends TransportServer> transportClass
            = HttpTransportServer.class;//赋一个默认值
    //序列化
    private Class<? extends Encoder> encoderClass = JSONEncoder.class;//附一个默认值
    //反序列化
    private Class<? extends Decoder> dncoderClass = JSONDecoder.class;//附一个默认值
    //监听的端口
    private  int port = 3000;

}

再创建一个类ServiceManager,管理RPC服务

//管理RPC 暴露的Service服务,
public class ServiceManager {
    //两个服务  一个注册 一个查找
    //KEY是服务的描述( 包括类、方法、返回类型、参数) value是service的一个具体实现。
    private Map<ServiceDescriptor,ServiceInstance> service;
	   //注册方法  第一个参数:注册时指定一个接口(一个接口的class),第二个参数:服务具体的提供者设定成单例的,
                                                // 是第一个参数接口具体子类实现的一个对象,所以用一个泛型 关联起来。
    public <T> void register(Class<T> interfaceClass,T bean){
        //把第一个接口中所有的方法扫描出来,然后和bean绑定起来形成一个ServiceInstance放入Map变量service里
		//补全代码在下面

    }
}

在之前的表示服务的类ServiceDescriptor中添加方法from ,用于返回服务的描述信息:

表示服务的类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ServiceDescriptor {
    private String clazz; //类
    private String method; //方法
    private String returnType;  //返回类型
    private String[]  parameterTypes;  //参数

    //第一个参数 一个class 一个方法  此方法主要用于返回服务的描述
    public static ServiceDescriptor from(Class clazz, Method method){
        ServiceDescriptor serDes = new ServiceDescriptor();
        //set类名
        serDes.setClazz(clazz.getName());
        //set方法名
        serDes.setMethod(method.getName());
        //set方法的返回类型
        serDes.setReturnType(method.getReturnType().getName());
        //获取方法参数的类型
        Class[] methodTypes = method.getParameterTypes();
        //将获取到的方法参数类型  循环赋值给一个String数组
        String[]  parameterTypes = new String[methodTypes.length];
        for (int i = 0; i < methodTypes.length; i++) {
            parameterTypes[i] = methodTypes[i].getName();
        }
        //方法参数类型String数组 -> set给成员变量parameterTypes
        serDes.setParameterTypes(parameterTypes);
        //返回
        return serDes;
    }
}

补全注册方法:

    public <T> void register(Class<T> interfaceClass,T bean){
        //把第一个接口中所有的方法扫描出来,然后和bean绑定起来形成一个ServiceInstance放入Map变量service里

        //获取接口中的所有方法
        Method[] methods = ReflectionsUtils.getPublicMethods(interfaceClass);
        //循环接口中的方法
        for (Method method : methods) {
               //ServiceInstance表示一个具体的服务
            ServiceInstance sis = new ServiceInstance(bean,method);
            //调用描述服务类的from方法 得到类和方法的信息
            ServiceDescriptor sdp = ServiceDescriptor.from(interfaceClass, method);
            //然后put进成员变量service
            service.put(sdp,sis);
         /*   如此一来 我们就把所有的interfaceClass里面的方法都当成服务注册到
                         管理RPC 暴露的Service服务类 ——> ServiceManager里面了*/
            log.info("register service: {} {}",sdp.getClazz(),sis.getMethod());

        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值