`

RPC Socket 服务调用模型

 
阅读更多

最近在看Dubbo  服务框架, 通过RPC 实现了输入和输出,并支持与Spring无缝结合。

 

做的很不错。

 

其中:ServiceProvider,ServiceConsumer

 

服务提供者需要输入输出的接口和实现;

 

服务消费者 只需要接口。

 

 

现在看了梁飞的日志,自己理解了一下他的代码,自己敲了一遍,理解了一下。

 

记录下来。

 

package com.mjp.rpc.study.rpcframe;

import java.io.IOException;
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;

public class RpcFramework {

    /**
     * @param service
     * @param port
     * @return
     * @throws Exception
     */
    public static Object serverInvoke(final Object service, int port) throws Exception {
        if (service == null) {
            throw new IllegalArgumentException(" service is null");
        }
        if (port < 1 || port > 65535) {
            throw new IllegalArgumentException(" port is not valid must in 1-65535");
        }
        ServerSocket server = new ServerSocket(port);
        while (true) {
            try {
                final Socket socket = server.accept();
                new Thread(new Runnable() {

                    @Override
                    public void run() {
                        ObjectOutputStream outs = null;
                        ObjectInputStream input = null;
                        try {
                            input = new ObjectInputStream(socket.getInputStream());
                           
                            String methodName = input.readUTF();
                           
                            Class<?>[] parameters = (Class<?>[])input.readObject();
                            Object[] arguments = (Object[])input.readObject();
                            outs = new ObjectOutputStream(socket.getOutputStream());
                            Method method = service.getClass().getMethod(methodName, parameters);
                            Object result = method.invoke(service, arguments);
                            outs.writeObject(result);
                        } catch (Exception ex) {
                            if(outs != null){
                                try {
                                    outs.writeObject(ex);
                                } catch (Exception e) {
                                }
                            }
                        }finally{
                            if(outs != null){
                                try {
                                    outs.close();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                            if(input != null){
                                try {
                                    input.close();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                            try {
                                socket.close();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();
                Thread.sleep(100);
            } catch (Exception ex) {
            }
        }
    }
   
    /**
     * @param interfaceClass
     * @param host
     * @param port
     * @return
     * @throws Exception
     */
    public static <T> T refer(final Class<T> interfaceClass ,final String host ,final int port) throws Exception{
        if(interfaceClass == null){
            throw new IllegalAccessException("interfaceClass is null");
        }
        if(host == null || host.trim().length() == 0){
            throw new IllegalAccessException("host is null");
        }
        if (port < 1 || port > 65535) {
            throw new IllegalArgumentException(" port is not valid must in 1-65535");
        }
       
        return (T)Proxy.newProxyInstance(interfaceClass.getClassLoader(),new Class<?>[]{interfaceClass},new InvocationHandler() {
           
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Socket socket = new Socket(host,port);
                ObjectOutputStream outs = null;
              
                try{
                    outs = new ObjectOutputStream(socket.getOutputStream());
                    outs.writeUTF(method.getName());
                    outs.writeObject(method.getParameterTypes());
                    outs.writeObject(args);
                    ObjectInputStream input = null;
                    try{
                        input = new ObjectInputStream(socket.getInputStream());
                        Object result = input.readObject();
                        if(result instanceof Throwable){
                            throw (Throwable)result;
                        }
                        return result;
                    }catch(Exception ex){
                        ex.printStackTrace();
                    }finally{
                        if(input != null){
                            input.close();
                        }
                    }
                   
                }catch(Exception ex){
                    ex.printStackTrace();
                }finally{
                    if(outs != null){
                        outs.close();
                    }
                }
               
                return null;
            }
        });
    }

}

package com.mjp.rpc.study.rpcframe;

public class RpcProvider {

    public static void main(String[] args) throws Exception{
        ITestService service = new TestServiceImpl();
        RpcFramework.serverInvoke(service, 2000);
    }

}

package com.mjp.rpc.study.rpcframe;

public class RpcConsumer {

    public static void main(String[] args) throws Exception {
        ITestService service = RpcFramework.refer(ITestService.class, "localhost", 2000);
        String result = service.helloWorld("mojianpo");
        System.out.println(result);
    }
}
package com.mjp.rpc.study.rpcframe;

public class RpcConsumer {

    public static void main(String[] args) throws Exception {
        ITestService service = RpcFramework.refer(ITestService.class, "localhost", 2000);
        String result = service.helloWorld("mojianpo");
        System.out.println(result);
    }
}

 

 

----------------------------------

package com.mjp.rpc.study.rpcframe;

public interface ITestService {

    public String helloWorld(String name);
}
package com.mjp.rpc.study.rpcframe;

public class TestServiceImpl implements ITestService{

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

   
}

分享到:
评论

相关推荐

    基于socket的rpc

    总结一下,基于Socket的RPC实现提供了一种基础的远程服务调用方式,但随着系统的复杂性和需求的增长,我们需要引入更先进的技术和工具。通过使用Netty作为底层通信库,我们可以提升通信效率和系统的并发处理能力。而...

    rpc远程调用库C语言实现

    RPC(Remote Procedure Call)是一种进程间通信技术,允许在一台计算机上的程序调用另一台计算机上的程序,使得分布式系统能够像调用本地函数一样调用远程服务。在本主题中,我们将深入探讨如何使用C语言实现RPC,并...

    RPC(远程调用)的资料

    RPC的基本结构遵循客户端-服务器(C/S)模型,类似于基于Socket的C/S编程,但它提供了一个更高级别的抽象。在RPC中,客户端发起一个调用,参数通过RPC传输层(可以是TCP或UDP,即TI-RPC)传递到服务器,然后根据预设...

    Java rpc框架简易版,类似dubbo分布式实现 (纯socket实现).zip

    9. **服务调用模型**:常见的服务调用模型有同步和异步两种。同步模型中,客户端发起请求后会阻塞等待响应;异步模型下,客户端发送请求后立即返回,然后通过回调或轮询等方式获取结果。 10. **心跳检测**:保持...

    基于Netty实现了dubbo rpc

    在分布式系统中,RPC(Remote Procedure Call)是一种常见且重要的通信机制,它允许一个程序调用另一个在不同进程中运行的程序,就像调用本地函数一样简单。Dubbo作为阿里巴巴开源的一款高性能、轻量级的RPC框架,...

    RPC通信模型(java)

    RPC(Remote Procedure Call)是一种进程间通信(IPC)技术,允许一个程序调用另一个不在同一台计算机上的程序。在Java中实现RPC通信模型,通常涉及客户端、服务端、序列化和网络通信等多个环节。以下是对这个主题的...

    RPC框架底层模拟

    RPC框架有多种调用模型,如同步阻塞、异步非阻塞、回调等。在同步阻塞模型中,调用方会等待直到返回结果;异步非阻塞模型中,调用方无需等待,可以继续执行其他任务;回调模型则是在结果准备好后通知调用方。`...

    使用netty自定义rpc通信框架

    本项目是基于Netty 4.0实现的自定义RPC通信框架,旨在为Java开发者提供一种高效、灵活的远程服务调用解决方案。 首先,我们来深入理解Netty的基本概念。Netty的核心是其NIO(非阻塞I/O)模型,它使用了Reactor模式...

    实现一个简单的RPC框架

    在RPC模型中,客户端(Client)发起一个函数调用请求,这个请求包含了目标函数的名称和参数。RPC框架负责将这个调用转换成网络消息,并通过socket发送到服务器(Server)端。服务器接收到消息后,通过反射机制找到...

    一个模块化的RPC服务器建立在Kohana.zip

    开发者可能已经实现了RPC请求的解析、服务调用和响应构造的逻辑,并将其与Kohana的MVC架构整合在一起,以提供高效且可扩展的服务。为了进一步理解这个项目,需要查看源代码并了解具体的实现细节。

    JAVA实的RPC框架

    总结以上,Java实现的RPC框架综合运用了JDK动态代理、NIO Socket通信、反射、注解、Protostuff序列化以及Zookeeper分布式协调服务,构建了一套高效、灵活的远程调用解决方案。通过理解这些核心技术,开发者可以更好...

    Socket 之 BIO、NIO、Netty 简单实现

    在Java中,Socket通信涉及三种不同的模型:BIO(Blocking I/O)、NIO(Non-blocking I/O)和Netty,这些都是实现高并发、高性能网络服务的重要手段。 **1. Socket基础** Socket,通常被称为套接字,是网络通信的...

    最简单的RPC框架源码.zip

    RPC调用模型通常有同步和异步两种。同步调用中,客户端会等待服务端的响应;异步调用则不等待,而是立即返回,通过回调或者Future对象获取结果。RPCDemo可能只实现了同步调用。 6. **异常处理**: 在RPC调用过程...

    java 手写rpc框架 rpc-server and rpc-client

    RPC(Remote Procedure Call)是一种进程间通信机制,允许程序在分布式环境下调用远程系统上的方法,就像调用本地方法一样简单。在这个Java手写RPC框架的项目中,我们主要关注两个核心部分:`rpc-server`和`rpc-...

    rpc.rar_remote

    RPC调用模型有同步、异步和回调等多种形式。同步调用是最常见的,等待服务器响应后才继续执行;异步调用不阻塞主线程,而是立即返回,通过回调或Future对象获取结果;对于耗时操作,异步调用可以显著提高系统响应...

    RPC.ex.rar_RPC Winsock_ex_rpc

    在RPC模型中,客户端发起请求,服务器端处理请求并返回结果。这个过程对客户端来说是透明的,它无需关心网络传输的细节,只需像调用本地函数那样调用远程服务。 2. **C++实现RPC**: 在C++中,实现RPC通常涉及以下...

    c/c++ json-rpc demo

    在C/C++中实现JSON-RPC可以帮助开发者创建分布式系统,使得服务间的通信变得更加简单。下面我们将深入探讨C/C++中的JSON-RPC相关知识点。 首先,理解JSON-RPC的基本概念非常重要。JSON-RPC允许客户端通过发送一个...

    Loadrunner基于socket编程

    RPC协议通常用于处理远程过程调用,而自定义协议则可以创建更复杂的通信模型。 - 使用Vuser脚本编写Socket通信时,LoadRunner提供了API函数,如`lr_socket()`、`lr_send_string()`、`lr_recv_string()`等,用于创建...

Global site tag (gtag.js) - Google Analytics