使用BeetleX.NetBenchmark压测TCP,HTTP和Websocket服务

真没想到大过年还在家里写代码写文章,本来还打算自驾半个月没想出现这情况。在这里祝福全国同胞在新的一年里身体健康!希望阳光天气早日照射在这片土地上,给人带来新一年的希望!

NetBenchmark是针对网络服务压测的开源组件,组件提供TCP,HTTPWebsocket的压力测试基础功能;为了更好的符合业务需求组件不提供UI配置信息源的方式(毕竟这种方式只能作有限制测试),而是由使用者来自己制定相应的逻辑代码来进行具体的业务测试。组件基于netstandard2.0,除了可以在.NET CORE上运行外还可以在.NET FX接下来介绍一下组的使用。

引用组件

https://www.nuget.org/packages/BeetleX.NetBenchmark/

Github: https://github.com/IKende/NetBenchmark

TCP测试

组件通过Benchmark.Tcp方法来构建一个TCP测压实例,方法如下:

public static Runner Tcp<Packet, Token>(string host, int port, int connections,
    Func<BeetleX.Clients.AwaiterClient, Token, Task> handler)
    where Packet : BeetleX.Clients.IClientPacket, new()
    where Token : new()

方法带两个泛参

  • Packet

    协议分析器,实现BeetleX.Clients.IClientPacket.

  • Token

    测试关联对象,可以根据业务制定相关对象数据状态属性。

参数

  • host

    主机地址

  • port

    服务端口

  • connectins

    并发测试的连接数

  • handler

    测试方法Func<BeetleX.Clients.AwaiterClient, Token, Task>,每次调用的测试逻辑。

构建TCP测试实例

    class Program
    {
        static void Main(string[] args)
        {
            var data = StringPacket.RamdomString(512);
            var runer = Benchmark.Tcp<StringPacket, Program>("192.168.2.19", 9090, 200,
                async (tcp, token) =>
                {
                    tcp.Send(data);
                    await tcp.Receive();
                }
            );
            runer.Run();
            runer.Print();
        }
    }

以上定义了一个基于StringPacket自定义协议测试,它是以4字节头大小来描述消息长的字符协议解释器。tcp.Send是向服务器发送一个消息,而await tcp.Receive则等待服务器响应。

测试结果

可以通过runer.Print()方法实时把结果输出控制台,信息里包括:正确,错误和相关网络并发情况,在最下面输出不同延时响应的百分比。

HTTP测试

组件通过Benchmark.Http方法来构建一个HTTP测压实例,方法如下:

public static Runner Http<Token>(Uri host, int connections, Func<IHttpHandler, Token, Task> handler)
    where Token : new()

方法带一个泛参

  • Token

    测试关联对象,可以根据业务制定相关对象数据状态属性。

参数

  • host

    测试的服务地址

  • connections

    并发测试的连接数

  • handler

    测试方法Func<IHttpHandler, Token, Task>,每次调用的测试逻辑。

IHttpHandler

提供了一些简单的http调用方法

Task Get(string url, Dictionary<string, string> queryString = null);

Task Get(string url, Dictionary<string, string> queryString, Dictionary<string, string> header = null);

Task Post(string url, Dictionary<string, string> queryString, Dictionary<string, string> heaer, Dictionary<string, string> data);

Task Post(string url, Dictionary<string, string> data);

Task PostJson(string url, Dictionary<string, string> queryString, Dictionary<string, string> heaer, object data);

Task PostJson(string url,object data);

构建HTTP测试实例

    class Program
    {
        static void Main(string[] args)
        {
            var runer = Benchmark.Http<Program>(new Uri("http://192.168.2.19:5000"), 100,
                async (http, token) =>
                {
                    await http.Get("/api/values");
                    await http.PostJson("/api/values", "beetlex.io");
                });
            runer.Run();
            runer.Print();
        }
    }

测试结果

websocket测试

组件通过Benchmark.Websocketxxx方法来构建一个websocket测压实例,方式有三种分别是DataFrame,TextJson,方法如下:

public static Runner Websocket<Token>(Uri host, int connections, Func<WSClient, Token, Task> handler)
        where Token : new()
public static Runner WebsocketText<Token>(Uri host, int connections, Func<TextClient, Token, Task> handler)
        where Token : new()
public static Runner WebsocketJson<Token>(Uri host, int connections, Func<JsonClient, Token, Task> handler)
        where Token : new()

构建Websocket测试实例

    class Program
    {
        static void Main(string[] args)
        {
            var runer = Benchmark.WebsocketJson<Program>(new Uri("ws://192.168.2.19:8080"), 100,
                async (ws, token) =>
                {
                    ws.TimeOut = 1000 * 5;
                    ws.Send(new { url = "/json" });
                    var result = await ws.Receive();
                });
            runer.Run();
            runer.Print();
        }
    }

测试结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用 Vert.x 4.0 编写 WebSocket 服务端的示例代码: ```java import io.vertx.core.AbstractVerticle; import io.vertx.core.http.HttpServer; import io.vertx.core.http.ServerWebSocket; public class WebSocketServer extends AbstractVerticle { @Override public void start() { HttpServer server = vertx.createHttpServer(); server.webSocketHandler(this::handleWebSocket).listen(8080); } private void handleWebSocket(ServerWebSocket socket) { if (socket.path().equals("/your/websocket/path")) { socket.accept(); socket.writeTextMessage("Hello, client!"); socket.textMessageHandler(message -> { System.out.println("Received message from client: " + message); socket.writeTextMessage("Server received your message: " + message); }); socket.closeHandler(close -> { System.out.println("WebSocket closed"); }); } else { socket.reject(); } } } ``` 在此示例代码中,我们首先创建了一个 `HttpServer` 对象,并在其上设置了 WebSocket 处理器 `this::handleWebSocket`,然后将其绑定到本地 8080 端口。 WebSocket 处理器的实现中,我们首先根据 WebSocket 的请求路径判断是否为我们需要处理的 WebSocket 连接,如果不是,则拒绝该连接。如果是,则接受该连接,并向客户端发送一条欢迎消息。 接着,我们设置了该 WebSocket 连接的消息处理器,当客户端发送消息时,会触发该处理器。在该处理器中,我们简单地将客户端发送的消息原样返回给客户端。 最后,我们设置了该 WebSocket 连接的关闭处理器,当客户端关闭连接时,会触发该处理器。 以上就是使用 Vert.x 4.0 编写 WebSocket 服务端的示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值