grpc:用ghz进行性能压测

简介:ghz是一个命令行实用程序和Go包,用于负载测试和基准测试gRPC服务。它旨在用于在本地测试和调试服务,以及在自动连续集成环境中进行性能回归测试。此外,命令行工具的核心实现为 Go 库包,也可用于以编程方式实现性能测试。

github地址:

https://github.com/bojand/ghz

帮助文档:https://ghz.sh/docs/intro.html

安装:

win:下载安装包并解压后配置环境变量。

安装包地址:选择一个最近的版本即可。

https://github.com/bojand/ghz/releases

mac:

brew install ghz

相关攻略:参考同期 grpc:go-quickstart

安装protobuf:

go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go

案例目录:

在这里插入图片描述
创建proto文件:

syntax = "proto3";
option go_package = "./pb";
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}


message HelloRequest {
  string name = 1;
}


message HelloReply {
  string message = 1;
}

使用 protoc 编译 proto 文件, 生成 go 语言的实现:

protoc -I . --go_out=plugins=grpc:. ./*.proto

业务逻辑:service/method.go,SayHello和SayHelloAgain必须都实现

package service

import (
  "context"
  "rpcGoPro/pb"
)

type Hello struct{}

func (hello *Hello) SayHello(ctx context.Context, pkg *pb.HelloRequest) (*pb.HelloReply, error) {
  return &pb.HelloReply{
    Message: pkg.Name + "..go hello...",
  }, nil
}

// 对应proto的 rpc方法。SayHello,SayHelloAgain。并且必须两个都实现
func (hello *Hello) SayHelloAgain(ctx context.Context, pkg *pb.HelloRequest) (*pb.HelloReply, error) {
  return &pb.HelloReply{
    Message: pkg.Name + "..go hello again...",
  }, nil
}

服务器端:server/server.go

package main

import (
  "google.golang.org/grpc"
  "log"
  "net"
  "rpcGoPro/pb"
  "rpcGoPro/service"
)

func main() {
  addr := "localhost:8889"                 // 服务地址
  listener, err := net.Listen("tcp", addr) // 监听地址
  if err != nil {
    log.Println("net listen err ", err)
    return
  }

  s := grpc.NewServer()                         // 初始化grpc服务
  pb.RegisterGreeterServer(s, &service.Hello{}) // 注册服务
  log.Println("start gRPC listen on address " + addr)
  if err := s.Serve(listener); err != nil { // 监听服务,如启动失败则抛出异常
    log.Println("failed to serve...", err)
    return
  }
}

客户端:client/client.go

package main

import (
  "context"
  "fmt"
  "google.golang.org/grpc"
  "log"
  "rpcGoPro/pb"
)

const (
  address = "localhost:8889"
)

func main() {
  conn, err := grpc.Dial(address, grpc.WithInsecure()) // 建立链接
  if err != nil {
    log.Println("did not connect.", err)
    return
  }
  defer conn.Close()

  client := pb.NewGreeterClient(conn) // 初始化客户端
  ctx := context.Background()         // 初始化元数据

  helloName := &pb.HelloRequest{Name: "Tom"} // 构造请求体

  info, err := client.SayHello(ctx, helloName)        // 调用helloInfo rpc服务,就像调用普通函数一样
  info2, err2 := client.SayHelloAgain(ctx, helloName) // 调用helloInfo rpc服务,就像调用普通函数一样

  if err != nil || err2 != nil {
    return
  }
  
  fmt.Println("hello 1 :", info.Message, "hello 2:", info2.Message)
}

命令行执行压测:

cd rpcPro目录
ghz --insecure --proto=./helloworld.proto --call=Greeter.SayHello -d "{\"name\":\"tom\"}" -c 10 -n 10000 127.0.0.1:8889

参数说明:

包名为helloworld、 service名为Greeter,方法名为 SayHello。

详细参数说明:https://ghz.sh/docs/options

执行结果:

图片

微信公众号:玩转测试开发
欢迎关注,共同进步,谢谢!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值