`
young-2017
  • 浏览: 9493 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

rpc简单实现

    博客分类:
  • java
 
阅读更多
提供者:

public interface HelloService {

    String echo(String str);
}


public class HelloServiceImpl implements HelloService {

    public String echo(String str) {
        return "hello " + str;
    }
}

服务提供方通过反射调用:
package com.huayang.provider;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class RpcExporter {

    static Executor executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());


    public static void export(String hostName, int port) throws IOException {
        ServerSocket server = new ServerSocket();
        server.bind(new InetSocketAddress(hostName,port));
        try {
            while (true) {
                executor.execute(new ExportTask(server.accept()));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}


package com.huayang.provider;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.Socket;

public class ExportTask implements Runnable {

    Socket client = null;

    public ExportTask(Socket client) {
        this.client = client;
    }

    public void run() {
        ObjectInputStream input = null;
        ObjectOutputStream output = null;
        try {
            input = new ObjectInputStream(client.getInputStream());

            String interfaceName = input.readUTF();
            System.out.println("pro" + interfaceName);
            Class<?> service = Class.forName(interfaceName);

            String methodName = input.readUTF();
            Class<?>[] paramsterTypes = (Class<?>[]) input.readObject();

            Object[] arguments = (Object[]) input.readObject();
            Method method = service.getMethod(methodName, paramsterTypes);
            Object result = method.invoke(service.newInstance(), arguments);
            output = new ObjectOutputStream(client.getOutputStream());
            output.writeObject(result);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != output) {
                    output.close();
                }
                if (null != input) {
                    input.close();
                }
                if (client != null) {
                    client.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }


    }
}





消费方:
通过动态代理实现:
package com.huayang.consumer;

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.InetSocketAddress;
import java.net.Socket;

public class RpcImporter<S> {

    public S importer(final Class<?> serviceClass, final InetSocketAddress addr) {

        return (S) Proxy.newProxyInstance(serviceClass.getClassLoader(), new Class<?>[]{serviceClass.getInterfaces()[0]},
                new InvocationHandler() {
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                        Socket socket = null;
                        ObjectOutputStream output = null;
                        ObjectInputStream input = null;

                        socket = new Socket();
                        socket.connect(addr);
                        try {
                            output = new ObjectOutputStream(socket.getOutputStream());
                            output.writeUTF(serviceClass.getName());
                            output.writeUTF(method.getName());
                            output.writeObject(method.getParameterTypes());
                            output.writeObject(args);
                            input = new ObjectInputStream(socket.getInputStream());
                            return input.readObject();
                        } finally {
                            if (null != socket) {
                                socket.close();
                            }
                            if (null != output) {
                                output.close();
                            }
                            if (null != input) {
                                input.close();
                            }
                        }
                    }
                });
    }
}



测试类:
package com.huayang;

import com.huayang.consumer.RpcImporter;
import com.huayang.provider.HelloService;
import com.huayang.provider.RpcExporter;
import com.huayang.provider.impl.HelloServiceImpl;

import java.io.IOException;
import java.net.InetSocketAddress;

public class Test {


    public static void main(String[] args) {

        new Thread(new Runnable() {
            public void run() {
                try {
                    RpcExporter.export("localhost", 8080);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        RpcImporter<HelloService> importer = new RpcImporter<HelloService>();
        HelloService echo = importer.importer(HelloServiceImpl.class, new InetSocketAddress("localhost", 8080));
        System.out.println(echo.echo("young "));

    }


}





  • 大小: 232.1 KB
分享到:
评论

相关推荐

    RPC简单实现-JAVA

    在JAVA中实现RPC,我们需要理解以下几个关键知识点: 1. **远程调用原理**:RPC的核心思想是让客户端可以像调用本地方法一样调用远程服务器上的方法,中间过程对用户透明。它通过网络协议将请求发送到远程服务,...

    RPC简单实现

    本教程将简要介绍RPC的基本概念、工作原理以及一个简单的RPC实现。 ### RPC的基本概念 RPC的核心思想是“调用即接口”。它允许客户端应用程序通过发送一个请求到服务器来执行特定的远程操作,然后等待服务器返回...

    实现一个简单的RPC框架

    本篇将详细讲解如何使用socket、反射和序列化等技术来实现一个简单的RPC框架。 首先,让我们了解RPC的基本原理。在RPC模型中,客户端(Client)发起一个函数调用请求,这个请求包含了目标函数的名称和参数。RPC框架...

    rpc原理的简单实现

    这里给出一个简单的RPC实现示例,使用Python的socket库: ```python # 服务器端 import socket def remote_service(data): return "Service result: " + data s = socket.socket(socket.AF_INET, socket.SOCK_...

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

    本项目提供了一个简易版的Java RPC框架实现,旨在模仿著名的Dubbo框架,但采用了更基础的Socket通信方式进行分布式服务的搭建。以下是这个项目的核心知识点: 1. **RPC原理**:RPC使得客户端可以像调用本地方法一样...

    rabbitmq RPC java 实现

    3. **定义交换机和队列**:在RPC中,我们通常使用Direct交换机,因为它简单且高效。客户端发送请求到一个特定的队列,服务器监听该队列并处理请求。 4. **发布和消费消息**:客户端通过`basicPublish`方法发布带有...

    RPC的简单实现

    本篇文章将探讨RPC的基本原理、实现方式以及其在IT领域的应用。 **1. RPC的基本概念** RPC使得分布式系统中的组件能够无缝地交互,隐藏了底层网络通信的复杂性。在RPC调用中,客户端发起请求,服务器接收到请求后...

    简单实现一个RPC.zip

    简单实现一个RPC 简单实现一个RPC 简单实现一个RPC 简单实现一个RPC 简单实现一个RPC 简单实现一个RPC 简单实现一个RPC ...

    手写rpc rpc简单源码 rpc源码学习 rpc过程了解 rpc通信原理

    在提供的"school-rpc(手写rpc)"压缩包中,我们可以看到作者实现的客户端和服务端源代码,通过阅读这些代码,可以深入理解RPC的工作流程和实现细节,有助于提升对分布式系统和网络通信的理解。在实际项目中,我们还...

    一个来自菜鸡的RPC实现

    总的来说,这个“菜鸡”实现虽然简单,但能帮助理解RPC的基本原理,是学习和掌握RPC技术的良好起点。实际生产环境中,我们需要考虑更多的因素,如性能、稳定性、扩展性等,选择或定制更适合的RPC框架。

    最简单的JAVA RPC框架实现

    在Java中实现一个简单的RPC框架,我们需要理解以下几个关键概念和技术: 1. **网络通信**:RPC的核心是通过网络进行通信。在Java中,我们可以使用Socket API来实现客户端和服务器端之间的数据传输。Socket提供了低...

    JAVA实现简单RPC框架

    在这个“JAVA实现简单RPC框架”的项目中,我们将探讨如何利用Java的核心特性来构建这样的框架。以下是关键知识点的详细说明: 1. **JDK动态代理**: JDK动态代理是Java提供的一种机制,可以在运行时创建一个实现了...

    RPC架构webService简单实现

    要实现一个简单的RPC架构Web Service,我们通常会遵循以下步骤: 1. **定义服务接口**:首先,我们需要定义服务的接口,这通常是一个包含若干方法的Java接口。例如,我们可以创建一个名为`CalculatorService`的接口...

    netty的rpc协议的简单实现

    在这个“netty的rpc协议的简单实现”项目中,我们将探讨Netty如何被用来构建RPC框架的关键组件和流程。 首先,我们需要理解RPC的基本原理。RPC的核心是封装网络通信细节,使得客户端和服务器之间通过接口进行通信,...

    SparkRPC简单代码实现.pdf

    ### Spark RPC 简单代码实现详解 #### Spark RPC 概念与实现思路 Spark RPC(Remote Procedure Call,远程过程调用)是Spark 2.x版本之后引入的一种新的分布式通信机制,取代了早期版本中使用的Akka框架。Spark ...

    rpc实现跨系统文件复制

    RPC(Remote Procedure Call,远程过程调用)是一种分布式计算技术,允许一个程序在计算机A上调用另一个位于计算机B上的程序,就像调用本地程序...这种RPC实现的方式使得不同操作系统间的文件操作变得相对简单和透明。

    自定义的RPC的Java实现

    本篇文章将深入探讨如何在Java中实现一个简单的RPC框架,并涉及与之相关的源码分析和技术要点。 首先,理解RPC的基本工作流程至关重要。RPC的核心思想是调用远程服务就像调用本地方法一样简单。其通常包括以下步骤...

    自定义RPC的Java实现

    ### 自定义RPC的Java实现详解 #### 一、引言 在现代软件开发中,分布式系统变得越来越普遍,其中远程过程调用(RPC)技术因其简单高效的特点而在跨网络节点间进行服务通信方面发挥着重要作用。本文将详细介绍如何...

    LabVIEW XML-RPC

    - XML-RPC(XML Remote Procedure Call)是一种简单的基于HTTP协议的远程调用方法,使用XML作为数据传输格式。 - 它允许客户端(如LabVIEW应用)通过发送一个HTTP请求到服务器执行特定的函数或方法,并接收服务器...

Global site tag (gtag.js) - Google Analytics