千家信息网

Java中RPC的原理是什么

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章将为大家详细讲解有关Java中RPC的原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。package com.wish.RPC;imp
千家信息网最后更新 2026年10月31日Java中RPC的原理是什么

这篇文章将为大家详细讲解有关Java中RPC的原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

package com.wish.RPC;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInput;import java.io.ObjectInputStream;import java.io.ObjectOutput;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.atomic.AtomicBoolean;/** * RPC原理解析: * 服务器端: * 1、RPCServer#registService:主要作用就是提供了一个服务注册管理中心, *    用来保存被注册服务(如果是dubbo则是分布式服务框架,对应了不同机器的地址及端口发布的服务(dubbo还使用了zookeeper)) * 2、RPCServer#startServer:开启一个ServerSocket连接(new 一个ServiceTask服务,使用线程循环监听等待), *    等待客户端的远程socket连接调用 * 3、RPCServer#registService:定义一个注册服务接口。即将所有需要注册的服务保存起来,后续ServiceTask需要使用该接口对象, *    动态代理调用该接口对象方法,并将方法返回值通过socket网络通信方式,传递给该服务的Client客户端。 *     * 客户端: * 1、RPCClient#findService:根据serviceInterface接口名,通过动态代理生成被请求对象及通过InvocationHandler调用远程方法。 *    其中InvocationHandler里面,通过传入的ip和prot地址,开启一个socket连接,远程发送调用远端RPCServer注册的服务方法 *    然后通过远端RPCServer,的socket连接,讲返回对象通过socket网络通信传递过来,这样即获取到了远端服务的返回结果。 *     * 启动服务端: * 1、TestRPCServer#main:启动服务端,通过server.registService(new HelloWorld()) ; *    注册HelloWorld服务方法到RPCServer * 2、TestRPCServer#main:通过server.startServer(51234);启动RPCServer,监听来自client的socket请求 *  * 启动客户端: * 1、TestRPCClient#main:通过RPCClient.findService("127.0.0.1" , 51234 , IHelloWorld.class); *    调用客户端findService,获取HelloWorld对象,接下来即可以像使用本地一样使用远程服务方法 *  * PS:更多源码请访问:http://git.oschina.net/tantexian/wishRPC *  * @author tantexian * @since 2016年5月27日 上午9:44:46 */public class RPCServer {        private static final ExecutorService taskPool = Executors.newFixedThreadPool(50);        /**         * 服务接口对象库 key:接口名 value:接口实现         */        private static final ConcurrentHashMap serviceTargets = new ConcurrentHashMap();        private static AtomicBoolean run = new AtomicBoolean(false);        /**         * 注册服务         *          * @param service         */        public void registService(Object service) {                Class[] interfaces = service.getClass().getInterfaces();                if (interfaces == null) {                        throw new IllegalArgumentException("服务对象必须实现接口");                }                Class interfacez = interfaces[0];                String interfaceName = interfacez.getName();                serviceTargets.put(interfaceName, service);        }        /**         * 启动Server         *          * @param port         */        public void startServer(final int port) {                Runnable lifeThread = new Runnable() {                        @Override                        public void run() {                                ServerSocket lifeSocket = null;                                Socket client = null;                                ServiceTask serviceTask = null;                                try {                                        lifeSocket = new ServerSocket(port);                                        run.set(true);                                        while (run.get()) {                                                client = lifeSocket.accept();                                                serviceTask = new ServiceTask(client);                                                serviceTask.accept();                                        }                                } catch (IOException e) {                                        e.printStackTrace();                                }                        }                };                taskPool.execute(lifeThread);                System.out.println("服务启动成功...");        }        public void stopServer() {                run.set(false);                taskPool.shutdown();        }        public static final class ServiceTask implements Runnable {                private Socket client;                public ServiceTask(Socket client) {                        this.client = client;                }                public void accept() {                        taskPool.execute(this);                }                @Override                public void run() {                        InputStream is = null;                        ObjectInput oi = null;                        OutputStream os = null;                        ObjectOutput oo = null;                        try {                                is = client.getInputStream();                                os = client.getOutputStream();                                oi = new ObjectInputStream(is);                                String serviceName = oi.readUTF();                                String methodName = oi.readUTF();                                Class[] paramTypes = (Class[]) oi.readObject();                                Object[] arguments = (Object[]) oi.readObject();                                System.out.println("serviceName:" + serviceName + " methodName:" + methodName);                                Object targetService = serviceTargets.get(serviceName);                                if (targetService == null) {                                        throw new ClassNotFoundException(serviceName + "服务未找到!");                                }                                Method targetMethod = targetService.getClass().getMethod(methodName, paramTypes);                                Object result = targetMethod.invoke(targetService, arguments);                                oo = new ObjectOutputStream(os);                                oo.writeObject(result);                        } catch (IOException e) {                                e.printStackTrace();                        } catch (ClassNotFoundException e) {                                e.printStackTrace();                        } catch (SecurityException e) {                                e.printStackTrace();                        } catch (NoSuchMethodException e) {                                e.printStackTrace();                        } catch (IllegalArgumentException e) {                                e.printStackTrace();                        } catch (IllegalAccessException e) {                                e.printStackTrace();                        } catch (InvocationTargetException e) {                                e.printStackTrace();                        } finally {                                try {                                        if (oo != null) {                                                oo.close();                                        }                                        if (os != null) {                                                os.close();                                        }                                        if (is != null) {                                                is.close();                                        }                                        if (oi != null) {                                                oi.close();                                        }                                } catch (IOException e) {                                        e.printStackTrace();                                }                        }                }        }}package com.wish.RPC;import java.io.InputStream;import java.io.ObjectInput;import java.io.ObjectInputStream;import java.io.ObjectOutput;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.net.Socket;public class RPCClient {        /**      * 根据接口类型得到代理的接口实现      * @param       * @param host  RPC服务器IP      * @param port  RPC服务端口      * @param serviceInterface  接口类型      * @return  被代理的接口实现      */      @SuppressWarnings("unchecked")      public static  T findService(final String host , final int port ,final Class serviceInterface){          return (T) Proxy.newProxyInstance(serviceInterface.getClassLoader(), new Class[]{serviceInterface}, new InvocationHandler() {              @SuppressWarnings("resource")                        @Override              public Object invoke(final Object proxy, final Method method, final Object[] args)              throws Throwable {                  Socket socket = null ;                  InputStream is = null ;                  OutputStream os = null ;                  ObjectInput oi = null ;                  ObjectOutput oo = null ;                  try {                      socket = new Socket(host, port) ;                      os = socket.getOutputStream() ;                      oo = new ObjectOutputStream(os);                      oo.writeUTF(serviceInterface.getName()) ;                      oo.writeUTF(method.getName()) ;                      oo.writeObject(method.getParameterTypes()) ;                      oo.writeObject(args);                      is = socket.getInputStream() ;                      oi = new ObjectInputStream(is) ;                      return oi.readObject() ;                  } catch (Exception e) {                      System.out.println("调用服务异常...");                      return null ;                  }finally{                      if(is != null){                          is.close() ;                      }                      if(os != null){                          is.close() ;                      }                      if(oi != null){                          is.close() ;                      }                      if(oo != null){                          is.close() ;                      }                      if(socket != null){                          is.close() ;                      }                  }              }          });       }  }package com.wish.RPC;public class HelloWorld implements IHelloWorld {        @Override        public String sayHello(String name) {                return "Hello, " + name;        }}package com.wish.RPC;public interface IHelloWorld {        String sayHello(String name);}package com.wish.RPC;public class TestRPCServer {        public static void main(String[] args) {          RPCServer server = new RPCServer() ;          server.registService(new HelloWorld()) ;          server.startServer(51234) ;      }  }package com.wish.RPC;public class TestRPCClient {        public static void main(String[] args) {          IHelloWorld helloWorld =               RPCClient.findService("127.0.0.1" , 51234 , IHelloWorld.class) ;          String  result = helloWorld.sayHello("tantexian, My blog address is: http://my.oschina.net/tantexian/");          System.out.println(result );      }  }

关于Java中RPC的原理是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

服务 接口 对象 方法 客户 客户端 代理 原理 更多 内容 动态 地址 文章 服务器 知识 端口 篇文章 类型 网络 网络通信 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 亿人帮互联网科技有限公司 互联网是第几次科技革命的成果 麻工互联网科技 互联网科技的英文 北京互联网络科技有限公司 亿账通互联网科技 睿民互联网科技 互联网科技博客 佰商互联网科技有限公司 深圳市运趣互联网科技有限公司 互联网科技教育视频 广州恒生互联网科技有限 华夏互联网科技业 亳州好赞互联网科技有限公司 广州百诚互联网科技有限公司官网 美国互联网科技公司 互联网安防科技感 抖集互联网科技技术咨询 兰石爱特工业互联网科技分公司 盐城市攀科互联网科技有限公司 世界互联网领先科技成果 万达互联网科技 东莞新华互联网科技学校 互联网科技创新的路径 伊宁互联网科技做什么的 互联网时代的科技公司 互联网相关科技技术 半导体行业属于互联网高科技类吗 互联网硬科技公司 知域互联网科技有限公司官网
0