在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());
}
}