k6 grpc
k6 grpc(基于wsl2环境)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| package server
import ( "context" "fmt" "log" "net"
pb "golearn/grpc/helloworld"
"google.golang.org/grpc" "google.golang.org/grpc/reflection" )
const ( port = ":50051" )
type server struct { pb.UnimplementedGreeterServer }
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { log.Printf("Received: %v", in.GetName()) return &pb.HelloReply{Message: "返回给你: " + in.GetName()}, nil }
func Run() { lis, err := net.Listen("tcp", port) if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterGreeterServer(s, &server{})
reflection.Register(s)
fmt.Printf("Server listening at %v\n", lis.Addr()) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| //helloworld.proto syntax = "proto3"
package helloworld option go_package = "helloworld/helloworld" service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} }
message HelloRequest { string name = 1 }
message HelloReply { string message = 1 }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| const client = createClient(); client.load(['./grpc'], 'helloworld.proto'); function createClient() { return new grpc.Client(); }
export function client_test (message='none message'){ client.connect('192.168.31.179:50051',{plaintext: true, timeout: '5s' }); console.log("connect success") const data = {'name': message}; const response = client.invoke('helloworld.Greeter/SayHello', data);
check(response, { 'status is OK': (r) => r && r.status === grpc.StatusOK, });
console.log(JSON.stringify(response.message));
client.close(); sleep(1); };
|
一些注意
client和load是要在init中的,因此不能写在function或者setup/teardown中。避免在 VU 运行期间发生文件 I/O 操作,从而提高性能和稳定性
- 尝试将
client和load放在main中,尝试传参client又总是报错object,似乎未能正确识别
- 当模拟更多连接,似乎应该每个
VU一个连接;不过服务端通常会有连接池概念。
- AI说每个
VU多个迭代会共享一个连接池,但是我未证实,权且相信。需要进一步的监控测试才能确认。实际压测估计得调试调试。
- 本地机子太容易端口不够报错了,wsl2中用docker,几千都没啥问题。