热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javarmi与springmvcrest性能简单对比

场景描述:服务端用rest和rmi发布两个接口,两个接口提供同样的功能,获取同一个bean;服务端用httpclient

场景描述:

服务端用rest和rmi发布两个接口,两个接口提供同样的功能,获取同一个bean;

服务端用httpclient和rmi分别起十个线程调用,打印时间;

废话少说,程序猿用代码说话: 

首先定义一个Bean:
package net.tt.rest.domain;
 
import java.io.Serializable;
 
import lombok.Data;
 
/**
 *
 * @author tbc 
 * @version 1.0 {2016年6月13日 上午11:29:56}
 */
@Data
public class MyBean implements Serializable {
    private static final long serialVersionUID = -3442523325988510637L;
    private String uuid;
    private String name;
    private String value;
 
    public static MyBeanBuilder builder() {
        return new MyBeanBuilder();
    }
 
    public static class MyBeanBuilder {
        private String uuid;
        private String name;
        private String value;
 
        public MyBeanBuilder uuid(String uuid) {
            this.uuid = uuid;
            return this;
        }
 
        public MyBeanBuilder name(String name) {
            this.name = name;
            return this;
        }
 
        public MyBeanBuilder value(String value) {
            this.value = value;
            return this;
        }
 
        public MyBean build() {
            MyBean b = new MyBean();
            b.setName(name);
            b.setUuid(uuid);
            b.setValue(value);
            return b;
        }
 
    }
 
}

 

要发布的接口:

package net.tt.rest.service;
 
import java.rmi.Remote;
import java.rmi.RemoteException;
 
import net.tt.rest.domain.MyBean;
 
/**
 *
 * @author tbc 
 * @version 1.0 {2016年6月13日 上午10:14:43}
 */
public interface RmiRest extends Remote {
 
    MyBean getBean() throws RemoteException;
 
}


接口实现:

package net.tt.rest.service.impl;
 
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.UUID;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
 
import net.tt.rest.domain.MyBean;
import net.tt.rest.service.RmiRest;
 
/**
 * UnicastRemoteObject用于导出的远程对象和获得与该远程对象通信的存根。
 * 
 * @author tbc 
 * @version 1.0 {2016年6月13日 上午10:39:26}
 */
@Service("rmiRestImpl")
public class RmiRestImpl extends UnicastRemoteObject implements RmiRest {
    private static final long serialVersionUID = 1L;
    private Logger log = LoggerFactory.getLogger(RmiRestImpl.class);
 
    public RmiRestImpl() throws RemoteException {
    }
 
    @Override
    public MyBean getBean() throws RemoteException {
        MyBean bean = MyBean.builder()//
                .uuid(UUID.randomUUID().toString())//
                .name("MyName")//
                .value("thid is a test!")//
                .build();
        return bean;
    }
 
}
 


spring mvc controller -> 

package net.tt.rest.controller;
 
import java.rmi.RemoteException;
import java.util.Map;
 
import javax.annotation.Resource;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
 
import com.google.common.collect.Maps;
 
import net.tt.rest.domain.MyBean;
import net.tt.rest.service.RmiRest;
 
/**
 *
 * @author tbc 
 * @version 1.0 {2016年6月13日 上午10:57:03}
 */
@RestController
public class MyRestController {
    private Logger log = LoggerFactory.getLogger(MyRestController.class);
 
    @Resource(name = "rmiRestImpl")
    RmiRest rmiRest;
 
    @RequestMapping(value = "bean", method = { RequestMethod.GET })
    public MyBean getBean() throws RemoteException {
        return rmiRest.getBean();
    }
 
}
 
 
监听器,发布RMI :

package net.tt.rest.listener;
 
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
 
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import net.tt.rest.service.RmiRest;
import net.tt.rest.service.impl.RmiRestImpl;
 
/**
 *
 * @author tbc
 * @version 1.0 {2016年6月13日 上午10:44:13}
 */
@WebListener("rmi")
public class MyServletContextListener implements ServletContextListener {
    private Logger log = LoggerFactory.getLogger(MyServletContextListener.class);
 
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        log.info("启动监听,启动rmi服务...");
        try {
            RmiRest rr = new RmiRestImpl();
            LocateRegistry.createRegistry(8888);
 
            Naming.bind("rmi://localhost:8888/rr", rr);
 
            log.info("远程RmiRest对象绑定成功--->");
        } catch (RemoteException e) {
            log.error("创建远程对象发生异常");
            e.printStackTrace();
        } catch (MalformedURLException e) {
            log.error("发生重复绑定对象异常!");
            e.printStackTrace();
        } catch (AlreadyBoundException e) {
            log.error("发生URL畸形异常!");
            e.printStackTrace();
        }
 
    }
 
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        log.info("销毁监听器...");
    }
 
}
 
 OK,到此服务端代码就完成了,至于spring及监听的相关配置,不是本文重点,不再赘述,启动jetty,OK,成功!

下面写客户端代码进行测试: 

package net.tt.mytest.rmirest;
 
import java.io.IOException;
import java.rmi.Naming;
import java.util.concurrent.TimeUnit;
 
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.fluent.Request;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import net.tt.rest.domain.MyBean;
import net.tt.rest.service.RmiRest;
 
/**
 *
 * @author tbc 
 * @version 1.0 {2016年6月13日 上午11:15:05}
 */
public class RmiRestTest {
    private static Logger log = LoggerFactory.getLogger(RmiRestTest.class);
 
    public static void main(String[] args) throws ClientProtocolException, IOException, InterruptedException {
        log.info("springMvcRest testing ...");
        for (int i &#61; 0; i <10; i&#43;&#43;) {
            new Thread(() -> {
                long restStart &#61; System.currentTimeMillis();
                String restContent &#61; "";
                try {
                    restContent &#61; Request.Get("http://localhost:8080/spring/bean")//
                            .execute()//
                            .returnContent()//
                            .asString();
                    log.info("rest return -> {}", restContent);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                // log.info("exec result : {}", restCode);
                log.info("本次耗时&#xff1a;{}", (System.currentTimeMillis() - restStart));
            }).start();
        }
 
        TimeUnit.SECONDS.sleep(3);
        System.out.println("--------------------------------->");
        log.info("rmi testing ...");
        for (int i &#61; 0; i <10; i&#43;&#43;) {
            new Thread(() -> {
                long rmiStart &#61; System.currentTimeMillis();
                int restCode &#61; 0;
                try {
                    RmiRest rr &#61; (RmiRest) Naming.lookup("rmi://localhost:8888/rr");
                    MyBean b &#61; rr.getBean();
                    log.info("rmi return -> {}", b);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                log.info("本次耗时&#xff1a;{}", (System.currentTimeMillis() - rmiStart));
            }).start();
        }
 
    }
 
}
 
OK&#xff0c;一段简单的代码&#xff0c;进行一下简单的对比测试&#xff0c;全程裸奔&#xff0c;那么看一下结果&#xff1a;

程序猿能用代码说明的问题咱就用图片说明。。。

注&#xff1a;本文不讨论rest和RMI 甚至 RPC方案的优劣&#xff0c;不涉及跨平台等等属性&#xff0c;仅仅是在纯JAVA方案的前提下&#xff0c;测试rest与rmi两种方案的性能问题&#xff0c;本测试也不是十分严谨&#xff0c;事实上&#xff0c;这种测试是很不公平的&#xff0c;可以说拿RMI的优势来对比REST的劣势&#xff0c;非常偏&#xff0c;但在纯JAVA系统中&#xff0c;只关心性能的情况下&#xff0c;应该还是有一定的参考意义的&#xff1b;

另外&#xff0c;据说jersey的实现方案性能要比spring mvc强&#xff0c;下次做一下这方面的相关测试&#xff1b;

 

转自https://blog.csdn.net/tbc3697/article/details/51656637


推荐阅读
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
author-avatar
mobiledu2502911403
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有