DangerWind-RPC-framework---五、服务端的反射调用

当服务端接收并解析来自客户端发出的数据之后,该如何调用客户端希望调用的方法呢?这主要是通过反射实现的。

在服务启动发布的过程中,在服务端已经存储了服务名和对应Bean的映射:

java 复制代码
    private final Map<String, Object> serviceMap;
    private final Set<String> registeredService;

    @Override
    public void addService(RpcServiceConfig rpcServiceConfig) {
        String rpcServiceName = rpcServiceConfig.getRpcServiceName();
        if (registeredService.contains(rpcServiceName)) {
            return;
        }
        registeredService.add(rpcServiceName);
        serviceMap.put(rpcServiceName, rpcServiceConfig.getService());
        log.info("Add service: {} and interfaces:{}", rpcServiceName, rpcServiceConfig.getService().getClass().getInterfaces());
    }

接收到对应数据后,首先就是需要找到对应的Bean,找到对应的Bean后,就可以使用反射调用对应方法:

java 复制代码
   public Object handle(RpcRequest rpcRequest) {
        Object service = serviceProvider.getService(rpcRequest.getRpcServiceName());
        return invokeTargetMethod(rpcRequest, service);
    }

    private Object invokeTargetMethod(RpcRequest rpcRequest, Object service) {
        Object result;
        try {
            Method method = service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamTypes());
            result = method.invoke(service, rpcRequest.getParameters());
            log.info("service:[{}] successful invoke method:[{}]", rpcRequest.getInterfaceName(), rpcRequest.getMethodName());
        } catch (NoSuchMethodException | IllegalArgumentException | InvocationTargetException | IllegalAccessException e) {
            throw new RpcException(e.getMessage(), e);
        }
        return result;
    }
}

getService就是从服务端注册时的本地缓存中取出Bean。得到Bean后接下来需要根据方法名和方法的参数类型来获取到对应方法,获取到之后再调用方法获取结果,并返回。

获取到相应结果之后,再按照相应的通信规则进行包装处理,发送给客户端进行响应。

相关推荐
23级二本计科1 小时前
C++ Json-Rpc框架-3项目实现(2)
服务器·开发语言·c++·rpc
Moment1 小时前
面试官:ping 的详细流程是怎么样的?🙉🙉🙉
前端·后端·网络协议
laimaxgg2 小时前
Dockerfile
linux·运维·服务器·ubuntu·docker
江沉晚呤时2 小时前
CAP 定理与 BASE 定理在 .NET Core 中的应用
java·服务器·开发语言·前端·.netcore
曼岛_3 小时前
若依框架前后端分离版部署全流程详解(本地+服务器+高级配置)
运维·服务器·框架搭建
张一不吃豆芽3 小时前
TCPIP详解 卷1协议 六 DHCP和自动配置
网络·网络协议·tcp/ip
Linux运维老纪3 小时前
Linux系统常见磁盘扩容操作(Common Disk Expansion Operations in Linux Systems)
linux·运维·服务器·前端·数据库·云计算·运维开发
政安晨4 小时前
【嵌入式人工智能产品开发实战】(二十)—— 政安晨:小智AI嵌入式终端代码解读:【C】关于项目中的MQTT+UDP核心通信交互理解
网络·c++·mqtt·网络协议·udp·小智ai·实时打断
谢尔登4 小时前
【uni-app】页面跳转传参
服务器·网络·uni-app
张一不吃豆芽5 小时前
TCPIP详解 卷1协议 四 地址解析协议
网络·网络协议·tcp/ip