概述

Hprose(High Performance Remote Object Service Engine),国人开发的一个远程方法调用的开源框架。它是一个先进的轻量级的跨语言跨平台面向对象的高性能远程动态通讯中间件,它支持众多语言,例如nodeJs, C++,.NET,Java,Delphi,Objective-C,ActionScript,JavaScript,ASP,PHP,Python, Ruby,Perl等。

什么是RPC?

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 其实简单的说,就是象调用本地的类的方法样来调用服务器端的方法实现。

具体参考以下文章:

性能基础之浅谈常见接口性能压测

Hprose特点

  1. 支持几乎所有常见语言的实现,包括浏览器中的javascript

  2. 成熟稳定,已经在很多项目中得到验证

  3. 一直在持续稳步更新

  4. 国人开发,有QQ群在线支持,回复比较快速(5分钟之内)

  5. 和实体能保持很好的兼容性,实体工作量较小

Hprose服务端

Hprose 2.0 for Java 支持多种底层网络协议绑定的服务器,比如:HTTP 服务器,TCP 服务器和 WebSocket 服务器。 HTTP 服务器支持在 HTTP、HTTPS 协议上通讯。 TCP 服务器支持在 TCP 协议上通讯,并且支持全双工和半双工两种模式。 WebSocket 服务器支持在 ws、wss 协议上通讯。

Hprose客户端

Hprose 2.0 for Java 支持两种底层网络协议绑定的客户端:HTTP 客户端 和 TCP 客户端。 其中 HTTP 客户端支持跟 HTTP、HTTPS 绑定的 Hprose 服务器通讯。 TCP 客户端支持跟 TCP 绑定的 Hprose 服务器通讯,并且支持全双工和半双工两种模式。 尽管支持这两种不同的底层网络协议,但除了在对涉及到底层网络协议的参数设置上有所不同以外,其它的用法都完全相同。

官网地址: http://hprose.com/

实现逻辑

Hprose应用大致就做三件事:

  1. 复制Hprose文件进项目

  2. 写Hprose服务端

  3. 写Hprose客户端

Hprose服务端要做的事就两件:

  1. new一个HproseHttpServer对象

  2. 用这个对象发布服务,包括函数、方法、对象甚至类

Hprose客户端要做的事就两件:

  1. new一个HproseHttpClient对象

  2. 用这个对象调用服务端发布的各种服务

压测示例

此处我们使用官方自带的HellWorld示例

源代码:https://github.com/hprose/hprose-java

写Hprose服务端

首先创建一个maven web项目,并引入hprose Stub JAR包

  1. <dependencies>

  2.        <!--引入hprose Stub-->

  3.        <dependency>

  4.            <groupId>org.hprose</groupId>

  5.            <artifactId>hprose-java</artifactId>

  6.            <version>2.0.38</version>

  7.        </dependency>

  8.    </dependencies>

在WebRoot/WEB-INFO/Lib目录下引入servlet和websocket的JAR包

创建hello服务类,可以写两个很简单的sayHello方法和add方法

  1. /***

  2. * 服务类

  3. */

  4. public class Hello {

  5.    /***

  6.     * 返回hello+客户端传参

  7.     * @param name

  8.     * @return

  9.     */

  10.    public String sayHello(String name) {

  11.        return "Hello " + name + "!";

  12.    }

  13.    /**

  14.     * 返回两个数字的和

  15.     * @param a

  16.     * @param b

  17.     * @return

  18.     */

  19.    public String add(int a,int b)

  20.    {

  21.        int c=a+b;

  22.        return "结果是:"+c;

  23.    }

  24. }

编写一个服务发布类WebSocketServer绑定WebSocketServer

  1. /***

  2. * 服务发布类

  3. * WebSocket 绑定

  4. * Hprose RPC也可以工作于WebSocket之上,数据以二进制数据的方式在WebSocket上发送和接收。

  5. * Hprose RPC添加了4个字节的头作为请求唯一标识(id),服务器端不需要关心请求唯一标识(id)如何编码,只需要在应答中重复它就可以了。

  6. */

  7. @ServerEndpoint("/wshello")

  8. public class WebSocketServer {

  9.    private HproseWebSocketService service = new HproseWebSocketService();

  10.    public WebSocketServer() {

  11.        //new出服务对象,发布类里面所有的公共方法

  12.        service.add(new Hello());

  13.    }

  14.    @OnOpen

  15.    public void onOpen(Session session, EndpointConfig config) {

  16.        service.setConfig(config);

  17.    }

  18.    @OnMessage

  19.    public void onMessage(ByteBuffer buf, Session session) throws IOException {

  20.        service.handle(buf, session);

  21.    }

  22.    @OnError

  23.    public void onError(Session session, Throwable error) {

  24.        service.handleError(session, error);

  25.    }

  26. }

主要工作都完成了,接着需要在web.xml里注册一下

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  3.    <servlet>

  4.        <!--注册服务-->

  5.        <servlet-name>HelloServlet</servlet-name>

  6.        <servlet-class>hprose.server.HproseServlet</servlet-class>

  7.        <init-param>

  8.            <param-name>class</param-name>

  9.            <param-value>hprose.hello.server.Hello</param-value>

  10.        </init-param>

  11.        <init-param>

  12.            <param-name>crossDomain</param-name>

  13.            <param-value>true</param-value>

  14.        </init-param>

  15.        </servlet>

  16.    <!--绑定URL-->

  17.    <servlet-mapping>

  18.        <servlet-name>HelloServlet</servlet-name>

  19.        <url-pattern>/Hello</url-pattern>

  20.    </servlet-mapping>

  21.    <session-config>

  22.        <session-timeout>

  23.            30

  24.        </session-timeout>

  25.    </session-config>

  26.    <welcome-file-list>

  27.        <welcome-file>index.html</welcome-file>

  28.        </welcome-file-list>

  29.    </web-app>

完成后运行tomcat,浏览器自动打开http://localhost:8888/Hello,我们可以看到这个服务已经成功发布了。

写Hprose客户端

接下我们写HelloClient类测试下服务是否ok

  1. /**

  2. * Hprose客户端

  3. */

  4. public class HelloClient {

  5.    public static void main(String[] args) throws IOException {

  6.        //new一个HproseHttpClient对象

  7.        HproseHttpClient client = new HproseHttpClient();

  8.        //使用无参构造器创建的客户端,在进行调用前,需要先调用useService方法初始化服务器地址

  9.        client.useService("http://localhost:8080/Hello");

  10.        //使用invoke方法来动态调用服务。

  11.        String result = (String) client.invoke("sayHello", new Object[] { "Hprose" });

  12.        System.out.println(result);

  13.        result = (String) client.invoke("sayHello", new Object[] { "7DGroup" });

  14.        System.out.println(result);

  15.        System.out.println(client.invoke("add",new Object[]{1,6}));

  16.    }

  17. }

测试成功后,我们把hprose jar包拷贝到apache-jmeter-4.0\lib\ext下

Jmeter压测

打开Jmeter,设置线程组为5个

新建一个BeanShell Sampler及察看结果树,拷贝HelloClient代码到BeanShell script内,使用随机数函数对请求的数字进行参数化

运行并查看Jmeter控制台输出结果

至此,我们的一个压测Hprose RPC服务的小例子就完成了。

性能工具之Jmeter压测Hprose RPC服务的更多相关文章

  1. 性能工具之Jmeter压测Thrift RPC服务

    概述 Thrift是一个可互操作和可伸缩服务的框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, ...

  2. 【Java分享客栈】未来迈向高级工程师绕不过的技能:JMeter压测

    前言 因为工作需要,久违的从自己的有道云笔记中去寻找压测相关的内容,翻开之后发现还不错,温故一遍后顺便整理出来分享给大家. 题外话,工作8年多,有道云笔记不知不觉都6G多了,扫一眼下来尽是云烟过往,竟 ...

  3. JMeter接口压测——ServerAgent监控服务端性能指标

    ServerAgent作为一个服务端性能监控插件,结合JMeter自身插件PerfMon可以实现JMeter压测的图形化实时监控,具有良好的实用性.下面讲解一个应用实例 思路: 1. 插件准备 2.打 ...

  4. windows下Jmeter压测端口占用问题(亲测有效)

    windows下Jmeter压测端口占用问题 1 报错信息描述 压测的初期,在设置了 150qps/s 的并发数下压测几分钟后 Jmeter 就出现了如下报错. JAVA.NET.BINDEXCEPT ...

  5. jmeter压测、操作数据库、分布式、 linux下运行的简单介绍

    一.jmeter压测 1.如何压测 常规性能压测:10-15分钟 稳定性测试:一周.2天等 如果想要压测10分钟,勾选永远,勾选调度器,填写600秒.也可以使用固定启动时间. 2.tps.响应时间 ( ...

  6. windows下Jmeter压测端口占用问题

    https://blog.csdn.net/weixin_43757847/article/details/88188091 1 前情提要人脸识别项目中,云平台新增了人脸识别的校验接口.考虑到存在大量 ...

  7. 一文揭秘测试平台中是如何将测试用例一键转化Jmeter压测脚本

    ​    ​接上篇,一键转化将接口测试平台测试用例转化成Jmeter压测脚本思路,这里我首先在java 上面做了一个简单的实验,看看 转化的中间遇到的问题,这里呢,我只是给了一个简单的demo 版本, ...

  8. jmeter压测app

    使用代理的方式,录制app端脚本,之后用jmeter压测就没啥好说的了 1.电脑端谷歌设置本地代理(端口号为8888) 2.jmeter设置HTTP代理服务器(端口号为8888) 3.手机端wifi设 ...

  9. JMeter压测基础(三)——Mysql数据库

    JMeter压测基础(三)——Mysql数据库 环境准备 mysql驱动 JMeter jdbc配置 JMeter jdbc请求 1.下载mysql驱动:mysql-connector-java.ja ...

随机推荐

  1. Windows进程间通讯(IPC)----管道

    管道的分类 管道其实际就是一段共享内存,只不过Windows规定需要使用I/O的形式类访问这块共享内存,管道可以分为匿名管道和命名管道. 匿名管道就是没有名字的管道,其支持单向传输数据,如果需要双向传 ...

  2. 比物理线程都好用的C++20的协程,你会用吗?

    摘要:事件驱动(event driven)是一种常见的代码模型,其通常会有一个主循环(mainloop)不断的从队列中接收事件,然后分发给相应的函数/模块处理.常见使用事件驱动模型的软件包括图形用户界 ...

  3. MySQL字段类型最全解析

    前言: 要了解一个数据库,我们必须了解其支持的数据类型.MySQL 支持大量的字段类型,其中常用的也有很多.前面文章我们也讲过 int 及 varchar 类型的用法,但一直没有全面讲过字段类型,本篇 ...

  4. CRM系统实施的原则

    在我们使用CRM系统服务企业和客户之前,需要先系统的实施它.使用CRM系统却没有发挥它应有价值的案例很多,那么我们要怎样才能让CRM的作用发挥到最大,并确保它是成功的?那么今天小编跟您聊一聊,您的企业 ...

  5. golang:并发编程总结

    并行和并发 并发编程是指在一台处理器上"同时"处理多个任务. 宏观并发:在一段时间内,有多个程序在同时运行. 微观并发:在同一时刻只能有一条指令执行,但多个程序指令被快速的轮换执行 ...

  6. JNLP配置WIN10

    依据网友的反响和我自己的考查,发觉JNLP的情况是大多数网友的困惑之处,针对此问题小编给大总结整理了(关键此)的处理技巧,并对它进以加工改善,整理出JNLP的详细教程,只用你按照1:首先配置电脑的ja ...

  7. Mysql数据库基础增删改查常用语句命令

    Mysql增删改查常用语句命令 一.增删改查语句总览 创建: create(创建数据库) 增:insert(插入表数据) 删:drop.delete(删除表.删除表数据) 改:update.alter ...

  8. win10家庭版升级 到win10企业版

    成功升级3小时  20200124 拿到电脑 win10家庭版 不会用 找admin都找不到只能用企业版 升级win10家庭版 到win10企业版 在msdn下载win10企业版iso iso 文件管 ...

  9. Java8 Period 类与 Duration 类 用法详解

    引言 Java 8 中引入了两个与日期相关的新类: Period :基于日期值 Duration:基于时间值 它们最大的作用就不需要你自己复杂的计算关于两个年月日之间的相差的时间或日期啦. Perio ...

  10. S5 Linux信息显示与搜索文件命令

    5.1-5 uname.hostname.dmesg.stat.du 5.6 date:显示与设置系统时间 5.7 echo:显示一行文本 5.8-12 watch.which.whereis.loc ...