一简单的RPC实例(Java)

来至于阿里liangf:如有冒犯,请原谅

RPCFrameWork:

package com.sunchao.demo;

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;

/**
 * RPCFramework
 *
 * copy from the alibaba liangf
 *
 * @author Administrator
 *
 */
public class RPCFramework {

    /**暴露  服务
     *
     * @param service
     * @param port
     * @throws IOException
     */
    public static void export(final Object service, int port) throws IOException{
        if(service == null)
            throw new IllegalArgumentException("service instance == null");
        if(port <= 0 || port > 65535)
            throw new IllegalArgumentException("invard port" + port);
        System.out.println("Export service " + service.getClass().getName() + "on port" + port);

        @SuppressWarnings("resource")
        ServerSocket server = new ServerSocket(port);

        for(;;){
            try{
                 final Socket socket =  server.accept();
                 new Thread(new Runnable(){
                    @Override
                    public void run() {
                     try{
                         try{  

                            ObjectInputStream input = new ObjectInputStream(
                                           socket.getInputStream());
                            try{
                                  String methodName = input.readUTF();
                                  //method parameter type
                                  Class<?>[] parameterTypes = (Class<?>[]) input.readObject();
                                   //method parameter
                                  Object[] arguments = (Object[])input.readObject();
                                  ObjectOutputStream output = new ObjectOutputStream
                                          (socket.getOutputStream());
                                try{
                                    Method method = service.getClass().getMethod
                                            (methodName, parameterTypes);
                                    Object result = method.invoke(service, arguments);
                                    output.writeObject(result);
                                }catch(Throwable t){
                                    output.writeObject(t);
                                }finally{
                                    output.close();
                                }
                            }finally{
                                input.close();
                            }
                         }finally{
                             socket.close();
                         }
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                  }
                }).start();
            } catch(Exception e1){
                e1.printStackTrace();
            }
        }
    }

    /**
     * 引用服务
     *
     * @param interfaceClass 接口类型
     * @param host 主机名
     * @param port 端口号
     * @return 远程服务
     */
    @SuppressWarnings("unchecked")
    public static <T> T refer(final Class<T> interfaceClass, final String host, final int port){
        if(interfaceClass == null)
            throw new IllegalArgumentException("Interface class == null");
        if(! interfaceClass.isInterface())
            throw new IllegalArgumentException
                 ("The " + interfaceClass.getName() + " must be interface class ");
        if(host == null || host.length() == 0)
            throw new IllegalArgumentException("host == null");
        if(port <= 0 || port > 65535)
            throw new IllegalArgumentException("Invalid port " + port);
        System.out.println("Get remote service " + interfaceClass.getName() +
                " from service " + host + ":" + 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 socket = new Socket(host,port);
                try{
                    ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());

                    try{
                        output.writeUTF(method.getName());
                        output.writeObject(method.getParameterTypes());
                        output.writeObject(args);
                        ObjectInputStream input = new ObjectInputStream(socket.getInputStream());

                        try{
                            Object result = input.readObject();
                            if(result instanceof Throwable)
                                throw (Throwable)result;
                            return result;
                        }finally{
                            input.close();
                        }
                    }finally{
                        output.close();
                    }
                }finally{
                    socket.close();
                }

            }
        });
    }
}

服务接口:

package com.sunchao.demo;
/**
 * service interface
 *
 * @author Administrator
 *
 */
public interface HelloService {

    String hello(String name);
}

服务实现:

package com.sunchao.demo;

public class HelloServiceImpl implements HelloService {

    @Override
    public String hello(String name) {

        return "hello " + name;
    }

}

服务器端服务启动:

package com.sunchao.demo;

import java.io.IOException;

/**
 * 暴漏服务
 *
 * @author Administrator
 *
 */
public class RPCProvider {

     public static void main(String args[]) throws IOException{
         HelloService service = new HelloServiceImpl();
         RPCFramework.export(service, 1234);
     }
}

客户端服务代理:

package com.sunchao.demo;
/**
 * customer
 *
 * @author Administrator
 *
 */
public class RPCConsumer {

    public static void main(String args[]) throws InterruptedException{
        HelloService service = RPCFramework.refer
                (HelloService.class, "10.1.58.54", 1234);
        for(int i = 0; i < Integer.MAX_VALUE; i++){
            String hello = service.hello("world" + i);
            System.out.println(hello);
            Thread.sleep(1000);
        }

    }
}
时间: 2024-07-30 20:05:25

一简单的RPC实例(Java)的相关文章

Java Tread多线程(0)一个简单的多线程实例

作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多线程时,一般步骤: 1)继承Thread函数. 2)覆盖run函数. 注意:1)main函数为主线程,main里面存放的是主线程的执行代码: Demo1为子线程,里面的run函数里面存放的是子线程需要执行的代码:其中,本文中主线程和子线程执行的优先级是一样的. 2)启动线程必须用start()启动,

架构设计:系统间通信(14)——RPC实例Apache Thrift 下篇(2)

(接上篇<架构设计:系统间通信(13)--RPC实例Apache Thrift 下篇(1)>) 3.正式开始编码 我已经在CSDN的资源区上传了这个示例工程的所有代码(http://download.csdn.net/detail/yinwenjie/9289999).读者可以直接到资源下载站进行下载(不收积分哦~~^_^).这篇文章将紧接上文,主要介绍这个工程几个主要的类代码. 3-1.编写服务端主程序 服务端主程序的类名:processor.MainProcessor,它负责在服务端启动A

利用Hadoop提供的RPC API实现简单的RPC程序

[toc] 利用Hadoop提供的RPC API实现简单的RPC程序 在Hadoop中提供了RPC服务的使用API,通过其API地使用,可以非常简单地构建远程过程调用程序,下面就给出一个简单的实例. 项目结构 为了方便操作,所有的代码都放在本地一个项目中,实际上,完全可以将代码放在不同的服务器上,这是RPC的概念,这里就不做过多的介绍.项目结构如下: rpc/ ├── HelloServiceImpl.java ├── IHelloService.java ├── RPCClientDriver

RabbitMQ - RPC in Java

这次试着用RabbitMQ进行RPC. 其实用RabbitMQ搞RPC也没什么特别的. 只是我们需要在请求中再加入一个callback queue. 比如这样: callbackQueueName = channel.queueDeclare().getQueue(); BasicProperties props = new BasicProperties                             .Builder()                             .re

Android Service AIDL 远程调用服务 简单音乐播放实例的实现

Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成. AIDL 是什么 AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码.如果在一个进程中(例如Activi

一个简单的&quot;RPC框架&quot;代码分析

0,服务接口定义---Echo.java /* * 定义了服务器提供的服务类型 */ public interface Echo { public String echo(String string); } 一,客户端代码分析--实现类:MainClient.java 客户端实现包括:获得一个代理对象,并使用该代理对象调用服务器的服务.获取代理对象时,需要指定被代理的类(相当于服务器端提供的服务名),Server IP,Port. Echo echo = RPC.getProxy(Echo.cl

最简单的struts实例介绍

struts2环境配置 struts2框架,大多数框架都在使用.由于工作需要,开始做Java项目.先学个struts2. 一.下载struts2 有好多版本,我下载的是struts-2.2.1.1. 二.创建web项目,导入使用struts2所必须的jar包. 我使用的是MyEclipse 7.5.建立web项目,给项目添加外部引用包(project-properties-Java Build Path-Add External Jars...).添加的包有:commons-fileupload

【Servlet】Servlet简单登陆验证实例

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文要实现Servlet简单登陆验证实例.结构如下 1.LoginCheck.java package com.mucfc; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annota

Python---BeautifulSoup 简单的爬虫实例

对python自动化比较熟的同学,很多都懂一些爬虫方法,有些还研究的很深,下面呢我介 绍一个简单的爬虫实例,供大家参考.当然里面有很多需求是可以再学习的,下载进度的显 示.下载完成的提示等等. 一.首先我们要研究爬虫网站的架构,我这里已ring.itools.cn为例,我需要爬的是铃声. 大家可以自己去分析,这个网站的架构比较简单就不讲了. 我们最终要获取的是下面两个信息: 二.我们写下面的脚本来获取 上面的脚本呢,获取到songname和playaddr都是一组数据,即都是列表,我们需要把 他