`
247687009
  • 浏览: 174283 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个极简版的RPC框架实现

    博客分类:
  • JAVA
RPC 
阅读更多
RPC (remote Procedure Call) 远程过程调用,即通过某种协议,可以让不在同JVM中的应用进行通信,方
法调用。RPC进行通信一般都socket协议,传送的数据一般是需要经过特定进行进行编排/反编排处理,
调用双方必须都遵守此协议,即可进行通信交互。在java中提供socket协议和实现,编排也提供了序列
化机制,还需要使用到动态代理机制。

完整代码如下

 

package cn.seafood.admin;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executors;

public enum Rpc {
        //使用enum实现单例
        RPC;
        
        //暴露服务
        private java.util.concurrent.ExecutorService executorService = Executors.newCachedThreadPool();
        public void export(final Object service, final int port) {
                try {
                        final Socket request = new ServerSocket(port).accept();
                        executorService.submit(new Runnable() {
                                @Override
                                public void run() {
                                        try (final ObjectInputStream os = new ObjectInputStream(request.getInputStream());
                                                        final ObjectOutputStream oos = new ObjectOutputStream(request
                                                                        .getOutputStream());) {
                                                final String methodName = os.readUTF();
                                                // 参数
                                                final Object[] args = (Object[]) os.readObject();
                                                // 方法的参数类型
                                                final Class<?>[] paramTypes = (Class<?>[]) os.readObject();
                                                // 获取到方法对象
                                                final Method method = service.getClass().getMethod(methodName,
                                                                paramTypes);

                                                final Object result = method.invoke(service, args);
                                                oos.writeObject(result);
                                                request.close();  
                                        } catch (Exception e) {
                                                e.printStackTrace();
                                        }
                                }
                        });
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
        
        //引用服务
        @SuppressWarnings("unchecked")
        public <T> T ref(Class<T> interfaceClass, final String host, final int port) {
                        //使用动态代理拦截所有的方法
                return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class<?>[] { interfaceClass },
                                new InvocationHandler() {
                                        @Override
                                        //对接口方法的调用都会调到该方法上 
                                        public Object invoke(Object proxy, Method method, Object[] args)
                                                        throws Throwable {
                                                //进行socket调用
                                                try (final Socket socket = new Socket(host, port);
                                                                final ObjectOutputStream oos = new ObjectOutputStream(
                                                                                socket.getOutputStream());
                                                                final ObjectInputStream ois = new ObjectInputStream(
                                                                                socket.getInputStream());) {
                                                        //写入调用方法名
                                                        oos.writeUTF(method.getName());
                                                        //写入参数
                                                        oos.writeObject(args);
                                                          //写入参数类型
                                                        oos.writeObject(method.getParameterTypes());
                                                        final Object result = ois.readObject();
                                                        return result;
                                                } catch (Exception e) {
                                                        return e;
                                                }
                                        }
                                });
        }
        //测试
        public static void main(String[] args) {
//                 RPC.export(new HelloRpcImpl(), 9999);
                final HelloRpc ref = RPC.ref(HelloRpc.class, "127.0.0.1", 9999);
                final String hello = ref.hello("liuyi");
                System.out.println(hello); // hello liuyi
        }
}

interface HelloRpc {
        public String hello(String name);
}

class HelloRpcImpl implements HelloRpc {

        @Override
        public String hello(String name) {
                return "hello" + name;
        }
}

 

 

1
1
分享到:
评论

相关推荐

    极简的Vertx/Kotlin RPC框架

    【标题】"极简的Vertx/Kotlin RPC框架"揭示了这个项目的核心是构建一个基于Vert.x和Kotlin的轻量级远程过程调用(RPC)框架,它旨在简化跨服务间的通信,尤其是在微服务架构中。Vert.x是一个用于构建反应式应用的...

    极简、易用、高性能的AIO通信框架,人人都能轻松应对百万级长连接场景 5G时代的通信微内核,适用于IM、RPC、IoT等诸多领域

    Smart Socket的设计哲学是“极简”,它将复杂的网络通信问题封装在一个简洁的API之下,使得开发者无需深入了解底层网络编程的复杂性,就能实现高效稳定的网络通信。这种设计理念极大地降低了开发难度,使得初级...

    基于 kitex RPC微服务 + Hertz HTTP服务完成的第三届字节跳动青训营-极简抖音后端项目.zip

    该项目是字节跳动第三届青训营的一项实践,旨在通过使用kitex RPC微服务和Hertz HTTP服务构建一个极简版的抖音后端系统。在这个项目中,参与者将深入理解如何利用现代技术栈来设计和实现高效、可扩展的分布式服务。 ...

    基于 grpc RPC微服务 + gin HTTP服务完成的第5届字节跳动青训营-极简抖音后端项目.zip

    在本项目中,我们主要探讨的是如何利用gRPC RPC微服务和gin HTTP服务来构建一个极简版的抖音后端系统。字节跳动青训营的这个项目旨在让学员们掌握现代云原生架构中的关键技术和实践。下面将详细阐述这两个核心技术...

    极简、易用、高性能的AIO通信框架

    标题中的“极简、易用、高性能的AIO通信框架”指的是一个专为网络通信设计的软件开发框架,它采用了异步I/O(Asynchronous Input/Output,简称AIO)模型,以提供高效的网络通信解决方案。AIO模型与传统的同步I/O模型...

    smart-socket-master.zip

    "smart-socket-master.zip"提供了一个极简、易用且高性能的AIO(Asynchronous I/O)通信框架,它被设计用于处理百万级的长连接场景,尤其适合IM(即时通讯)、RPC(远程过程调用)和IoT(物联网)等领域的应用。...

    demo-dubbo 极简 接口api 服务提供者消费组

    在IT行业中,Dubbo是一个非常重要的分布式服务框架,由阿里巴巴开源并广泛应用于微服务架构中。本项目"demo-dubbo 极简 接口api 服务提供者消费组"是针对Dubbo的一个简易示例,旨在帮助开发者快速理解和实践Dubbo的...

    开源项目-matryer-remoto.zip

    开源项目“matryer-remoto”是一个设计用于现代环境的极简RPC(远程过程调用)生态系统。RPC是一种通信协议,允许网络上的一个程序调用另一个程序,就像它们都在同一台计算机上运行一样。Remoto的目标是简化这个过程...

    redeo:用于构建与redis协议兼容的TCP服务器的高性能框架

    包含一个极简池客户端。 有关完整的文档和示例,请参阅各个软件包和官方API文档: : 。 例子 一个简单的服务器示例,其中包含两个命令: package main import ( "net" "github.com/bsm/redeo" ) func main () {...

    spring cloud hystrix原理介绍及使用

    Spring Cloud Hystrix是一个由Netflix开源的Java框架,用于在分布式系统中提供延迟和容错功能,特别适用于对微服务架构中的远程过程调用(RPC)进行控制。其核心目标是通过添加一个延迟容忍层来隔离各个微服务之间的...

Global site tag (gtag.js) - Google Analytics