• 使用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();
            }
        }

    测试结果

  • 相关阅读:
    浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
    fastjson自由:controller上指定active profile,让你想序列化什么字段就序列化什么字段
    Java多线程中join、yield、sleep方法详解
    一张图秒懂微服务网络架构
    详解SpringBoot应用跨域访问解决方案
    如何在 Spring/Spring Boot 中做参数校验?你需要了解的都在这里!
    史上最全的excel读写技术分享
    手把手教你定制标准Spring Boot starter,真的很清晰
    JVM性能调优详解
    Spring Boot 2.x监控数据可视化(Actuator + Prometheus + Grafana手把手)
  • 原文地址:https://www.cnblogs.com/smark/p/12268203.html
Copyright © 2020-2023  润新知