文章目录

  • 一、概述
  • 二、什么是RPC?
  • Hprose特点
    • 1、Hprose服务端
    • 2、Hprose客户端
  • 3、实现逻辑
  • 4、压测示例
    • 4.1、写Hprose服务端
    • 4.2、写Hprose客户端

一、概述

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特点

  • 支持几乎所有常见语言的实现,包括浏览器中的javascript
  • 成熟稳定,已经在很多项目中得到验证
  • 一直在持续稳步更新
  • 国人开发,有QQ群在线支持,回复比较快速(5分钟之内)
  • 和实体能保持很好的兼容性,实体工作量较小

1、Hprose服务端

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

2、Hprose客户端

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

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

3、实现逻辑

Hprose应用大致就做三件事:

  1. 复制Hprose文件进项目
  2. 写Hprose服务端
  3. 写Hprose客户端

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

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

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

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

4、压测示例

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

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

4.1、写Hprose服务端

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

<dependencies><!--引入hprose Stub--><dependency><groupId>org.hprose</groupId><artifactId>hprose-java</artifactId><version>2.0.38</version></dependency></dependencies>

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

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

/**** 服务类*/public class Hello {/**** 返回hello+客户端传参* @param name* @return*/public String sayHello(String name) {return "Hello " + name + "!";}/*** 返回两个数字的和* @param a* @param b* @return*/public String add(int a,int b){int c=a+b;return "结果是:"+c;}
}

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

/**** 服务发布类* WebSocket 绑定* Hprose RPC也可以工作于WebSocket之上,数据以二进制数据的方式在WebSocket上发送和接收。* Hprose RPC添加了4个字节的头作为请求唯一标识(id),服务器端不需要关心请求唯一标识(id)如何编码,只需要在应答中重复它就可以了。*/@ServerEndpoint("/wshello")
public class WebSocketServer {private HproseWebSocketService service = new HproseWebSocketService();public WebSocketServer() {//new出服务对象,发布类里面所有的公共方法service.add(new Hello());}@OnOpenpublic void onOpen(Session session, EndpointConfig config) {service.setConfig(config);}@OnMessagepublic void onMessage(ByteBuffer buf, Session session) throws IOException {service.handle(buf, session);}@OnErrorpublic void onError(Session session, Throwable error) {service.handleError(session, error);}
}

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

<?xml version="1.0" encoding="UTF-8"?>
<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"><servlet><!--注册服务--><servlet-name>HelloServlet</servlet-name><servlet-class>hprose.server.HproseServlet</servlet-class><init-param><param-name>class</param-name><param-value>hprose.hello.server.Hello</param-value></init-param><init-param><param-name>crossDomain</param-name><param-value>true</param-value></init-param></servlet><!--绑定URL--><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/Hello</url-pattern></servlet-mapping><session-config><session-timeout>30</session-timeout></session-config><welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list></web-app>

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

4.2、写Hprose客户端

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

/*** Hprose客户端*/
public class HelloClient {public static void main(String[] args) throws IOException {//new一个HproseHttpClient对象HproseHttpClient client = new HproseHttpClient();//使用无参构造器创建的客户端,在进行调用前,需要先调用useService方法初始化服务器地址client.useService("http://localhost:8080/Hello");//使用invoke方法来动态调用服务。String result = (String) client.invoke("sayHello", new Object[] { "Hprose" });System.out.println(result);result = (String) client.invoke("sayHello", new Object[] { "7DGroup" });System.out.println(result);System.out.println(client.invoke("add",new Object[]{1,6}));}
}

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

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

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

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

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

本文源码:

  • https://github.com/zuozewei/blog-example/tree/master/Performance-testing/01-test-tool/jmeter/hprose/hprose_demo/hprose/hprose/server

性能工具之Jmeter压测Hprose RPC服务相关推荐

  1. Jmeter压测工具详解

    Jmeter压测工具详解 1. Jmeter概述 1.1 Jmeter简介 1.2 Jmeter适用场景 2. Jmeter安装配置 2.1 下载安装 2.2 环境配置(可不配) 2.3 Jmeter ...

  2. Jmeter+Prometheus+Grafana性能监控平台:将JMeter压测数据输出到Prometheus

    前言 1.小编之前写过一篇文章详细讲解了如何搭建一个HTTP接口性能实时监控测试平台,是用Grafana+Influxdb+Jmeter组合实现的,可以参考我写的这篇博客https://editor. ...

  3. jmeter压测过程及常见问题总结

    jmeter压测过程及常见问题总结 主要分享三部分内容,一是使用jmeter进行压力测试具体过程,二是遇到的问题及解决办法,三是jmeter服务器性能监测插件的使用. 一.jmeter压测过程 (1) ...

  4. Jmeter 压测 http(s)

      上一篇文章关于Jmeter介绍了Jmeter入门相关的知识.本文是实战篇,讲讲如何使用Jmeter对Http(s)进行压力测试. Http测试 测试一   首先,添加 "线程组" ...

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

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

  6. 手把手教你jmeter压测--适合入门

    [后台测试]手把手教你jmeter压测 我知道我迟早是要踏上了后台测试之路的,只是没想到来的这么突然.新接手了一个项目,在第一版发出后,产品需要做运营活动拉量,因为我担心突然的流量涌入是否会对后台造成 ...

  7. Jmeter压测运行原理,这些你知道么?

    前言:想知道jmeter压测的原理是什么,得先知道性能测试的核心三原则: 基于协议,多线程,场景模拟! 基于协议:基于应用层和传输层的各种协议.比如http,udp,ftp,tcp等 多线程:通过进程 ...

  8. jmeter压测使用实践

    环境搭建篇见https://blog.csdn.net/weixin_42498050/article/details/12847945 参考Jmter压测使用实践 jmeter压测实战总结 搭建 A ...

  9. jmeter压测指标

    jmeter压测指标 压测前 主要参数 压测结果的分析 总结 压测前 压测前要明确压测功能和压测指标,一般需要确定的几个问题: 1.固定接口参数进行压测还是进行接口参数随机化压测? 2.要求支持多少并 ...

  10. 利用 JMeter 压测上传和下载接口实战

    目录 前言 正文 方案调研 工具下载 启动工具 组织压测脚本 压测结果 结论 前言 突然来一个任务,让压测对象存储服务的上传和下载接口,之前也没有干过呀,也不属于自己的工作范畴.但是,事情着急,自己也 ...

最新文章

  1. goldengate 12c 12.2 新特性(updated)
  2. OpenStack Pike Minimal安装:三、镜像管理
  3. Linux KVM与Xen的性能比较
  4. System Memory Management in Windows CE .NET
  5. linux 查找进程 删除进程 命令
  6. 单例嵌套 ios_嵌套类型的前5个用例
  7. java中的throw_Java中的throw和throws之间的区别
  8. 数据结构实验之栈二:一般算术表达式转换成后缀式
  9. servlet中servletContext的五大作用(一)
  10. 创建了一个.NET 技术的 Wiki 和论坛
  11. 专注于分布式存储计算技术及其应用url http://www.nosqlnotes.net/
  12. azure kinect三维点云_三维重建技术,你捋清楚了吗?本文适合小白
  13. [转载]宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)
  14. EastFax传真服务器系统与Email相比有什么优势
  15. taxi计费器c语言程序,基于单片机的出租车计费器的设计(附实物图,原理图,程序)...
  16. 骁龙855音频解码芯片_小米10、小10 Pro详细对比:骁龙865最强悍5G旗舰手机
  17. RK平台RAM和ROM容量计算
  18. 如何让你的网站地址在发送到QQ朋友的时候显示绿色安全图标呢?
  19. XPDL之流程定义元模型
  20. 09_Mybatis-plus类型处理器示例,例如 json 字段对象转换

热门文章

  1. 用c语言实现香农编码,单链表实现香农编码(C++)——二牛原创
  2. 多图预警~ 华为 ECS 与 阿里云 ECS 对比实战
  3. 厦门电子地图,厦门市地图,厦门地图查询,公交线路查询地图
  4. Mac 解决 Font family [“sans-serif”] not found , Glyph xxx missing from current font 的问题
  5. JavaScript之验证码--常用js特效
  6. 【网络存储】存储区域网络SAN
  7. java安装教程(eclipse)
  8. JAVA开发路线走向高级开发工程师
  9. Linux服务器查看任务计划,Linux的任务计划
  10. 入门masm32编写简单汇编程序并做具体分析