一个简单的RPC框架showcase,没有涉及注册中心,监控中心,服务端启动通过export方法暴露服务,客户端启动通过refer方法引用服务。

//暴露服务:

package com.mcg.rpc.server;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;

public class Provider
{
 public static void export(final Object instance, int port) throws Exception 
    {
    if(instance==null)
        throw new IllegalArgumentException("service is null");
    if (port >65535)
        throw new IllegalArgumentException(port + "is invalid");
    ServerSocket serverSocket = new ServerSocket(port);
    for(;;) {  
        try { 
            final Socket socket = serverSocket.accept();  
            new Thread(new Runnable() {  
                public void run() {  
                    try {  
                        try {  
                            ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());  
                            try {  
                                String methodName = objectInputStream.readUTF();  
                                Class<?> [] parameterTypes = (Class<?>[])objectInputStream.readObject();  
                                Object[] arguments = (Object[])objectInputStream.readObject();  
                                ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());  
                                try {  
                                    Method method = instance.getClass().getMethod(methodName, parameterTypes);  
                                    Object result = method.invoke(instance, arguments);  
                                    objectOutputStream.writeObject(result);  
                                } catch (Throwable t) {  
                                    objectOutputStream.writeObject(t);  
                                } finally {  
                                    objectOutputStream.close();  
                                }  
                            } finally {  
                                objectInputStream.close();  
                            }  
                        } finally {  
                            socket.close();  
                        }  
                    } catch (Exception e) {  
                        e.printStackTrace();  
                    }  
                }  
            }).start();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
} 
}

//引用服务:

package com.mcg.rpc.client;

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.Socket;

public class Consumer {

@SuppressWarnings("unchecked")
public static <T>
 T refer(final Class<T>
 serviceInterface,final String host,final int port) {
    return (T)Proxy.newProxyInstance(serviceInterface.getClassLoader(),new Class<?>
[]{serviceInterface}, new InvocationHandler()
    {  
        public Object invoke(Object proxy, Method method, Object[] arguments) 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(arguments);  
                    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.mcg.rpc.service;

public interface HelloService {
  void say(String name);
}

//服务实现:

package com.mcg.rpc.service;

public class HelloServiceImpl implements HelloService {
   public void say(String name) 
    {
    System.out.println("hello:" + name);
    }
 }

//测试:

package com.mcg.rpc.server;

import com.mcg.rpc.service.HelloService;
import com.mcg.rpc.service.HelloServiceImpl;

public class ServerTest {
   private final static int PORT=1234;
   public static void main(String args []) throws Exception
     {
       HelloService instance=new HelloServiceImpl();
       Provider.export(instance, PORT);    
     }
}

package com.mcg.rpc.client;

import com.mcg.rpc.service.HelloService;

public class ClientTest {
private final static int PORT=1234;
private final static String HOST="127.0.0.1";
public static void main(String args []) {
    HelloService helloService=Consumer.refer(HelloService.class, HOST, PORT);
    helloService.say("mcg");
 }
}

//结果:

hello:mcg

results matching ""

    No results matching ""