美文网首页
netty4.x学习六使netty实现自己的RPC

netty4.x学习六使netty实现自己的RPC

作者: 昨日已逝去 | 来源:发表于2018-12-26 16:27 被阅读9次

    一提到netty实现rpc,就让人情不自禁的想起Dubbo服务间的调用。下面就根据问题实现rpc。

    dubbo服务调用时,service是没有实现类的,service层调用的方法如何被处理?

    • service没有实现类,真正的实现类在调用的服务端,service调用方法的时候其实是被代理对象调用的。
            NettyClient client = new NettyClient();
    
            HelloService service =  (HelloService)client.getBean(HelloService.class);
    
            service.hello("are you ok?");
    
        public Object getBean(final Class<?> serviceClass) {
            return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                    new Class<?>[]{serviceClass}, (proxy, method, args) -> {
                        if (client == null) {
                            initClient();
                        }
                        // 设置参数
                        client.setPara( method.getName() +"#"+ args[0]);
                        return executor.submit(client).get();
                    });
        }
    

    服务端如何得知是哪个类调用的哪个方法?

    • service在调用代理类时,能获取被代理的接口名和方法名,再与参数进行加密处理等;在服务端则进行解密操作,根据内容进行service判断。
            return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                    new Class<?>[]{serviceClass}, (proxy, method, args) -> {
                        if (client == null) {
                            initClient();
                        }
                        // 设置参数,用于调用方法判断
                        client.setPara( method.getName() +"#"+ args[0]);
                        return executor.submit(client).get();
                    });
    
     if (msg.toString().startsWith(StringConfig.providerName)) {
    
                HelloService helloService = new HelloServiceImpl();
                String substring = msg.toString().substring(msg.toString().lastIndexOf("#"));
                String hello = helloService.hello(substring);
                ctx.writeAndFlush(hello);
                System.out.println("服务端发送成功!");
            }
    

    客户端如何获取返回的结果?

    • 当调用服务端时,我们让线程进入休眠状态,当我们客户端接受到服务端的信息后,进行线程唤醒,返回获取后的结果。
     public synchronized void channelRead(ChannelHandlerContext ctx, Object msg){
            result = msg.toString();
            System.out.println("收到服务发送的消息:"+result);
            notify();
    
        }
        @Override
        public synchronized Object call() throws InterruptedException {
            context.writeAndFlush(para);
            wait();
            return result;
        }
    

    项目地址 https://github.com/DespairYoke/netty/tree/master/netty-rpc

    相关文章

      网友评论

          本文标题:netty4.x学习六使netty实现自己的RPC

          本文链接:https://www.haomeiwen.com/subject/uyvhlqtx.html