前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >性能工具之Jmeter压测WebSocket接口(一)

性能工具之Jmeter压测WebSocket接口(一)

作者头像
高楼Zee
发布2019-07-17 17:49:35
发布2019-07-17 17:49:35
4.1K00
代码可运行
举报
文章被收录于专栏:7DGroup7DGroup
运行总次数:0
代码可运行

概述

WebSocket是web客户端和服务器之间新的通讯方式,依然架构在HTTP协议之上。使用WebSocket连接,web应用程序可以执行实时的交互,而不是以前的poll方式。

WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议,可以用来创建快速的更大规模的健壮的高性能实时的web应用程序。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

什么是WebSocket?

一个WebSocket是通过一个独立的TCP连接实现的、异步的、双向的、全双工的消息传递实现机制。WebSockets不是一个HTTP连接,却使用HTTP来引导一个WebSocket连接。一个全双工的系统允许同时进行双向的通讯。有线电话是一个全双工设施的例子,因为它们允许两个通话者同时讲话并被对方听到。

WebSocket协议利用HTTP升级头信息来把一个HTTP连接升级为一个WebSocket连接。HTML5 WebSockets 解决了许多导致HTTP不适合于实时应用的问题,并且它通过避免复杂的工作方式使得应用结构很简单。

目前绝大多数的浏览器都支持WebSockets

WebSocket是如何工作的?

每一个WebSocket连接的生命都是从一个HTTP请求开始的。HTTP请求跟其他请求很类似,除了它拥有一个Upgrade头信息。Upgrade头信息表示一个客户端希望把连接升级为不同的协议。对WebSockets来说,它希望升级为WebSocket协议。当客户端和服务器通过底层连接第一次握手时,WebSocket连接通过把HTTP协议转换升级为WebSockets协议而得以建立。一旦WebSocket连接成功建立,消息就可以在客户端和服务器之间进行双向发送

而websocket请求和服务器交互的如下图所示:

由上图可知,websocket只要建立连接,之后客户端与服务器的通讯完全是自由的,客户端可以主动发送消息,同理服务端也可以主动进行消息推送。而http请求只能一个request对应一个response,所以服务端不能做到真正意义上的主动发送消息。而且连接建立起后只需要通过数据帧来进行传输,帧的头部信息远比http当中的head小多了,会节省大量的带宽。更适合做长时间的数据传输。但其缺点就是需要一直维持连接,因此对于服务器的端口资源消耗较大。

WebSockets优点:

  1. WebSockets比其它工作方式比如轮询更有效也更高效。因为它需要更少的带宽并且降低了延时。
  2. WebSockets简化了实时应用的结构体系。
  3. WebSockets在点到点发送消息时不需要头信息。这显著的降低了带宽。

WebSockets使用案例:

聊天应用、多人游戏、股票交易和金融应用、文档合作编辑、社交应用

JAVA WebSocket Springboot服务端实现

Oracle 发布的 java的WebSocket 的规范是JSR356规范 ,Tomcat从7.0.27开始支持WebSocket,从7.0.47开始支持JSR-356。

怎么创建你的第一个WebSocket应用呢?

基本上我们会使用Javascript API编写WebSocket客户端,在服务器端,本文使用JSR 356规范定义的通用模式和技术处理WebSocket的通讯。

新建SpringBoot工程

pom.xml中添加相关的包

代码语言:javascript
代码运行次数:0
运行
复制
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.1</version>
        </dependency>
    </dependencies>

配置WebSocket

代码语言:javascript
代码运行次数:0
运行
复制
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

发布服务

有两种创建服务器端代码的方法:

  • 注解方式Annotation-driven: 通过在Pojo加上注解, 开发者就可以处理WebSocket 生命周期事件
  • 实现接口方式Interface-driven: 开发者可以实现Endpoint接口和声明周期的各个方法.

一般开发时采用注解方式 这样可以使用Pojo就可以实现WebSocket Endpoint. 而且不限定处理事件的方法名。代码也更简单。

本例就采用注解的方式接收WebSocket请求的类是一个Pojo, 通过@ServerEndpoint标注发布服务。 这个注解告诉容器此类应该被当作一个WebSocket的Endpoint。value值就是WebSocket endpoint的path。

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 发布服务,发布一个名叫"7DGroup"的websocket,一个POLO类
 * 通过@ServerEndpoint标准,这个注解告诉容器此类被当做一个WebSocket的Endpoint,value值即WebSocket endpoint的path
 * @author zuozewei
 */

@ServerEndpoint(value = "/7DGroup")
@Component
public class WebSocket {
    private Logger logger = LoggerFactory.getLogger(WebSocket.class);

    //连接时执行
    @OnOpen
    public void onOpen(Session session) {
        logger.info("WebSocket Open: "+ session.getId());
    }

    //关闭时执行
    @OnClose
    public void onClose(CloseReason reason) {
        logger.info("Closing a WebSocket due to "+ reason.getReasonPhrase());
    }

    //收到消息时执行
    @OnMessage
    public String onMessage(String message) {
        logger.info("Received : "+ message);
        return message;
    }

    //连接错误时执行
    @OnError
    public void onError(Session session, Throwable throwable) {
        logger.debug(session.getId() + " > OnError: " + throwable.getMessage());
    }
}

注意:

这个例子还包括了其它几个回调函数:

  • @OnOpen标注的方法在WebSocket连接开始时被调用,Web Session作为参数。
  • @OnClose标注的方法在连接关闭时被调用。
  • @OnMessage标准的方法在收到消息时执行。
  • @OnError在连接错误时执行。

就是这么简单,我们这个WebSocket服务它会在容器Tomcat 8上发布。

测试

打开chrome,在console里面测试

代码语言:javascript
代码运行次数:0
运行
复制
var ws = new WebSocket("ws://127.0.0.1:8080/7DGroup");
ws.onmessage = function(msg){console.log("接受到消息", msg)};
ws.send("zuozewei");

服务端日志:

我们可以看到发送的字符串被服务端成功返回了,测试成功~

下篇主要介绍使用JMeter压测这个WebSocket接口及项目实战。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 7DGroup 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 什么是WebSocket?
  • WebSocket是如何工作的?
  • JAVA WebSocket Springboot服务端实现
    • 新建SpringBoot工程
    • 配置WebSocket
    • 发布服务
    • 测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档