`

几行代码写RPC

    博客分类:
  • java
阅读更多
转自梁飞博客
package com.alibaba.study.rpc.framework;  
  
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 
 *  
 * @author william.liangf 
 */  
public class RpcFramework {  
  
    /** 
     * 暴露服务 
     *  
     * @param service 服务实现 
     * @param port 服务端口 
     * @throws Exception 
     */  
    public static void export(final Object service, int port) throws Exception {  
        if (service == null)  
            throw new IllegalArgumentException("service instance == null");  
        if (port <= 0 || port > 65535)  
            throw new IllegalArgumentException("Invalid port " + port);  
        System.out.println("Export service " + service.getClass().getName() + " on port " + port);  
        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();  
                                    Class<?>[] parameterTypes = (Class<?>[])input.readObject();  
                                    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 e) {  
                e.printStackTrace();  
            }  
        }  
    }  
  
    /** 
     * 引用服务 
     *  
     * @param <T> 接口泛型 
     * @param interfaceClass 接口类型 
     * @param host 服务器主机名 
     * @param port 服务器端口 
     * @return 远程服务 
     * @throws Exception 
     */  
    @SuppressWarnings("unchecked")  
    public static <T> T refer(final Class<T> interfaceClass, final String host, final int port) throws Exception {  
        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 server " + host + ":" + port);  
        return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class<?>[] {interfaceClass}, 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();  
                }  
            }  
        });  
    }  
  
}  


/* 
 * Copyright 2011 Alibaba.com All right reserved. This software is the 
 * confidential and proprietary information of Alibaba.com ("Confidential 
 * Information"). You shall not disclose such Confidential Information and shall 
 * use it only in accordance with the terms of the license agreement you entered 
 * into with Alibaba.com. 
 */  
package com.alibaba.study.rpc.test;  
  
/** 
 * HelloService 
 *  
 * @author william.liangf 
 */  
public interface HelloService {  
  
    String hello(String name);  
  
}  


(2) 实现服务 
/* 
 * Copyright 2011 Alibaba.com All right reserved. This software is the 
 * confidential and proprietary information of Alibaba.com ("Confidential 
 * Information"). You shall not disclose such Confidential Information and shall 
 * use it only in accordance with the terms of the license agreement you entered 
 * into with Alibaba.com. 
 */  
package com.alibaba.study.rpc.test;  
  
/** 
 * HelloServiceImpl 
 *  
 * @author william.liangf 
 */  
public class HelloServiceImpl implements HelloService {  
  
    public String hello(String name) {  
        return "Hello " + name;  
    }  
  
}  


(3) 暴露服务 
/* 
 * Copyright 2011 Alibaba.com All right reserved. This software is the 
 * confidential and proprietary information of Alibaba.com ("Confidential 
 * Information"). You shall not disclose such Confidential Information and shall 
 * use it only in accordance with the terms of the license agreement you entered 
 * into with Alibaba.com. 
 */  
package com.alibaba.study.rpc.test;  
  
import com.alibaba.study.rpc.framework.RpcFramework;  
  
/** 
 * RpcProvider 
 *  
 * @author william.liangf 
 */  
public class RpcProvider {  
  
    public static void main(String[] args) throws Exception {  
        HelloService service = new HelloServiceImpl();  
        RpcFramework.export(service, 1234);  
    }  
  
}  


(4) 引用服务 
/* 
 * Copyright 2011 Alibaba.com All right reserved. This software is the 
 * confidential and proprietary information of Alibaba.com ("Confidential 
 * Information"). You shall not disclose such Confidential Information and shall 
 * use it only in accordance with the terms of the license agreement you entered 
 * into with Alibaba.com. 
 */  
package com.alibaba.study.rpc.test;  
  
import com.alibaba.study.rpc.framework.RpcFramework;  
  
/** 
 * RpcConsumer 
 *  
 * @author william.liangf 
 */  
public class RpcConsumer {  
      
    public static void main(String[] args) throws Exception {  
        HelloService service = RpcFramework.refer(HelloService.class, "127.0.0.1", 1234);  
        for (int i = 0; i < Integer.MAX_VALUE; i ++) {  
            String hello = service.hello("World" + i);  
            System.out.println(hello);  
            Thread.sleep(1000);  
        }  
    }  
      
}  
分享到:
评论

相关推荐

    RPC框架几行代码就够了.docx

    RpcFramework类的Java代码实现了RPC框架的核心逻辑。代码中使用了Java反射机制和代理模式来实现服务暴露和服务调用。代码还使用了ServerSocket和Socket对象来实现服务端口的监听和服务请求的处理。 知识点8:RPC...

    rest_rpc:现代C ++(C ++ 11),简单易用的rpc框架

    rest_rpc c++11, high performance, cross platform, ...rest_rpc为用户提供了非常简单易用的接口,几行代码就可以实现rpc通信了,来看第一个例子 一个加法的rpc服务 //服务端注册加法rpc服务 struct dummy{ int add(r

    基于Kryo序列化机制的RPC协议——Kryonet的应用与研究

    3. **易于使用**:Kryonet的API设计简洁明了,只需几行代码就可以建立服务器和客户端,并进行数据交换。 4. **高效性能**:由于Kryo的高性能特性,Kryonet在网络通信中表现出色,特别是在大数据量或者高并发场景下...

    HprosePHP高性能远程对象服务RPC引擎

    提供简单直观的API接口,无论是服务端还是客户端,只需几行代码即可快速实现远程调用。 8. **服务治理**: 支持服务注册、发现和负载均衡,便于构建大规模分布式系统。 9. **异步处理**: 支持异步调用,可以...

    Node.js-Comlink一个适用于WindowsiframeWebWorkers和ServiceWorkers的RPC库

    只需几行代码,就可以设置好RPC通道。 - **类型安全**:由于基于TypeScript,Comlink支持类型检查,增强了开发者的代码质量。 - **跨环境兼容**:Comlink不仅适用于Node.js,还可在Web Workers和Service Workers等...

    一款分布式的java游戏服务器框架,具备高性能、可伸缩、分布式、多线程等特点,java 8 +gradle 4.0

    分布式(多进程)架构,几行代码实现一个功能服务器的搭建 多线程设计,注解方式配置,轻松管理所有消息流 强大的RPC功能,调用远程RPC近似于调用本地函数,无需手工定义内部协议 支持插件功能,轻松实现功能插件 框架...

    开源项目-keegancsmith-tmpfriend.zip

    通过几行代码,开发者就可以创建临时文件并确保它们在适当的时候被清理。 4. **安全性**:tmpfriend通过合理地命名和存放临时文件,降低因未及时清理临时文件而引发的安全风险。例如,它可能使用随机生成的文件名,...

    thriftDependencyJar

    它简化了日志配置,只需几行代码就可以启用基本的日志功能。与`org.slf4j.api_1.6.4.jar`一起使用,可以为Thrift应用程序提供基础的日志支持。 综上所述,这个“thriftDependencyJar”压缩包为使用Java进行Thrift...

    javaRMI完整版.pdf

    编写和使用RMI服务和客户端程序相对简单,服务程序只需几行代码就可以声明为远程服务,其余部分与普通Java对象相似。RMI还能够与现有系统集成,如通过Java Native Interface (JNI) 与非Java服务器通信,或者利用JDBC...

    基于groovy实现 java脚本动态编译、部署、发布;可以通过脚本直接调用dubbo接口.zip

    在Java应用中,只需几行代码,就可以实现Groovy脚本的编译和执行: ```java GroovyShell shell = new GroovyShell(); Script script = shell.parse(new File("path/to/your/groovy/script.groovy")); script.run();...

    ICE框架介绍

    通过几行代码,一个应用就可以生成一个高度可扩展的逐出器来高效地管理持久对象。 ICE 框架的优势之一是支持多语言分布式互联。服务端可以采用 C++/Java/Python/C# 等实现,客户端可以采用 C++/Java/Python/C#/VB/...

    JRP-开源

    这样,原本需要复杂服务器端代码实现的RPC调用,现在只需在JSP页面中添加几行标记即可完成。 **JRP的特性** 1. **易用性**:JRP通过JSP标签简化了RPC方法的创建,使得开发者无需深入理解RPC协议的底层细节。 2. **...

    gohalt:快速;快; 简单; 强大; 前往Throttler库

    易于集成,Gohalt提供了单独的软件包,其中包含许多内置的中间件,用于与stdlib和其他库进行简单(几行代码)集成,其中包括:io,rpc / grpc,http,sql,gin。 度量意识,Gohalt可以使用Prometheus度量作为限制...

    frpc-linux-amd64 大模型部署时,gradio生成公开网址用的

    `gradio`的使用非常简单,只需要几行代码即可创建一个交互式UI。例如,如果你有一个预测温度的模型,可以这样使用: ```python import gradio as gr def predict_temperature(temp): # 这里是你的模型预测代码 ...

    netty高性能异步I/O服务器/客户端开源开发工具

    例如,只需几行代码就能创建一个简单的服务器或客户端。 9. **社区活跃与文档完善**:Netty拥有活跃的社区,不断更新版本并修复问题。同时,官方提供了详尽的文档和丰富的示例,帮助开发者快速上手和解决问题。 10...

    网络请求hprose

    无论是同步调用还是异步调用,都只需要几行代码即可实现。 3. **序列化与反序列化**:Hprose内置了强大的序列化机制,能够自动处理各种类型的数据,包括基本类型、对象、数组、列表、字典等,无需额外的序列化和反...

    Pyrlang:在Python 3.5+中实现的Erlang节点(基于Asyncio)

    仅需几行启动代码,您的Python程序便成为Erlang网络节点,并参与了Erlang集群。文献资料浏览 或者通过运行make docs (由Sphinx生成)来构建自己的make docs 。支持与问题因为当你绝对需要援助和电子邮件太慢的时候...

    PHP使用SOAP扩展实现WebService的方法

    实际上,使用PHP内置SOAP扩展实现WebService,只需简单几行代码即可完成Web服务的客户端调用。这使得PHP在Web开发中更加灵活和强大,尤其是在需要与其他系统进行交互的场景中。随着Web服务的不断普及,掌握SOAP协议...

    Zabbix-Tiny.pm:一个小的Perl模块,以消除使用Zabbix API时的样板开销

    例如,要获取Zabbix中的主机信息,只需几行代码即可实现: ```perl use Zabbix::Tiny; my $zapi = Zabbix::Tiny-&gt;new( url =&gt; 'http://your-zabbix-server/zabbix/api_jsonrpc.php', user =&gt; 'admin', password...

Global site tag (gtag.js) - Google Analytics