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

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

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

    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后,就可以使用反射调用对应方法:

   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后接下来需要根据方法名和方法的参数类型来获取到对应方法,获取到之后再调用方法获取结果,并返回。

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

        

相关推荐

  1. DangerWind-RPC-framework---服务反射调用

    2024-07-16 11:02:01       25 阅读
  2. DangerWind-RPC-framework---三、服务下机

    2024-07-16 11:02:01       21 阅读
  3. DangerWind-RPC-framework---一、服务注册与发现

    2024-07-16 11:02:01       24 阅读
  4. DangerWind-RPC-framework---四、SPI

    2024-07-16 11:02:01       21 阅读
  5. DangerWind-RPC-framework---七、序列化算法

    2024-07-16 11:02:01       22 阅读
  6. DangerWind-RPC-framework---六、负载均衡

    2024-07-16 11:02:01       20 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 11:02:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 11:02:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 11:02:01       58 阅读
  4. Python语言-面向对象

    2024-07-16 11:02:01       69 阅读

热门阅读

  1. LeetCode 162. 寻找峰值

    2024-07-16 11:02:01       23 阅读
  2. 来聊聊Socket,WebSocket和MQTT的区别

    2024-07-16 11:02:01       22 阅读
  3. 探索老年综合评估实训室的功能与价值

    2024-07-16 11:02:01       22 阅读
  4. com.alibaba.fastjson与net.sf.json相互转换

    2024-07-16 11:02:01       20 阅读
  5. 结合案例简单介绍无人驾驶汽车

    2024-07-16 11:02:01       21 阅读
  6. Super-Mario-Host(超级玛丽)靶机

    2024-07-16 11:02:01       23 阅读
  7. 大语言模型里的微调vs RAG vs模板提示词

    2024-07-16 11:02:01       21 阅读
  8. 低空经济迅猛发展的几个因素

    2024-07-16 11:02:01       20 阅读
  9. 第19集《修习止观坐禅法要》

    2024-07-16 11:02:01       16 阅读