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; } }
相关推荐
使用socket/反射/序列化等技术实现了一个基本的远程调用框架,可参考博客http://blog.csdn.net/u013177446/article/details/66473066
详细讲解RPC
jsonrpc是一个基于Java的高性能开源RPC框架
本专题主要通过三个章节实现一个rpc通信的基础功能,来学习RPC服务中间件是如何开发和使用。章节内以源码加说明实战方式来讲解,请尽可能下载源码学习。 - 手写RPC框架第一章《自定义配置xml》 - 手写RPC框架第二章...
可参考博客http://blog.csdn.net/u013177446/article/details/66473066 使用netty/反射/序列化反序列化等技术是一个一个简单的RPC框架
用Kotlin实现的极简的Vertx RPC框架,同时支持Java和Kotlin。
Java rpc框架简易版,类似dubbo分布式实现 (纯socket实现).zip
基于C++ module库 Protobuf Zookeeper 实现的Rpc框架.zip基于C++ module库 Protobuf Zookeeper 实现的Rpc框架.zip基于C++ module库 Protobuf Zookeeper 实现的Rpc框架.zip基于C++ module库 Protobuf Zookeeper 实现...
java原生实现的RPC框架,使用技术:JDK动态代理、Socket通信(BIO方式)、反射、注解、Java序列化
netty是一个高性能高度封装的nio框架,本文实现用netty实现一个简化的rpc框架
基于 C++ 的 RPC 框架.zip基于 C++ 的 RPC 框架.zip基于 C++ 的 RPC 框架.zip基于 C++ 的 RPC 框架.zip基于 C++ 的 RPC 框架.zip基于 C++ 的 RPC 框架.zip基于 C++ 的 RPC 框架.zip基于 C++ 的 RPC 框架.zip基于 C++...
grain是一个极简的、组件式的RPC框架,灵活且适合渐进学习,可与任何框架整合。同时包含系统通用多线程模型与消息通讯、多对多关系的分布式锁、基于Servlet的HTTP框架、基于系统通用多线程模型的Websocket框架、支持...
基于 Spark Netty Rpc 框架,重新实现的一个 Netty Rpc 框架 ( scala + java )
实现一个IoC/DI容器参考网址:https://blog.csdn.net/weixin_43042683/article/details/106456415 实现一个RPC框架参考网址: https://blog.csdn.net/weixin_43042683/article/details/106459282
根据题意,要实现一个 RPC 框架,实现对 printf 函数的远程调用。故大致可以分为两部分,RPC 框架的部分,以及 print 函数的部分,根据题目对其有不同的要求。
BootNettyRpc 是一个采用Netty实现的Rpc框架,适用于Spring Boot项目,支持Spring Cloud
不依赖任何第三方类库,自己实现一个JAVA版的最简单RPC框架。对理解dubbo,thrift原理有所帮助
一种轻量级分布式RPC框架设计与实现,方晓兵,赵天忠,随着互联网技术的发展,互联网应用日益增多,互联网企业为了吸引更多的用户,不断完善扩展自己的系统,系统的规模也变得越来越庞
基于dubbo实现的rpc框架RPC 框架指的是:可以让客户端直接调用服务端方法就像调用本地方法一样简单的框架,比如我前面介绍的 Dubbo、Motan、gRPC 这些.zip
一个自定义的RPC框架示例